hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
void PtrQueue::locking_enqueue_completed_buffer(void** buf) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(_lock->owned_by_self(), "Required.");
{- -------------------------------------------
(1) PtrQueueSet::enqueue_complete_buffer() を呼び出してバッファを enqueue する.
(なお, 呼び出しの直前にロックを開放し, 呼び出し後に再取得している.
これはロックが Shared_DirtyCardQ_lock の場合,
enqueue_complete_buffer() 内で取得される DirtyCardQ_CBL_mon と同ランクなので
デッドロックの恐れがあるため, とのこと.
ただし, 再取得の方については,
呼び出し元がロックを解放するだろうから (なぜならロックを取得して呼び出したんだから)
きちんと対応させてあげないといけない, というだけの理由らしい.)
(この処理のために一瞬他のスレッドが入ってこれる可能性があるが,
それについては PtrQueue::handle_zero_index() で対処している.
See: PtrQueue::handle_zero_index())
---------------------------------------- -}
// We have to unlock _lock (which may be Shared_DirtyCardQ_lock) before
// we acquire DirtyCardQ_CBL_mon inside enqeue_complete_buffer as they
// have the same rank and we may get the "possible deadlock" message
_lock->unlock();
qset()->enqueue_complete_buffer(buf);
// We must relock only because the caller will unlock, for the normal
// case.
_lock->lock_without_safepoint_check();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.