Top


定義場所(file name)

hotspot/src/share/vm/runtime/vmThread.cpp

説明(description)

// Notify the VMThread that the last non-daemon JavaThread has terminated,
// and wait until operation is performed.

名前(function name)

void VMThread::wait_for_vm_thread_exit() {

本体部(body)

  {- -------------------------------------------
  (1) VMThread に対して, 処理を終了するように伝える.

      (_should_terminate の値を変更することで, 
       VMThread::should_terminate() が true を返すようになり, 
       VMThread の実行が終了する.

       See: VMThread::loop())
      ---------------------------------------- -}

      { MutexLocker mu(VMOperationQueue_lock);
        _should_terminate = true;
        VMOperationQueue_lock->notify();
      }

  {- -------------------------------------------
  (1) VMThread::is_terminated() が true を返すようになるまで, 以下の while ループ内で待機し続ける.
      (待機処理は, _terminate_lock に対して Monitor::wait() を呼ぶことで行う)
      (なお, VMThread::is_terminated() は, 
       VMThread の実行 (= VMThread::run() の実行) が終わる直前に true にされる.
       See: VMThread::run())


      (なお, VMThread は HotSpot を Safepoint 状態に持っていってから終了する.
       このスレッド自体は threads list から外れているので Safepoint で停止されたりはしない.
       ただし, この時点以降では (呼ぶとハングしてしまうので) Safepoint でブロックするような処理を呼んではいけない.)

      (なお, ここの処理では Terminator_lock を代わりに使っても問題ない.
       ただし, もう終了処理に入っていて, タイミング的にかなりデリケートなので, 
       他のスレッドと共有の恐れがあるロックを使うのはお勧めできない)
      ---------------------------------------- -}

      // Note: VM thread leaves at Safepoint. We are not stopped by Safepoint
      // because this thread has been removed from the threads list. But anything
      // that could get blocked by Safepoint should not be used after this point,
      // otherwise we will hang, since there is no one can end the safepoint.

      // Wait until VM thread is terminated
      // Note: it should be OK to use Terminator_lock here. But this is called
      // at a very delicate time (VM shutdown) and we are operating in non- VM
      // thread at Safepoint. It's safer to not share lock with other threads.
      { MutexLockerEx ml(_terminate_lock, Mutex::_no_safepoint_check_flag);
        while(!VMThread::is_terminated()) {
            _terminate_lock->wait(Mutex::_no_safepoint_check_flag);
        }
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.