581 if (event.should_commit()) {
582 post_safepoint_end_event(&event);
583 }
584 }
585
586 bool SafepointSynchronize::is_cleanup_needed() {
587 // Need a safepoint if there are many monitors to deflate.
588 if (ObjectSynchronizer::is_cleanup_needed()) return true;
589 // Need a safepoint if some inline cache buffers is non-empty
590 if (!InlineCacheBuffer::is_empty()) return true;
591 return false;
592 }
593
594 class ParallelSPCleanupThreadClosure : public ThreadClosure {
595 private:
596 CodeBlobClosure* _nmethod_cl;
597 DeflateMonitorCounters* _counters;
598
599 public:
600 ParallelSPCleanupThreadClosure(DeflateMonitorCounters* counters) :
601 _nmethod_cl(NMethodSweeper::prepare_mark_active_nmethods()), _counters(counters) {}
602
603 void do_thread(Thread* thread) {
604 ObjectSynchronizer::deflate_thread_local_monitors(thread, _counters);
605 if (_nmethod_cl != NULL && thread->is_Java_thread() &&
606 ! thread->is_Code_cache_sweeper_thread()) {
607 JavaThread* jt = (JavaThread*) thread;
608 jt->nmethods_do(_nmethod_cl);
609 }
610 }
611 };
612
613 class ParallelSPCleanupTask : public AbstractGangTask {
614 private:
615 SubTasksDone _subtasks;
616 ParallelSPCleanupThreadClosure _cleanup_threads_cl;
617 uint _num_workers;
618 DeflateMonitorCounters* _counters;
619 public:
620 ParallelSPCleanupTask(uint num_workers, DeflateMonitorCounters* counters) :
621 AbstractGangTask("Parallel Safepoint Cleanup"),
|
581 if (event.should_commit()) {
582 post_safepoint_end_event(&event);
583 }
584 }
585
586 bool SafepointSynchronize::is_cleanup_needed() {
587 // Need a safepoint if there are many monitors to deflate.
588 if (ObjectSynchronizer::is_cleanup_needed()) return true;
589 // Need a safepoint if some inline cache buffers is non-empty
590 if (!InlineCacheBuffer::is_empty()) return true;
591 return false;
592 }
593
594 class ParallelSPCleanupThreadClosure : public ThreadClosure {
595 private:
596 CodeBlobClosure* _nmethod_cl;
597 DeflateMonitorCounters* _counters;
598
599 public:
600 ParallelSPCleanupThreadClosure(DeflateMonitorCounters* counters) :
601 _nmethod_cl(ThreadLocalHandshakes ? NULL : NMethodSweeper::prepare_mark_active_nmethods()),
602 _counters(counters) {}
603
604 void do_thread(Thread* thread) {
605 ObjectSynchronizer::deflate_thread_local_monitors(thread, _counters);
606 if (_nmethod_cl != NULL && thread->is_Java_thread() &&
607 ! thread->is_Code_cache_sweeper_thread()) {
608 JavaThread* jt = (JavaThread*) thread;
609 jt->nmethods_do(_nmethod_cl);
610 }
611 }
612 };
613
614 class ParallelSPCleanupTask : public AbstractGangTask {
615 private:
616 SubTasksDone _subtasks;
617 ParallelSPCleanupThreadClosure _cleanup_threads_cl;
618 uint _num_workers;
619 DeflateMonitorCounters* _counters;
620 public:
621 ParallelSPCleanupTask(uint num_workers, DeflateMonitorCounters* counters) :
622 AbstractGangTask("Parallel Safepoint Cleanup"),
|