hotspot/src/os/solaris/vm/attachListener_solaris.cpp
// Dequeue an operation
SolarisAttachOperation* SolarisAttachListener::dequeue() {
{- -------------------------------------------
(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.