hotspot/src/os/solaris/vm/os_solaris.inline.hpp
// macros for interruptible io and system calls and system call restarting
#define _INTERRUPTIBLE(_setup, _cmd, _result, _thread, _clear, _before, _after, _int_enable) \
{- -------------------------------------------
(1) まず _setup と _before を実行する.
次に以下のどれかを行う.
* _int_enable が false だったり, _thread->has_last_Java_frame() が false なら
単に _cmd を実行する.
* そうではなく, もしこの時点で os::interupted() が true だったら
_result に OS_INTRPT をセットするだけ.
* 上記のいずれでもなければ
_cmd を実行する.
もしエラーが起こった場合には (返値が負値 && errno が EINTR && os::interupted() が true の場合には),
_result に OS_INTRPT をセットする.
最後に _after を実行して終了.
---------------------------------------- -}
do { \
_setup; \
_before; \
OSThread* _osthread = _thread->osthread(); \
if (_int_enable && _thread->has_last_Java_frame()) { \
/* this is java interruptible io stuff */ \
if (os::is_interrupted(_thread, _clear)) { \
os::Solaris::bump_interrupted_before_count(); \
_result = OS_INTRPT; \
} else { \
/* _cmd always expands to an assignment to _result */ \
if ((_cmd) < 0 && errno == EINTR \
&& os::is_interrupted(_thread, _clear)) { \
os::Solaris::bump_interrupted_during_count(); \
_result = OS_INTRPT; \
} \
} \
} else { \
/* this is normal blocking io stuff */ \
_cmd; \
} \
_after; \
} while(false)
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.