diff --git a/src/kudu/gutil/threading/thread_collision_warner.cc b/src/kudu/gutil/threading/thread_collision_warner.cc index 6e0429fb46..405c695d6f 100644 --- a/src/kudu/gutil/threading/thread_collision_warner.cc +++ b/src/kudu/gutil/threading/thread_collision_warner.cc @@ -19,8 +19,9 @@ namespace base { -void DCheckAsserter::warn() { - LOG(FATAL) << "Thread Collision"; +void DCheckAsserter::warn(int64_t previous_thread_id, int64_t current_thread_id) { + LOG(FATAL) << "Thread Collision! Previous thread id: " << previous_thread_id + << ", current thread id: " << current_thread_id; } #if 0 @@ -57,13 +58,13 @@ void ThreadCollisionWarner::EnterSelf() { // write on valid_thread_id_ the current thread ID. subtle::Atomic64 current_thread_id = CurrentThread(); - int64_t previous_value = subtle::NoBarrier_CompareAndSwap(&valid_thread_id_, - 0, - current_thread_id); - if (previous_value != 0 && previous_value != current_thread_id) { + int64_t previous_thread_id = subtle::NoBarrier_CompareAndSwap(&valid_thread_id_, + 0, + current_thread_id); + if (previous_thread_id != 0 && previous_thread_id != current_thread_id) { // gotcha! a thread is trying to use the same class and that is // not current thread. - asserter_->warn(); + asserter_->warn(previous_thread_id, current_thread_id); } subtle::NoBarrier_AtomicIncrement(&counter_, 1); @@ -72,11 +73,12 @@ void ThreadCollisionWarner::EnterSelf() { void ThreadCollisionWarner::Enter() { subtle::Atomic64 current_thread_id = CurrentThread(); - if (subtle::NoBarrier_CompareAndSwap(&valid_thread_id_, - 0, - current_thread_id) != 0) { + int64_t previous_thread_id = subtle::NoBarrier_CompareAndSwap(&valid_thread_id_, + 0, + current_thread_id); + if (previous_thread_id != 0) { // gotcha! another thread is trying to use the same class. - asserter_->warn(); + asserter_->warn(previous_thread_id, current_thread_id); } subtle::NoBarrier_AtomicIncrement(&counter_, 1); diff --git a/src/kudu/gutil/threading/thread_collision_warner.h b/src/kudu/gutil/threading/thread_collision_warner.h index 75c771b3d6..9cad17fd58 100644 --- a/src/kudu/gutil/threading/thread_collision_warner.h +++ b/src/kudu/gutil/threading/thread_collision_warner.h @@ -5,10 +5,11 @@ #ifndef BASE_THREADING_THREAD_COLLISION_WARNER_H_ #define BASE_THREADING_THREAD_COLLISION_WARNER_H_ +#include + #include "kudu/gutil/atomicops.h" #include "kudu/gutil/macros.h" -#include "kudu/gutil/port.h" - + #ifndef BASE_EXPORT #define BASE_EXPORT #endif @@ -135,12 +136,12 @@ namespace base { // in case of collision (check thread_collision_warner_unittests.cc) struct BASE_EXPORT AsserterBase { virtual ~AsserterBase() {} - virtual void warn() = 0; + virtual void warn(int64_t previous_thread_id, int64_t current_thread_id) = 0; }; struct BASE_EXPORT DCheckAsserter : public AsserterBase { virtual ~DCheckAsserter() {} - virtual void warn() OVERRIDE; + void warn(int64_t previous_thread_id, int64_t current_thread_id) override; }; class BASE_EXPORT ThreadCollisionWarner {