assert( pRec );
// this function is called under FC mutex, so switch TSan off
+ // All TSan warnings are false positive
CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
switch ( pRec->op() ) {
void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
{
// this function is called under FC mutex, so switch TSan off
+ // All TSan warnings are false positive
CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
typedef typename fc_kernel::iterator fc_iterator;
atomic_node_ptr m_pNext ; ///< Pointer to next node
atomic_node_ptr m_pPrev ; ///< Pointer to previous node
- node() CDS_NOEXCEPT
- {
- m_pNext.store( nullptr, atomics::memory_order_release );
- m_pPrev.store( nullptr, atomics::memory_order_release );
- }
+ CDS_CONSTEXPR node() CDS_NOEXCEPT
+ : m_pNext( nullptr )
+ , m_pPrev( nullptr )
+ {}
};
//@cond
for ( typename Queue::value_type * p = m_pStart; p < m_pEnd; ) {
p->nNo = i;
p->nWriterNo = m_nThreadNo;
+ CDS_TSAN_ANNOTATE_HAPPENS_BEFORE( &p->nWriterNo );
if ( m_Queue.push( *p )) {
++p;
++i;
if ( p ) {
p->nConsumer = m_nThreadNo;
++m_nPopped;
+ CDS_TSAN_ANNOTATE_HAPPENS_AFTER( &p->nWriterNo );
if ( p->nWriterNo < nTotalWriters )
m_WriterData[ p->nWriterNo ].push_back( p->nNo );
else
# uRCU false positive
race:cds::urcu::gc*::batch_retire*
+
+race:cds::container::OptimisticQueue*::alloc_node