From: khizmax Date: Thu, 1 Dec 2016 19:35:00 +0000 (+0300) Subject: [TSan] Tuning memory order X-Git-Tag: v2.2.0~24 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=commitdiff_plain;h=3b8885686d7c4e249c7a1250c81c86b3af0a3a2d [TSan] Tuning memory order --- diff --git a/cds/compiler/feature_tsan.h b/cds/compiler/feature_tsan.h index 2f700c65..3f6e67ba 100644 --- a/cds/compiler/feature_tsan.h +++ b/cds/compiler/feature_tsan.h @@ -51,6 +51,7 @@ CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;\ CDS_TSAN_ANNOTATE_IGNORE_READS_END # define CDS_TSAN_ANNOTATE_NEW_MEMORY( addr, sz ) AnnotateNewMemory( __FILE__, __LINE__, reinterpret_cast(addr), sz ) +# define CDS_TSAN_ANNOTATE_PUBLISH_MEMORY_RANGE( addr, sz ) AnnotatePublishMemoryRange( __FILE__, __LINE__, reinterpret_cast(addr), sz ) # define CDS_TSAN_ANNOTATE_MUTEX_CREATE( addr ) AnnotateRWLockCreate( __FILE__, __LINE__, reinterpret_cast(addr)) # define CDS_TSAN_ANNOTATE_MUTEX_DESTROY( addr ) AnnotateRWLockDestroy( __FILE__, __LINE__, reinterpret_cast(addr)) @@ -69,7 +70,8 @@ void AnnotateIgnoreWritesBegin(const char *f, int l); void AnnotateIgnoreWritesEnd(const char *f, int l); - void AnnotateNewMemory( const char *f, int l, void * mem, size_t size); + void AnnotatePublishMemoryRange( const char *f, int l, void * mem, size_t size ) + void AnnotateNewMemory( const char *f, int l, void * mem, size_t size ); void AnnotateRWLockCreate( const char *f, int l, void* m ); void AnnotateRWLockDestroy( const char *f, int l, void* m ); @@ -89,6 +91,7 @@ # define CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN # define CDS_TSAN_ANNOTATE_IGNORE_RW_END +# define CDS_TSAN_ANNOTATE_PUBLISH_MEMORY_RANGE( addr, sz ) # define CDS_TSAN_ANNOTATE_NEW_MEMORY( addr, sz ) # define CDS_TSAN_ANNOTATE_MUTEX_CREATE( addr ) diff --git a/cds/memory/michael/allocator.h b/cds/memory/michael/allocator.h index 4ef0f6d8..cdb12a37 100644 --- a/cds/memory/michael/allocator.h +++ b/cds/memory/michael/allocator.h @@ -1703,7 +1703,7 @@ namespace michael { ); } - CDS_TSAN_ANNOTATE_NEW_MEMORY( pBlock + 1, nSize ); + CDS_TSAN_ANNOTATE_PUBLISH_MEMORY_RANGE( pBlock + 1, nSize ); return pBlock + 1; } diff --git a/cds/urcu/details/base.h b/cds/urcu/details/base.h index 84bf8fb8..21676d82 100644 --- a/cds/urcu/details/base.h +++ b/cds/urcu/details/base.h @@ -375,12 +375,12 @@ namespace cds { // No records available for reuse // Allocate and push a new record pRec = allocator_type().New( curThreadId ); - CDS_COMPILER_RW_BARRIER; thread_record * pOldHead = m_pHead.load( atomics::memory_order_acquire ); do { + // Compiler barriers: assignment MUST BE inside the loop + CDS_COMPILER_RW_BARRIER; pRec->m_list.m_pNext = pOldHead; - // Compiler barrier: assignment above MUST BE inside the loop CDS_COMPILER_RW_BARRIER; } while ( !m_pHead.compare_exchange_weak( pOldHead, pRec, atomics::memory_order_acq_rel, atomics::memory_order_acquire )); diff --git a/src/hp_gc.cpp b/src/hp_gc.cpp index 08043f42..15bd2b64 100644 --- a/src/hp_gc.cpp +++ b/src/hp_gc.cpp @@ -145,12 +145,12 @@ namespace cds { namespace gc { // No HP records available for reuse // Allocate and push a new HP record hprec = NewHPRec( curThreadId ); - CDS_COMPILER_RW_BARRIER; hplist_node * pOldHead = m_pListHead.load( atomics::memory_order_acquire ); do { + // Compiler barriers: assignment MUST BE inside the loop + CDS_COMPILER_RW_BARRIER; hprec->m_pNextNode = pOldHead; - // Compiler barrier: assignment above MUST BE inside the loop CDS_COMPILER_RW_BARRIER; } while ( !m_pListHead.compare_exchange_weak( pOldHead, hprec, atomics::memory_order_acq_rel, atomics::memory_order_acquire ));