Project

General

Profile

Actions

Bug #11344

closed

Thread.handle_interrupt(TimeoutError => :never) が効かない

Added by tommy (Masahiro Tomita) almost 9 years ago. Updated over 8 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
[ruby-dev:49179]

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 中のコメントにも同様の記述があります。


Related issues 1 (0 open1 closed)

Related to Ruby master - Misc #19740: Block taking methods can't differentiate between a non-local return and a throwClosedActions
Actions #1

Updated by nobu (Nobuyoshi Nakada) almost 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) almost 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) almost 9 years ago

本題ではないですが、

2.0.0は脆弱性じゃなければ全部WONTFIXでOKです。
が、いちいち変えるの面倒なので、私も他のを変えるついで以外では変えてませんし、
特に気にせずREQUIREDにして頂いてもかまいません。
(もちろん問題の有無自体がわからなかったらUNKNOWNのままで可)

Updated by nagachika (Tomoyuki Chikanaga) almost 9 years ago

一度は(それも結構長いあいだ) raise する例外が Timeout::ExitException になっていたことから、バックポート時は互換性を考えると ExitException = Timeout::Error とかしておいたほうがいいかなと思いますがどうでしょうか。

Updated by nobu (Nobuyoshi Nakada) almost 9 years ago

Timeout::ExitExceptionは内部用のクラスという認識でした。:nodoc:だし。

Updated by tommy (Masahiro Tomita) almost 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) over 8 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 の別名として追加を行いました。

Actions #8

Updated by usa (Usaku NAKAMURA) over 8 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)

Actions #9

Updated by byroot (Jean Boussier) 10 months ago

  • Related to Misc #19740: Block taking methods can't differentiate between a non-local return and a throw added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0