yarv-dev:768
From: SASADA Koichi <ko1 atdot.net>
Date: Thu, 05 Jan 2006 00:30:05 +0900
Subject: [yarv-dev:768] signal + blocking system call
ささだです。
今年もよろしくお願いします。
YARV では、シグナルをすべて遅延して実行させようと、今作り変えてるんで
すが、ブロックするようなシステムコールとシグナルの扱いは難しいですねえ。
(1/1 の日記に書いた話です)
Gauche を参考に見せていただいていたんですが、
// gauche.h より
#define SCM_SYSCALL3(result, expr, check) \
do { \ ... (*)
(result) = (expr); \
if ((check) && errno == EINTR) { \
ScmVM *vm__ = Scm_VM(); \
errno = 0; \
SCM_SIGCHECK(vm__); \
} else { \
break; \
} \
} while (1)
こんな感じで、システムコールの後にシグナルのチェックをしていますが、
(*) の段階でシグナルがきた場合(もちろん、出現頻度は低いとは思います
が)、(expr) で呼び出されるシステムコールはブロックしてしまい、最悪復帰
しない可能性があるような気がします。
これに関して、何か知見などはありますでしょうか。
それとも、そもそもシステムコールをブロックさせないようにする工夫が
(SCM_SYSCALL3 を利用する人に)あるんでしょうか。
(... とりあえず、SIGVTALRM などでブロック中の全スレッドにシグナルを投げ
てみるとか?)
--
// SASADA Koichi at atdot dot net
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
-> 768 2006-01-05 00:30 [ko1 atdot.net ] signal + blocking system call 769 2006-01-05 04:27 ┗[shiro lava.net ] 770 2006-01-05 08:29 ┗[ko1 atdot.net ] 771 2006-01-05 15:43 ┗[shiro lava.net ] 772 2006-01-06 18:14 ┗[ko1 atdot.net ]