diff --git a/DONT_MERGE b/DONT_MERGE new file mode 100644 index 00000000..e69de29b diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index fd90cf0e..c665a191 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -87,6 +87,15 @@ static void mmtk_resume_mutators(void *tls) { MutexLockerEx locker(MMTkHeap::heap()->gc_lock(), Mutex::_no_safepoint_check_flag); MMTkHeap::heap()->gc_lock()->notify_all(); } + + log_debug(gc)("Notifying mutators blocking on Heap_lock for reference pending list..."); + // Note: That's the ReferenceHandler thread. + { + MutexLockerEx x(Heap_lock, Mutex::_no_safepoint_check_flag); + if (Universe::has_reference_pending_list()) { + Heap_lock->notify_all(); + } + } } static const int GC_THREAD_KIND_WORKER = 1; @@ -293,6 +302,8 @@ static void mmtk_enqueue_references(void** objects, size_t len) { return; } + MutexLocker x(Heap_lock); + oop first = (oop) objects[0]; // This points to the first node of the linked list. oop last = first; // This points to the last node of the linked list. @@ -313,6 +324,7 @@ static void mmtk_enqueue_references(void** objects, size_t len) { oop old_first = Universe::swap_reference_pending_list(first); HeapAccess::oop_store_at(last, java_lang_ref_Reference::discovered_offset, old_first); + assert(Universe::has_reference_pending_list(), "Reference pending list is empty after swap"); } OpenJDK_Upcalls mmtk_upcalls = { diff --git a/openjdk/mmtkVMOperation.cpp b/openjdk/mmtkVMOperation.cpp index 7ba6053f..51227ee3 100644 --- a/openjdk/mmtkVMOperation.cpp +++ b/openjdk/mmtkVMOperation.cpp @@ -32,21 +32,8 @@ VM_MMTkSTWOperation::VM_MMTkSTWOperation(MMTkVMCompanionThread *companion_thread _companion_thread(companion_thread) { } -bool VM_MMTkSTWOperation::doit_prologue() { - Heap_lock->lock(); - return true; -} - void VM_MMTkSTWOperation::doit() { log_trace(vmthread)("Entered VM_MMTkSTWOperation::doit()."); _companion_thread->do_mmtk_stw_operation(); log_trace(vmthread)("Leaving VM_MMTkSTWOperation::doit()"); } - -void VM_MMTkSTWOperation::doit_epilogue() { - // Notify the reference processing thread - if (Universe::has_reference_pending_list()) { - Heap_lock->notify_all(); - } - Heap_lock->unlock(); -} diff --git a/openjdk/mmtkVMOperation.hpp b/openjdk/mmtkVMOperation.hpp index 49897ce7..98d37ea4 100644 --- a/openjdk/mmtkVMOperation.hpp +++ b/openjdk/mmtkVMOperation.hpp @@ -39,9 +39,7 @@ class VM_MMTkSTWOperation : public VM_MMTkOperation { public: VM_MMTkSTWOperation(MMTkVMCompanionThread *companion_thread); - virtual bool doit_prologue() override; virtual void doit() override; - virtual void doit_epilogue() override; }; #endif // MMTK_OPENJDK_MMTK_VM_OPERATION_HPP