Bug #11344
closedThread.handle_interrupt(TimeoutError => :never) が効かない
Description
るりま http://docs.ruby-lang.org/ja/2.2.0/method/Thread/s/handle_interrupt.html によると、Thread.handle_interrupt(TimeoutError => :never)
で TimeoutError
を制御できると書かれていますが、働きません。
require 'timeout'
Thread.handle_interrupt(TimeoutError => :never) do
timeout(1) do
sleep 2
p 'done'
end
end
#=> sample.rb:4:in `sleep': execution expired (Timeout::Error)
TimeoutError
の代わりに Timeout::ExitException
を指定すれば働きます。
require 'timeout'
Thread.handle_interrupt(Timeout::ExitException => :never) do
timeout(1) do
sleep 2
p 'done'
end
end
#=> "done"
#=> sample.rb:2:in `handle_interrupt': execution expired (Timeout::ExitException)
これは意図された挙動でしょうか。
なお、るりまだけじゃなく、thread.c 中のコメントにも同様の記述があります。
Updated by nobu (Nobuyoshi Nakada) about 9 years ago
- Status changed from Open to Closed
Applied in changeset r51213.
timeout.rb: removed and use Timeout::Error
- lib/timeout.rb (ExitException): removed internal exception class
and use Timeout::Error instead, as using throw/catch to isolate
each timeouts now. [ruby-dev:49179] [Bug #11344]
Updated by nobu (Nobuyoshi Nakada) about 9 years ago
- Description updated (diff)
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED
2.1にはそのままバックポートできるか分かりませんが、REQUIREDにしておきます。
2.0も動作は同じなのですが、throw
/catch
を使うようにするところからバックポートしないといけないので、とりあえずWONTFIXにしておきます。
Updated by usa (Usaku NAKAMURA) about 9 years ago
本題ではないですが、
2.0.0は脆弱性じゃなければ全部WONTFIXでOKです。
が、いちいち変えるの面倒なので、私も他のを変えるついで以外では変えてませんし、
特に気にせずREQUIREDにして頂いてもかまいません。
(もちろん問題の有無自体がわからなかったらUNKNOWNのままで可)
Updated by nagachika (Tomoyuki Chikanaga) about 9 years ago
一度は(それも結構長いあいだ) raise する例外が Timeout::ExitException になっていたことから、バックポート時は互換性を考えると ExitException = Timeout::Error
とかしておいたほうがいいかなと思いますがどうでしょうか。
Updated by nobu (Nobuyoshi Nakada) about 9 years ago
Timeout::ExitException
は内部用のクラスという認識でした。:nodoc:
だし。
Updated by tommy (Masahiro Tomita) about 9 years ago
少なくとも Thread.handle_interrupt では Timeout::Error の指定は効かなかったので、しかたなく内部クラスの Timeout::ExitException を使ってたというライブラリもあるかもしれないので、
互換性を考えると ExitException = Timeout::Error とかしておいたほうがいいかなと思いますがどうでしょうか
に賛成です。
Mysql2 がそんな感じに使っちゃってます。 https://github.com/brianmario/mysql2/blob/master/lib/mysql2/client.rb#L79
まだこの変更はリリース前ですけど。
Updated by nagachika (Tomoyuki Chikanaga) about 9 years ago
- Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: DONE
r51523 で ruby_2_2
への r51213 の backport + Timeout::ExitException の Timeout::Error の別名として追加を行いました。
Updated by usa (Usaku NAKAMURA) about 9 years ago
- Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: DONE to 2.0.0: WONTFIX, 2.1: DONE, 2.2: DONE
2.1も2.2と同じ形でbackportしました。(r51603)
Updated by byroot (Jean Boussier) about 1 year ago
- Related to Misc #19740: Block taking methods can't differentiate between a non-local return and a throw added