hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp
void GCTaskManager::add_list(GCTaskQueue* list) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(list != NULL, "shouldn't have null task");
{- -------------------------------------------
(1) (以下の処理は "GCTaskManager monitor" のロックを取った状態で行う)
---------------------------------------- -}
MutexLockerEx ml(monitor(), Mutex::_no_safepoint_check_flag);
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
if (TraceGCTaskManager) {
tty->print_cr("GCTaskManager::add_list(%u)", list->length());
}
{- -------------------------------------------
(1) キュー(GCTaskManager::_queue)に GCTask を詰める.
---------------------------------------- -}
queue()->enqueue(list);
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
// Notify with the lock held to avoid missed notifies.
if (TraceGCTaskManager) {
tty->print_cr(" GCTaskManager::add_list (%s)->notify_all",
monitor()->name());
}
{- -------------------------------------------
(1) キューに GCTask を追加したので, GCTaskManager::get_task() 等でブロックしているスレッドを起こすために
"GCTaskManager monitor" に対して notify_all() を呼んでおく.
---------------------------------------- -}
(void) monitor()->notify_all();
{- -------------------------------------------
(1) (MutexLockerEx で取得した "GCTaskManager monitor" のロックは, このブロックを抜けるときにアンロックされる)
---------------------------------------- -}
// Release monitor().
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.