187 // If the condition has already been reached, there's no point in 188 // actually taking the lock and doing the wait. 189 if (g1h->old_marking_cycles_completed() <= 190 _old_marking_cycles_completed_before) { 191 // The following is largely copied from CMS 192 193 Thread* thr = Thread::current(); 194 assert(thr->is_Java_thread(), "invariant"); 195 JavaThread* jt = (JavaThread*)thr; 196 ThreadToNativeFromVM native(jt); 197 198 MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); 199 while (g1h->old_marking_cycles_completed() <= 200 _old_marking_cycles_completed_before) { 201 FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag); 202 } 203 } 204 } 205 } 206 207 void VM_CGC_Operation::acquire_pending_list_lock() { 208 _pending_list_locker.lock(); 209 } 210 211 void VM_CGC_Operation::release_and_notify_pending_list_lock() { 212 _pending_list_locker.unlock(); 213 } 214 215 void VM_CGC_Operation::doit() { 216 GCIdMark gc_id_mark(_gc_id); 217 GCTraceCPUTime tcpu; 218 G1CollectedHeap* g1h = G1CollectedHeap::heap(); 219 GCTraceTime(Info, gc) t(_printGCMessage, g1h->concurrent_mark()->gc_timer_cm(), GCCause::_no_gc, true); 220 IsGCActiveMark x; 221 _cl->do_void(); 222 } 223 224 bool VM_CGC_Operation::doit_prologue() { 225 // Note the relative order of the locks must match that in 226 // VM_GC_Operation::doit_prologue() or deadlocks can occur 227 if (_needs_pending_list_lock) { 228 acquire_pending_list_lock(); 229 } 230 Heap_lock->lock(); 231 return true; 232 } 233 234 void VM_CGC_Operation::doit_epilogue() { 235 // Note the relative order of the unlocks must match that in 236 // VM_GC_Operation::doit_epilogue() 237 Heap_lock->unlock(); 238 if (_needs_pending_list_lock) { 239 release_and_notify_pending_list_lock(); 240 } 241 } | 187 // If the condition has already been reached, there's no point in 188 // actually taking the lock and doing the wait. 189 if (g1h->old_marking_cycles_completed() <= 190 _old_marking_cycles_completed_before) { 191 // The following is largely copied from CMS 192 193 Thread* thr = Thread::current(); 194 assert(thr->is_Java_thread(), "invariant"); 195 JavaThread* jt = (JavaThread*)thr; 196 ThreadToNativeFromVM native(jt); 197 198 MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); 199 while (g1h->old_marking_cycles_completed() <= 200 _old_marking_cycles_completed_before) { 201 FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag); 202 } 203 } 204 } 205 } 206 207 void VM_CGC_Operation::doit() { 208 GCIdMark gc_id_mark(_gc_id); 209 GCTraceCPUTime tcpu; 210 G1CollectedHeap* g1h = G1CollectedHeap::heap(); 211 GCTraceTime(Info, gc) t(_printGCMessage, g1h->concurrent_mark()->gc_timer_cm(), GCCause::_no_gc, true); 212 IsGCActiveMark x; 213 _cl->do_void(); 214 } 215 216 bool VM_CGC_Operation::doit_prologue() { 217 Heap_lock->lock(); 218 return true; 219 } 220 221 void VM_CGC_Operation::doit_epilogue() { 222 if (Universe::has_reference_pending_list()) { 223 Heap_lock->notify_all(); 224 } 225 Heap_lock->unlock(); 226 } |