Top


定義場所(file name)

hotspot/src/os/solaris/vm/attachListener_solaris.cpp

説明(description)

// Dequeue an operation

名前(function name)

SolarisAttachOperation* SolarisAttachListener::dequeue() {

本体部(body)

  {- -------------------------------------------
  (1) (以下の for ループ内で, クライアントからのリクエストが届くまで待機し, 
      届いたリクエストをリターンする)
      ---------------------------------------- -}

      for (;;) {

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

        int res;

    {- -------------------------------------------
  (1.1) クライアントによる door 呼び出しが起こるまで待機.
        ---------------------------------------- -}

        // wait for somebody to enqueue something
        while ((res = ::sema_wait(wakeup())) == EINTR)
          ;
        if (res) {
          warning("sema_wait failed: %s", strerror(res));
          return NULL;
        }

    {- -------------------------------------------
  (1.1) SolarisAttachListener::head() および SolarisAttachListener::set_head() で, 
        受信済みリクエストの先頭のものを取得する.
        (なお, この処理は排他した状態で行う)
        ---------------------------------------- -}

        // lock the list
        res = os::Solaris::mutex_lock(mutex());
        assert(res == 0, "mutex_lock failed");

        // remove the head of the list
        SolarisAttachOperation* op = head();
        if (op != NULL) {
          set_head(op->next());
          if (head() == NULL) {
            set_tail(NULL);
          }
        }

        // unlock
        os::Solaris::mutex_unlock(mutex());

    {- -------------------------------------------
  (1.1) もしリクエストの取得に成功していれば, 結果をリターン.
        ---------------------------------------- -}

        // if we got an operation when return it.
        if (op != NULL) {
          return op;
        }
      }
    }

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