Top


定義場所(file name)

hotspot/src/os/linux/vm/os_linux.cpp

名前(function name)

void Parker::unpark() {

本体部(body)

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

      int s, status ;

  {- -------------------------------------------
  (1) _counter の値を 1 に変更する.
      (なお, この変更処理は pthread_mutex_lock() で _mutex を取得して排他した状態で行う)

      もし, 変更前の _counter の値が 0 であれば, 
      (park() で寝ているスレッドがいるということなので)
      pthread_cond_signal() でスレッドの起床処理を行う.
      (なお, WorkAroundNPTLTimedWaitHang オプションが指定されている場合は, 
       中途半端な cond_var を見てしまわないよう, 
       pthread_cond_signal() の呼び出しについても critical section 内で行う.)
      ---------------------------------------- -}

      status = pthread_mutex_lock(_mutex);
      assert (status == 0, "invariant") ;
      s = _counter;
      _counter = 1;
      if (s < 1) {
         if (WorkAroundNPTLTimedWaitHang) {
            status = pthread_cond_signal (_cond) ;
            assert (status == 0, "invariant") ;
            status = pthread_mutex_unlock(_mutex);
            assert (status == 0, "invariant") ;
         } else {
            status = pthread_mutex_unlock(_mutex);
            assert (status == 0, "invariant") ;
            status = pthread_cond_signal (_cond) ;
            assert (status == 0, "invariant") ;
         }
      } else {
        pthread_mutex_unlock(_mutex);
        assert (status == 0, "invariant") ;
      }
    }

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