[#45906] ' failures. — Tanaka Akira <akr@...>
' の扱いが変化したことで、テストが失敗しているようです。
9 messages
2012/07/04
[#45910] [ruby-trunk - Bug #6694][Open] Thread.new without block. — "ko1 (Koichi Sasada)" <redmine@...>
24 messages
2012/07/04
[#45928] Re: [ruby-cvs:43524] kosaki:r36348 (trunk): * include/ruby/ruby.h: Removed RUBY_GLOBAL_SETUP complely. It is — SASADA Koichi <ko1@...>
ささだです.
3 messages
2012/07/09
[#45973] [ruby-trunk - Bug #6751][Assigned] remove tempfiles early. — "akr (Akira Tanaka)" <akr@...>
4 messages
2012/07/18
[#45976] [ruby-trunk - Bug #6756][Open] FileUtils.rm_rf がアクセス権のない空ディレクトリを削除しない — "fumiyas (Fumiyasu SATOH)" <fumiyas@...>
9 messages
2012/07/20
[#45977] [ruby-trunk - Feature #6757][Open] [PATCH] Add Process.getsid — "fumiyas (Fumiyasu SATOH)" <fumiyas@...>
6 messages
2012/07/20
[#46012] [ruby-trunk - Feature #6812][Open] Refactor gc.c — "authorNari (Narihiro Nakamura)" <authorNari@...>
13 messages
2012/07/30
[ruby-dev:45893] Re: 非同期割り込みに対する対処案(日本語版)
From:
Yusuke Endoh <mame@...>
Date:
2012-07-02 11:14:33 UTC
List:
ruby-dev #45893
遠藤です。
2012/06/26 SASADA Koichi <ko1@atdot.net>:
>>> begin
>>> > # 何か処理
>>> > ensure
>>> > Thread.mask_interrupt(Exception, :uninterruptible) do
>>> > # 一度全部割り込み禁止にして
>>> > Thread.mask_interrupt(SignalException, :blocking_interruptible)
>>> > do
>>> > # シグナルだけ割り込みを許して
>>> > # リソース解放処理
>>> > end
>>> > end
>>> > end
>> 外側が :immediate_interruptible であるとすると、これは race がありますよね。
>>
>> 「何か処理」で例外が起きて、ensure 節に入った後、
>> Thread.mask_interrupt(Exception, :uninterruptible) を呼び出す前に
>> 非同期イベントによる例外が起きると、リソース開放処理がスキップされます。
>>
>> 実装上はそこでは例外は起きないのかもしれませんが...
>
> 確かに,仰るとおりです.寝ぼけた頭では,とりあえず
>
> (1) 「実装上はそこでは例外は起きない」ことを仕様にする
> (2) ensure に細工する(あまりやりたくない)
> (3) 利用者が immediate にしない
>
> が考えられると思います.どれがいいでしょう.または,他の選択肢はあるで
> しょうか.
以下のようにすれば現状の API で問題ないと思うのですが、
何か見落としているでしょうか。
# (1) と (2) の間の割り込みを防ぐために
Thread.mask_interrupt(Exception, :blocking_interruptible) do # (0)
begin
# begin 〜 ensure 内での割り込みはいつでも許す
Thread.mask_interrupt(Exception, :immediate_interruptible) do
# 何か処理
end
ensure # (1)
# (0) のおかげでこの間に割り込まれることはない
Thread.mask_interrupt(Exception, :uninterruptible) do (2)
# 一度全部割り込み禁止にして
Thread.mask_interrupt(SignalException, :blocking_interruptible) do
# シグナルだけ割り込みを許して
# リソース解放処理
end
end
end
end
--
Yusuke Endoh <mame@tsg.ne.jp>