sanitizer_deadlock_detector.h: Cherry pick upstream r224518 and r224519.
authorJakub Jelinek <jakub@redhat.com>
Tue, 13 Jan 2015 17:01:30 +0000 (18:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 13 Jan 2015 17:01:30 +0000 (18:01 +0100)
* sanitizer_common/sanitizer_deadlock_detector.h: Cherry pick
upstream r224518 and r224519.
* tsan/tsan_rtl_thread.cc: Cherry pick upstream r224702 and
r224834.

From-SVN: r219545

libsanitizer/ChangeLog
libsanitizer/sanitizer_common/sanitizer_deadlock_detector.h
libsanitizer/tsan/tsan_rtl_thread.cc

index 8b2eb82bbdeb1a9da1eef5e98d2ef8b985fcb266..ab22345b1131d67ce92952477478cfd57e58d2d6 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-13  Jakub Jelinek  <jakub@redhat.com>
+
+       * sanitizer_common/sanitizer_deadlock_detector.h: Cherry pick
+       upstream r224518 and r224519.
+       * tsan/tsan_rtl_thread.cc: Cherry pick upstream r224702 and
+       r224834.
+
 2014-12-16  Jakub Jelinek  <jakub@redhat.com>
 
        * sanitizer_common/sanitizer_symbolizer_libbacktrace.cc,
index 949c486a14acc6386649f6dc349b759d5f29686e..5c8317554ad56567fa8a58418db1ab885e084623 100644 (file)
@@ -48,6 +48,8 @@ class DeadlockDetectorTLS {
     if (epoch_ == current_epoch) return;
     bv_.clear();
     epoch_ = current_epoch;
+    n_recursive_locks = 0;
+    n_all_locks_ = 0;
   }
 
   uptr getEpoch() const { return epoch_; }
@@ -81,7 +83,8 @@ class DeadlockDetectorTLS {
       }
     }
     // Printf("remLock: %zx %zx\n", lock_id, epoch_);
-    CHECK(bv_.clearBit(lock_id));
+    if (!bv_.clearBit(lock_id))
+      return;  // probably addLock happened before flush
     if (n_all_locks_) {
       for (sptr i = n_all_locks_ - 1; i >= 0; i--) {
         if (all_locks_with_contexts_[i].lock == static_cast<u32>(lock_id)) {
@@ -173,6 +176,7 @@ class DeadlockDetector {
     recycled_nodes_.clear();
     available_nodes_.setAll();
     g_.clear();
+    n_edges_ = 0;
     return getAvailableNode(data);
   }
 
index 0c0acc2787f81f3f440a73f5c3d1d2ac46fb3e0c..d75445aa8bb7c2784cc253c763d4a977e711f459 100644 (file)
@@ -109,12 +109,13 @@ void ThreadContext::OnStarted(void *arg) {
     thr->dd_pt = ctx->dd->CreatePhysicalThread();
     thr->dd_lt = ctx->dd->CreateLogicalThread(unique_id);
   }
+  thr->fast_state.SetHistorySize(flags()->history_size);
+  // Commit switch to the new part of the trace.
+  // TraceAddEvent will reset stack0/mset0 in the new part for us.
+  TraceAddEvent(thr, thr->fast_state, EventTypeMop, 0);
+
   thr->fast_synch_epoch = epoch0;
   AcquireImpl(thr, 0, &sync);
-  thr->fast_state.SetHistorySize(flags()->history_size);
-  const uptr trace = (epoch0 / kTracePartSize) % TraceParts();
-  Trace *thr_trace = ThreadTrace(thr->tid);
-  thr_trace->headers[trace].epoch0 = epoch0;
   StatInc(thr, StatSyncAcquire);
   sync.Reset(&thr->clock_cache);
   DPrintf("#%d: ThreadStart epoch=%zu stk_addr=%zx stk_size=%zx "