Top


定義場所(file name)

hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp

名前(function name)

int JvmtiRawMonitor::SimpleExit (Thread * Self) {

本体部(body)

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

      guarantee (_owner == Self, "invariant") ;

  {- -------------------------------------------
  (1) _owner フィールドを NULL に書き換えて, ロックを解放する.
      (なお書き込みはメモリバリアを張りながら行う. この store の前後で順番が入れ替わるのは禁止)
      ---------------------------------------- -}

      OrderAccess::release_store_ptr (&_owner, NULL) ;
      OrderAccess::fence() ;

  {- -------------------------------------------
  (1) もし _EntryList も誰もいなければ, 何もすることはないので, ここでリターン.
      ---------------------------------------- -}

      if (_EntryList == NULL) return OS_OK ;

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      ObjectWaiter * w ;

  {- -------------------------------------------
  (1) RawMonitor_lock で排他した状態で, _EntryList から先頭要素を取り出す.
      ---------------------------------------- -}

      RawMonitor_lock->lock_without_safepoint_check() ;
      w = _EntryList ;
      if (w != NULL) {
          _EntryList = w->_next ;
      }
      RawMonitor_lock->unlock() ;

  {- -------------------------------------------
  (1) 取り出した先頭要素が NULL でなければ, 
      TState を ObjectWaiter::TS_RUN に変更し (てメモリバリアも張っ) た後, 
      os::PlatformEvent::unpark() で起床させる.
      ---------------------------------------- -}

      if (w != NULL) {
          guarantee (w ->TState == ObjectWaiter::TS_ENTER, "invariant") ;
          ParkEvent * ev = w->_event ;
          w->TState = ObjectWaiter::TS_RUN ;
          OrderAccess::fence() ;
          ev->unpark() ;
      }

  {- -------------------------------------------
  (1) リターン
      ---------------------------------------- -}

      return OS_OK ;
    }

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