diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-12-22 09:47:36 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-01-06 23:21:15 +0100 |
commit | fc3f722ae22b63ea9484a63ad1aa432490290258 (patch) | |
tree | 3f5195b0e29396b54eaac8bb643d3eea98b0661f /vespamalloc | |
parent | 56b220ba1cf20f0ccb443ee684239622b3f6376b (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.cpp | 2 | ||||
-rw-r--r-- | vespamalloc/src/tests/test1/CMakeLists.txt | 1 | ||||
-rw-r--r-- | vespamalloc/src/tests/test1/testatomic.cpp | 26 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/allocchunk.cpp | 36 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/allocchunk.h | 38 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/globalpool.hpp | 2 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/memorywatcher.h | 1 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/mmap.cpp | 7 |
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); } |