Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp

名前(function name)

void PtrQueue::locking_enqueue_completed_buffer(void** buf) {

本体部(body)

  {- -------------------------------------------
  (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.