2004-09-16 ========== Ruby 時間制限付きでユーザコードを実行する。 ------------------------------------------- Reference URI: http://lowreal.net/logs/2004/09/16/1 Written Time: 2004-09-16T15:35:34+09:00 Tags: prog IRC (Internet Relay Chat) BOT に Ruby 式評価する機能でもと。 def safe(lvl, tm=1) result = nil Thread::start(lvl, tm) do |level, time| $SAFE = level Thread::exclusive do timeout(time) do tl = Thread::list result = yield (Thread:: list - tl).each {|th| th.join} end end end.join resultend 果たしてこれでいいかは不明だけど、たぶんちゃんと動いてる。Thread.start { loop { sleep 0.1 } }; Thread.start { loop {sleep 0.1} } みたいなのを投げても大丈夫。でも何かデッドロッ(あqwせdrftgyふじこlp だめだ。上のじゃだめ。やっぱデッドロックしてるっぽい(Thread::critical = true してみればエラーになる。 exclusive はエラー処理やってるから分からないだけだ)。他 のスレッドに処理が移ってスレッド作られると困るから exclusive してるんだけど、なん か上手くいってない。とりあえず今のところ他のスレッドで新しいスレッド作ることはない から exclusive をコメントアウト。 まぁ原因は (Thread::list - tl) なんだけど。何故か全部のスレッドが入ってる。 よく分からないけど書き換え。critical 設定するとダメくさいのでもうアレやこれや。 def safe(lvl, tm=1) result = nil tl = Thread::list t = Thread::start(lvl ) do |level| $SAFE = level result = yield end.join(tm) (Threa d::list - tl).each {|th| th.kill} raise TimeoutError unless t resultend