< prev index next >

src/hotspot/share/classfile/systemDictionary.cpp

Print this page
@@ -536,14 +536,21 @@
    bool calledholdinglock
        = ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, lockObject);
    assert(calledholdinglock,"must hold lock for notify");
    assert((lockObject() != _system_loader_lock_obj && !is_parallelCapable(lockObject)), "unexpected double_lock_wait");
    ObjectSynchronizer::notifyall(lockObject, THREAD);
+ 
+   TSAN_ONLY(int tsan_rec = 0;)
+   TSAN_RUNTIME_ONLY(
+     tsan_rec = SharedRuntime::tsan_oop_rec_unlock(THREAD, lockObject());
+     assert(tsan_rec > 0, "tsan: unlocking unlocked mutex");
+   );
    intx recursions =  ObjectSynchronizer::complete_exit(lockObject, THREAD);
    SystemDictionary_lock->wait();
    SystemDictionary_lock->unlock();
    ObjectSynchronizer::reenter(lockObject, recursions, THREAD);
+   TSAN_RUNTIME_ONLY(SharedRuntime::tsan_oop_rec_lock(THREAD, lockObject(), tsan_rec));
    SystemDictionary_lock->lock();
  }
  
  // If the class in is in the placeholder table, class loading is in progress
  // For cases where the application changes threads to load classes, it
< prev index next >