[TSan] Fixed data race in std container wrappers
authorkhizmax <khizmax@gmail.com>
Sat, 22 Jul 2017 10:00:18 +0000 (13:00 +0300)
committerkhizmax <khizmax@gmail.com>
Sat, 22 Jul 2017 10:00:18 +0000 (13:00 +0300)
test/stress/pqueue/pqueue_type.h
test/stress/queue/std_queue.h

index 66188da85de617924ec7a70537aae66511c4e3f2..2861064389e71e5c15d2cbf7a6deeb0b21b3d9db 100644 (file)
@@ -130,11 +130,13 @@ namespace pqueue {
 
             bool empty() const
             {
+                scoped_lock l( m_Lock );
                 return m_PQueue.empty();
             }
 
             size_t size() const
             {
+                scoped_lock l( m_Lock );
                 return m_PQueue.size();
             }
 
index d943169d38a78086bb5dcd4df5d55b57b5ee0ad1..f585583c10a2731eb263e601a0d89bea3b418ce9 100644 (file)
 namespace queue {
 
     template <typename T, class Container, class Lock = cds::sync::spin >
-    class StdQueue: public std::queue<T, Container >
+    class StdQueue: private std::queue<T, Container >
     {
         typedef std::queue<T, Container >   base_class;
-        Lock    m_Locker;
+        mutable Lock m_Locker;
 
     public:
         bool enqueue( const T& data )
@@ -52,7 +52,12 @@ namespace queue {
             base_class::push( data );
             return true;
         }
-        bool push( const T& data )  { return enqueue( data ) ; }
+
+        bool push( const T& data )
+        { 
+            return enqueue( data );
+        }
+
         bool dequeue( T& data )
         {
             std::unique_lock<Lock> a(m_Locker);
@@ -63,7 +68,23 @@ namespace queue {
             base_class::pop();
             return true;
         }
-        bool pop( T& data )         { return dequeue( data ) ; }
+
+        bool pop( T& data )
+        { 
+            return dequeue( data );
+        }
+
+        bool empty() const
+        {
+            std::unique_lock<Lock> a( m_Locker );
+            return base_class::empty();
+        }
+
+        size_t size() const
+        {
+            std::unique_lock<Lock> a( m_Locker );
+            return base_class::size();
+        }
 
         cds::opt::none statistics() const
         {