[前][次][番号順一覧][スレッド一覧][生データ]

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       ]