Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.cpp

名前(function name)

void SuspendibleThreadSet::yield(const char* id) {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(_initialized, "Must be initialized.");

  {- -------------------------------------------
  (1) _async_stop が false になるまで待機する.
      (待機処理は, コンストラクタ引数で指定された Monitor(_m) に対して Monitor::wait() を呼ぶことで行う)

      (また, 待機処理の前後で _async_stopped フィールドを増減させている. 
       この値は, 全員が待機したかどうかを知るために SuspendibleThreadSet::suspend_all() 内で参照されている.)
      ---------------------------------------- -}

      if (_async_stop) {
        MutexLockerEx x(_m, Mutex::_no_safepoint_check_flag);
        if (_async_stop) {
          _async_stopped++;
          assert(_async_stopped > 0, "Huh.");
          if (_async_stopped == _async) {
            if (ConcGCYieldTimeout > 0) {
              double now = os::elapsedTime();
              guarantee((now - _suspend_all_start) * 1000.0 <
                        (double)ConcGCYieldTimeout,
                        "Long delay; whodunit?");
            }
          }
          _m->notify_all();
          while (_async_stop) _m->wait(Mutex::_no_safepoint_check_flag);
          _async_stopped--;
          assert(_async >= 0, "Huh");
          _m->notify_all();
        }
      }
    }

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