comparison src/share/vm/compiler/compileBroker.cpp @ 20465:7301840ea20e

8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock Reviewed-by: kvn, iveresov
author vlivanov
date Tue, 11 Mar 2014 15:06:34 +0400
parents f73af4455d7d
children dd89808e49ba
comparison
equal deleted inserted replaced
20464:b2029969cc16 20465:7301840ea20e
686 686
687 if (CompileBroker::is_compilation_disabled_forever()) { 687 if (CompileBroker::is_compilation_disabled_forever()) {
688 return NULL; 688 return NULL;
689 } 689 }
690 690
691 CompileTask* task = CompilationPolicy::policy()->select_task(this); 691 CompileTask* task;
692 {
693 No_Safepoint_Verifier nsv;
694 task = CompilationPolicy::policy()->select_task(this);
695 }
692 remove(task); 696 remove(task);
697 purge_stale_tasks(); // may temporarily release MCQ lock
693 return task; 698 return task;
694 } 699 }
695 700
696 void CompileQueue::remove(CompileTask* task) 701 // Clean & deallocate stale compile tasks.
697 { 702 // Temporarily releases MethodCompileQueue lock.
703 void CompileQueue::purge_stale_tasks() {
704 assert(lock()->owned_by_self(), "must own lock");
705 if (_first_stale != NULL) {
706 // Stale tasks are purged when MCQ lock is released,
707 // but _first_stale updates are protected by MCQ lock.
708 // Once task processing starts and MCQ lock is released,
709 // other compiler threads can reuse _first_stale.
710 CompileTask* head = _first_stale;
711 _first_stale = NULL;
712 {
713 MutexUnlocker ul(lock());
714 for (CompileTask* task = head; task != NULL; ) {
715 CompileTask* next_task = task->next();
716 CompileTaskWrapper ctw(task); // Frees the task
717 task = next_task;
718 }
719 }
720 }
721 }
722
723 void CompileQueue::remove(CompileTask* task) {
698 assert(lock()->owned_by_self(), "must own lock"); 724 assert(lock()->owned_by_self(), "must own lock");
699 if (task->prev() != NULL) { 725 if (task->prev() != NULL) {
700 task->prev()->set_next(task->next()); 726 task->prev()->set_next(task->next());
701 } else { 727 } else {
702 // max is the first element 728 // max is the first element
710 // max is the last element 736 // max is the last element
711 assert(task == _last, "Sanity"); 737 assert(task == _last, "Sanity");
712 _last = task->prev(); 738 _last = task->prev();
713 } 739 }
714 --_size; 740 --_size;
741 }
742
743 void CompileQueue::remove_and_mark_stale(CompileTask* task) {
744 assert(lock()->owned_by_self(), "must own lock");
745 remove(task);
746
747 // Enqueue the task for reclamation (should be done outside MCQ lock)
748 task->set_next(_first_stale);
749 task->set_prev(NULL);
750 _first_stale = task;
715 } 751 }
716 752
717 // methods in the compile queue need to be marked as used on the stack 753 // methods in the compile queue need to be marked as used on the stack
718 // so that they don't get reclaimed by Redefine Classes 754 // so that they don't get reclaimed by Redefine Classes
719 void CompileQueue::mark_on_stack() { 755 void CompileQueue::mark_on_stack() {
2009 break; 2045 break;
2010 } 2046 }
2011 2047
2012 // Note that the queued_for_compilation bits are cleared without 2048 // Note that the queued_for_compilation bits are cleared without
2013 // protection of a mutex. [They were set by the requester thread, 2049 // protection of a mutex. [They were set by the requester thread,
2014 // when adding the task to the complie queue -- at which time the 2050 // when adding the task to the compile queue -- at which time the
2015 // compile queue lock was held. Subsequently, we acquired the compile 2051 // compile queue lock was held. Subsequently, we acquired the compile
2016 // queue lock to get this task off the compile queue; thus (to belabour 2052 // queue lock to get this task off the compile queue; thus (to belabour
2017 // the point somewhat) our clearing of the bits must be occurring 2053 // the point somewhat) our clearing of the bits must be occurring
2018 // only after the setting of the bits. See also 14012000 above. 2054 // only after the setting of the bits. See also 14012000 above.
2019 method->clear_queued_for_compilation(); 2055 method->clear_queued_for_compilation();