IRC 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 result end
果たしてこれでいいかは不明だけど、たぶんちゃんと動いてる。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) (Thread::list - tl).each {|th| th.kill} raise TimeoutError unless t result end