projects
/
libcds.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
6d378df
)
Suppressed TSan false positive warnings
author
khizmax
<libcds.dev@gmail.com>
Sun, 28 Jun 2015 16:34:08 +0000
(19:34 +0300)
committer
khizmax
<libcds.dev@gmail.com>
Sun, 28 Jun 2015 16:34:08 +0000
(19:34 +0300)
cds/intrusive/fcqueue.h
patch
|
blob
|
history
cds/intrusive/optimistic_queue.h
patch
|
blob
|
history
tests/unit/queue/intrusive_queue_reader_writer.cpp
patch
|
blob
|
history
tools/tsan-suppression
patch
|
blob
|
history
diff --git
a/cds/intrusive/fcqueue.h
b/cds/intrusive/fcqueue.h
index 630b2ae3a89e2d10a59469f9907ed8ee50cba127..bde6908334dd43d693ff2f738d563f08fd2b36b4 100644
(file)
--- a/
cds/intrusive/fcqueue.h
+++ b/
cds/intrusive/fcqueue.h
@@
-261,6
+261,7
@@
namespace cds { namespace intrusive {
assert( pRec );
// this function is called under FC mutex, so switch TSan off
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() ) {
CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
switch ( pRec->op() ) {
@@
-292,6
+293,7
@@
namespace cds { namespace intrusive {
void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
{
// this function is called under FC mutex, so switch TSan off
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;
CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN;
typedef typename fc_kernel::iterator fc_iterator;
diff --git
a/cds/intrusive/optimistic_queue.h
b/cds/intrusive/optimistic_queue.h
index aba66db3abe21f52669c407e832ee58ae960a647..5277c4c056e5ebb67c2521512c75576d8d8dae15 100644
(file)
--- a/
cds/intrusive/optimistic_queue.h
+++ b/
cds/intrusive/optimistic_queue.h
@@
-32,11
+32,10
@@
namespace cds { namespace intrusive {
atomic_node_ptr m_pNext ; ///< Pointer to next node
atomic_node_ptr m_pPrev ; ///< Pointer to previous node
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
};
//@cond
diff --git
a/tests/unit/queue/intrusive_queue_reader_writer.cpp
b/tests/unit/queue/intrusive_queue_reader_writer.cpp
index b5ad38c48f5e01b86e3f1dca14ad25c5f3ac1438..f927113f75b04a30a3da859b4c43b2a551610821 100644
(file)
--- a/
tests/unit/queue/intrusive_queue_reader_writer.cpp
+++ b/
tests/unit/queue/intrusive_queue_reader_writer.cpp
@@
-85,6
+85,7
@@
namespace queue {
for ( typename Queue::value_type * p = m_pStart; p < m_pEnd; ) {
p->nNo = i;
p->nWriterNo = m_nThreadNo;
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 ( m_Queue.push( *p )) {
++p;
++i;
@@
-170,6
+171,7
@@
namespace queue {
if ( p ) {
p->nConsumer = m_nThreadNo;
++m_nPopped;
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
if ( p->nWriterNo < nTotalWriters )
m_WriterData[ p->nWriterNo ].push_back( p->nNo );
else
diff --git
a/tools/tsan-suppression
b/tools/tsan-suppression
index 9f5e15653e6c8fac6e1e7643630efbc0d987fcad..f46e16d8698fe7f532e77c7f426924514875d414 100644
(file)
--- a/
tools/tsan-suppression
+++ b/
tools/tsan-suppression
@@
-6,3
+6,5
@@
race:cds::gc::details::retired_ptr::free
# uRCU false positive
race:cds::urcu::gc*::batch_retire*
# uRCU false positive
race:cds::urcu::gc*::batch_retire*
+
+race:cds::container::OptimisticQueue*::alloc_node