< prev index next >
src/share/vm/runtime/synchronizer.cpp
Print this page
rev 13053 : 8180932: Parallelize safepoint cleanup
Summary: Provide infrastructure to do safepoint cleanup tasks using parallel worker threads
Reviewed-by: dholmes, rehn
*** 1693,1713 ****
// And in case the vm thread is acquiring a lock during a safepoint
// See e.g. 6320749
Thread::muxAcquire(&gListLock, "scavenge - return");
if (MonitorInUseLists) {
! int inUse = 0;
! for (JavaThread* cur = Threads::first(); cur != NULL; cur = cur->next()) {
! nInCirculation+= cur->omInUseCount;
! int deflated_count = deflate_monitor_list(cur->omInUseList_addr(), &freeHeadp, &freeTailp);
! cur->omInUseCount-= deflated_count;
! if (ObjectMonitor::Knob_VerifyInUse) {
! verifyInUse(cur);
! }
! nScavenged += deflated_count;
! nInuse += cur->omInUseCount;
! }
// For moribund threads, scan gOmInUseList
if (gOmInUseList) {
nInCirculation += gOmInUseCount;
int deflated_count = deflate_monitor_list((ObjectMonitor **)&gOmInUseList, &freeHeadp, &freeTailp);
--- 1693,1704 ----
// And in case the vm thread is acquiring a lock during a safepoint
// See e.g. 6320749
Thread::muxAcquire(&gListLock, "scavenge - return");
if (MonitorInUseLists) {
! // Note: the thread-local monitors lists get deflated in
! // a separate pass. See deflate_thread_local_monitors().
// For moribund threads, scan gOmInUseList
if (gOmInUseList) {
nInCirculation += gOmInUseCount;
int deflated_count = deflate_monitor_list((ObjectMonitor **)&gOmInUseList, &freeHeadp, &freeTailp);
*** 1778,1787 ****
--- 1769,1805 ----
// Audit/inventory the objectMonitors -- make sure they're all accounted for.
GVars.stwRandom = os::random();
GVars.stwCycle++;
}
+ void ObjectSynchronizer::deflate_thread_local_monitors(Thread* thread) {
+ assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+ if (! MonitorInUseLists) return;
+
+ ObjectMonitor * freeHeadp = NULL; // Local SLL of scavenged monitors
+ ObjectMonitor * freeTailp = NULL;
+
+ int deflated_count = deflate_monitor_list(thread->omInUseList_addr(), &freeHeadp, &freeTailp);
+ thread->omInUseCount-= deflated_count;
+ if (ObjectMonitor::Knob_VerifyInUse) {
+ verifyInUse(thread);
+ }
+
+ // Move the scavenged monitors back to the global free list.
+ if (freeHeadp != NULL) {
+ Thread::muxAcquire(&gListLock, "scavenge - return");
+ guarantee(freeTailp != NULL && deflated_count > 0, "invariant");
+ assert(freeTailp->FreeNext == NULL, "invariant");
+
+ gMonitorFreeCount += deflated_count;
+ // constant-time list splice - prepend scavenged segment to gFreeList
+ freeTailp->FreeNext = gFreeList;
+ gFreeList = freeHeadp;
+ Thread::muxRelease(&gListLock);
+ }
+ }
+
// Monitor cleanup on JavaThread::exit
// Iterate through monitor cache and attempt to release thread's monitors
// Gives up on a particular monitor if an exception occurs, but continues
// the overall iteration, swallowing the exception.
< prev index next >