aboutsummaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-12-22 09:47:36 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-01-06 23:21:15 +0100
commitfc3f722ae22b63ea9484a63ad1aa432490290258 (patch)
tree3f5195b0e29396b54eaac8bb643d3eea98b0661f /vespamalloc
parent56b220ba1cf20f0ccb443ee684239622b3f6376b (diff)
remove the indirection due to not all cpus supporting cmpXchg16 in 2007.
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/tests/allocfree/linklist.cpp2
-rw-r--r--vespamalloc/src/tests/test1/CMakeLists.txt1
-rw-r--r--vespamalloc/src/tests/test1/testatomic.cpp26
-rw-r--r--vespamalloc/src/vespamalloc/malloc/allocchunk.cpp36
-rw-r--r--vespamalloc/src/vespamalloc/malloc/allocchunk.h38
-rw-r--r--vespamalloc/src/vespamalloc/malloc/globalpool.hpp2
-rw-r--r--vespamalloc/src/vespamalloc/malloc/memorywatcher.h1
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmap.cpp7
8 files changed, 29 insertions, 84 deletions
diff --git a/vespamalloc/src/tests/allocfree/linklist.cpp b/vespamalloc/src/tests/allocfree/linklist.cpp
index 39cd237420b..5dabdca65d6 100644
--- a/vespamalloc/src/tests/allocfree/linklist.cpp
+++ b/vespamalloc/src/tests/allocfree/linklist.cpp
@@ -127,8 +127,6 @@ int Test::Main() {
FastOS_ThreadPool pool(128000);
List::HeadPtr sharedList;
sharedList._tag = 1;
- List::init();
- List::enableThreadSupport();
fprintf(stderr, "Start populating list\n");
for (size_t i=0; i < NumBlocks; i++) {
List * l(&globalList[i]);
diff --git a/vespamalloc/src/tests/test1/CMakeLists.txt b/vespamalloc/src/tests/test1/CMakeLists.txt
index 205de0f96fc..3120f1d39d0 100644
--- a/vespamalloc/src/tests/test1/CMakeLists.txt
+++ b/vespamalloc/src/tests/test1/CMakeLists.txt
@@ -3,5 +3,6 @@ vespa_add_executable(vespamalloc_testatomic_app TEST
SOURCES
testatomic.cpp
DEPENDS
+ atomic
)
vespa_add_test(NAME vespamalloc_testatomic_app NO_VALGRIND COMMAND vespamalloc_testatomic_app)
diff --git a/vespamalloc/src/tests/test1/testatomic.cpp b/vespamalloc/src/tests/test1/testatomic.cpp
index 1222493446c..8d72e560bf1 100644
--- a/vespamalloc/src/tests/test1/testatomic.cpp
+++ b/vespamalloc/src/tests/test1/testatomic.cpp
@@ -1,10 +1,8 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/fastos/fastos.h>
+#include <vespa/fastos/thread.h>
#include <vespa/vespalib/testkit/testapp.h>
#include <vespa/vespalib/util/atomic.h>
-#include <vector>
-
-using vespalib::Atomic;
+#include <vespamalloc/malloc/allocchunk.h>
class Test : public vespalib::TestApp
{
@@ -39,10 +37,10 @@ void Test::testSwap(T initial)
{
T value(initial);
- ASSERT_TRUE(Atomic::cmpSwap(&value, initial+1, initial));
+ ASSERT_TRUE(vespalib::Atomic::cmpSwap(&value, initial+1, initial));
ASSERT_TRUE(value == initial+1);
- ASSERT_TRUE(!Atomic::cmpSwap(&value, initial+2, initial));
+ ASSERT_TRUE(!vespalib::Atomic::cmpSwap(&value, initial+2, initial));
ASSERT_TRUE(value == initial+1);
}
@@ -91,7 +89,7 @@ template <typename T>
void Stress<T>::stressSwap(T & value)
{
for (T old = value; old > 0; old = value) {
- if (Atomic::cmpSwap(&value, old-1, old)) {
+ if (vespalib::Atomic::cmpSwap(&value, old-1, old)) {
_successCount++;
} else {
_failedCount++;
@@ -103,6 +101,20 @@ int Test::Main()
{
TEST_INIT("atomic");
+ {
+ std::atomic<uint32_t> uint32V;
+ ASSERT_TRUE(uint32V.is_lock_free());
+ }
+ {
+ std::atomic<uint64_t> uint64V;
+ ASSERT_TRUE(uint64V.is_lock_free());
+ }
+ {
+ std::atomic<vespamalloc::Atomic::TaggedPtr> taggedPtr;
+ ASSERT_EQUAL(16, sizeof(vespamalloc::Atomic::TaggedPtr));
+ ASSERT_TRUE(taggedPtr.is_lock_free());
+ }
+
testSwap<uint32_t>(6);
testSwap<uint32_t>(7);
testSwap<uint32_t>(uint32_t(-6));
diff --git a/vespamalloc/src/vespamalloc/malloc/allocchunk.cpp b/vespamalloc/src/vespamalloc/malloc/allocchunk.cpp
index 03165398423..f9cb104169a 100644
--- a/vespamalloc/src/vespamalloc/malloc/allocchunk.cpp
+++ b/vespamalloc/src/vespamalloc/malloc/allocchunk.cpp
@@ -3,16 +3,6 @@
namespace vespamalloc {
-char AFListBase::_atomicLinkSpace[sizeof(AFListBase::AtomicLink)];
-char AFListBase::_lockedLinkSpace[sizeof(AFListBase::LockedLink)];
-AFListBase::LinkI *AFListBase::_link = NULL;
-
-void AFListBase::init()
-{
- _link = new (_atomicLinkSpace)AtomicLink();
-}
-
-AFListBase::LinkI::~LinkI() { }
void AFListBase::linkInList(HeadPtr & head, AFListBase * list)
{
@@ -21,7 +11,7 @@ void AFListBase::linkInList(HeadPtr & head, AFListBase * list)
linkIn(head, list, tail);
}
-void AFListBase::AtomicLink::linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail)
+void AFListBase::linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail)
{
HeadPtr oldHead = head;
HeadPtr newHead(csl, oldHead._tag + 1);
@@ -33,29 +23,7 @@ void AFListBase::AtomicLink::linkIn(HeadPtr & head, AFListBase * csl, AFListBase
}
}
-void AFListBase::LockedLink::linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail)
-{
- Guard guard(_mutex);
- HeadPtr newHead(csl, head._tag + 1);
- tail->_next = static_cast<AFListBase *>(head._ptr);
- head = newHead;
-}
-
-AFListBase * AFListBase::LockedLink::linkOut(HeadPtr & head)
-{
- Guard guard(_mutex);
- HeadPtr oldHead = head;
- AFListBase *csl = static_cast<AFListBase *>(oldHead._ptr);
- if (csl == NULL) {
- return NULL;
- }
- HeadPtr newHead(csl->_next, oldHead._tag + 1);
- head = newHead;
- csl->_next = NULL;
- return csl;
-}
-
-AFListBase * AFListBase::AtomicLink::linkOut(HeadPtr & head)
+AFListBase * AFListBase::linkOut(HeadPtr & head)
{
HeadPtr oldHead = head;
AFListBase *csl = static_cast<AFListBase *>(oldHead._ptr);
diff --git a/vespamalloc/src/vespamalloc/malloc/allocchunk.h b/vespamalloc/src/vespamalloc/malloc/allocchunk.h
index 383459a897c..fb3defa64bb 100644
--- a/vespamalloc/src/vespamalloc/malloc/allocchunk.h
+++ b/vespamalloc/src/vespamalloc/malloc/allocchunk.h
@@ -24,9 +24,8 @@ public:
* Very early Amd K7/8 CPUs are lacking this and will fail (Illegal Instruction).
**/
struct TaggedPtr {
- TaggedPtr() : _ptr(nullptr), _tag(0) {}
-
- TaggedPtr(void *h, size_t t) : _ptr(h), _tag(t) {}
+ TaggedPtr() noexcept : _ptr(nullptr), _tag(0) { }
+ TaggedPtr(void *h, size_t t) noexcept : _ptr(h), _tag(t) {}
void *_ptr;
size_t _tag;
@@ -64,41 +63,12 @@ public:
AFListBase() : _next(NULL) { }
void setNext(AFListBase * csl) { _next = csl; }
static void init();
- static void enableThreadSupport() { _link->enableThreadSupport(); }
static void linkInList(HeadPtr & head, AFListBase * list);
- static void linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail) {
- _link->linkIn(head, csl, tail);
- }
+ static void linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail);
protected:
AFListBase * getNext() { return _next; }
- static AFListBase * linkOut(HeadPtr & head) { return _link->linkOut(head); }
+ static AFListBase * linkOut(HeadPtr & head);
private:
- class LinkI
- {
- public:
- virtual ~LinkI();
- virtual void enableThreadSupport() { }
- virtual void linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail) = 0;
- virtual AFListBase * linkOut(HeadPtr & head) = 0;
- };
- class AtomicLink : public LinkI
- {
- private:
- virtual void linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail);
- virtual AFListBase * linkOut(HeadPtr & head);
- };
- class LockedLink : public LinkI
- {
- public:
- virtual void enableThreadSupport() { _mutex.init(); }
- private:
- virtual void linkIn(HeadPtr & head, AFListBase * csl, AFListBase * tail);
- virtual AFListBase * linkOut(HeadPtr & head);
- Mutex _mutex;
- };
- static char _atomicLinkSpace[sizeof(AtomicLink)];
- static char _lockedLinkSpace[sizeof(LockedLink)];
- static LinkI *_link;
AFListBase *_next;
};
diff --git a/vespamalloc/src/vespamalloc/malloc/globalpool.hpp b/vespamalloc/src/vespamalloc/malloc/globalpool.hpp
index c2893817ab7..153fd131f66 100644
--- a/vespamalloc/src/vespamalloc/malloc/globalpool.hpp
+++ b/vespamalloc/src/vespamalloc/malloc/globalpool.hpp
@@ -20,7 +20,6 @@ AllocPoolT<MemBlockPtrT>::AllocPoolT(DataSegment<MemBlockPtrT> & ds)
_getChunksSum(0),
_allocChunkList(0)
{
- ChunkSList::init();
memset(_scList, 0, sizeof(_scList));
}
@@ -32,7 +31,6 @@ AllocPoolT<MemBlockPtrT>::~AllocPoolT()
template <typename MemBlockPtrT>
void AllocPoolT<MemBlockPtrT>::enableThreadSupport()
{
- ChunkSList::enableThreadSupport();
_mutex.init();
}
diff --git a/vespamalloc/src/vespamalloc/malloc/memorywatcher.h b/vespamalloc/src/vespamalloc/malloc/memorywatcher.h
index 9bbfa38c416..aceef34ed09 100644
--- a/vespamalloc/src/vespamalloc/malloc/memorywatcher.h
+++ b/vespamalloc/src/vespamalloc/malloc/memorywatcher.h
@@ -7,7 +7,6 @@
#include <sys/stat.h>
#include <ctype.h>
#include <fcntl.h>
-#include <vespa/defaults.h>
#include <vespamalloc/malloc/malloc.h>
#include <vespamalloc/util/callstack.h>
diff --git a/vespamalloc/src/vespamalloc/malloc/mmap.cpp b/vespamalloc/src/vespamalloc/malloc/mmap.cpp
index 6da13d9ac92..22a2b8fffce 100644
--- a/vespamalloc/src/vespamalloc/malloc/mmap.cpp
+++ b/vespamalloc/src/vespamalloc/malloc/mmap.cpp
@@ -4,7 +4,6 @@
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
-#include <vespa/vespalib/util/backtrace.h>
extern "C" {
@@ -57,7 +56,7 @@ void * local_mmap(void *addr, size_t length, int prot, int flags, int fd, off_t
}
}
if ((length >= getLogLimit()) && !isFromVespaMalloc(addr)) {
- fprintf (stderr, "mmap requesting block of size %ld from %s\n", length, vespalib::getStackTrace(0).c_str());
+ fprintf (stderr, "mmap requesting block of size %ld from %s\n", length, "no backtrace");
}
return (*real_func)(addr, length, prot, flags, fd, offset);
}
@@ -73,7 +72,7 @@ void * local_mmap64(void *addr, size_t length, int prot, int flags, int fd, off6
}
}
if (length >= getLogLimit() && !isFromVespaMalloc(addr)) {
- fprintf (stderr, "mmap requesting block of size %ld from %s\n", length, vespalib::getStackTrace(0).c_str());
+ fprintf (stderr, "mmap requesting block of size %ld from %s\n", length, "no backtrace");
}
return (*real_func)(addr, length, prot, flags, fd, offset);
}
@@ -89,7 +88,7 @@ int local_munmap(void *addr, size_t length)
}
}
if ((length >= getLogLimit()) && !isFromVespaMalloc(addr)) {
- fprintf (stderr, "munmap releasing block of size %ld from %s\n", length, vespalib::getStackTrace(0).c_str());
+ fprintf (stderr, "munmap releasing block of size %ld from %s\n", length, "no backtrace");
}
return (*real_func)(addr, length);
}