* [PATCH] thread_timeout: document additional caveats @ 2012-07-19 20:14 Eric Wong [not found] ` <20120719201403.GA11657-yBiyF41qdooeIZ0/mPfg9Q@public.gmane.org> 0 siblings, 1 reply; 2+ messages in thread From: Eric Wong @ 2012-07-19 20:14 UTC (permalink / raw) To: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw Again, for the one thousandth time, timing out threads is very tricky business :< --- Pushed to "master" of git://bogomips.org/rainbows and updated http://rainbows.rubyforge.org/Rainbows/ThreadTimeout.html lib/rainbows/thread_timeout.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/rainbows/thread_timeout.rb b/lib/rainbows/thread_timeout.rb index 4f62aba..8348272 100644 --- a/lib/rainbows/thread_timeout.rb +++ b/lib/rainbows/thread_timeout.rb @@ -44,6 +44,15 @@ # does not expose a monotonic clock for users, so don't change # the system time while this is running. All servers should be # running ntpd anyways. +# +# "ensure" clauses may not fire properly or be interrupted during +# execution, so do not mix this module with code which relies on "ensure". +# (This is also true for the "Timeout" module in the Ruby standard library) +# +# "recursive locking" ThreadError exceptions may occur if +# ThreadTimeout fires while a Mutex is locked (because "ensure" +# clauses may not fire properly). + class Rainbows::ThreadTimeout # :stopdoc: -- Eric Wong _______________________________________________ Rainbows! mailing list - rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org http://rubyforge.org/mailman/listinfo/rainbows-talk Do not quote signatures (like this one) or top post when replying ^ permalink raw reply related [flat|nested] 2+ messages in thread
[parent not found: <20120719201403.GA11657-yBiyF41qdooeIZ0/mPfg9Q@public.gmane.org>]
* Re: [PATCH] thread_timeout: document additional caveats [not found] ` <20120719201403.GA11657-yBiyF41qdooeIZ0/mPfg9Q@public.gmane.org> @ 2012-07-20 2:40 ` Eric Wong 0 siblings, 0 replies; 2+ messages in thread From: Eric Wong @ 2012-07-20 2:40 UTC (permalink / raw) To: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw Eric Wong <normalperson-rMlxZR9MS24@public.gmane.org> wrote: > Again, for the one thousandth time, timing out threads is very > tricky business :< On a related note, it looks like Thread.control_interrupt landed in Ruby trunk (http://svn.ruby-lang.org/repos/ruby/trunk r36470) Perhaps the future for interrupting long-running threads is less bleak. +/* + * call-seq: + * Thread.control_interrupt(hash) { ... } -> result of the block + * + * Thread.control_interrupt controls interrupt timing. + * + * _interrupt_ means asynchronous event and corresponding procedure + * by Thread#raise, Thread#kill, signal trap (not supported yet) + * and main thread termination (if main thread terminates, then all + * other thread will be killed). + * + * _hash_ has pairs of ExceptionClass and TimingSymbol. TimingSymbol + * is one of them: + * - :immediate Invoke interrupt immediately. + * - :on_blocking Invoke interrupt while _BlockingOperation_. + * - :never Never invoke interrupt. + * + * _BlockingOperation_ means that the operation will block the calling thread, + * such as read and write. On CRuby implementation, _BlockingOperation_ is + * operation executed without GVL. + * + * Masked interrupts are delayed until they are enabled. + * This method is similar to sigprocmask(3). + * + * TODO (DOC): control_interrupt is stacked. + * TODO (DOC): check ancestors. + * TODO (DOC): to prevent all interrupt, {Object => :never} works. + * + * NOTE: Asynchronous interrupts are difficult to use. + * If you need to communicate between threads, + * please consider to use another way such as Queue. + * Or use them with deep understanding about this method. + * + * + * # example: Guard from Thread#raise + * th = Thread.new do + * Thead.control_interrupt(RuntimeError => :never) { + * begin + * # Thread#raise doesn't interrupt here. + * # You can write resource allocation code safely. + * Thread.control_interrupt(RuntimeError => :immediate) { + * # ... + * # It is possible to be interrupted by Thread#raise. + * } + * ensure + * # Thread#raise doesn't interrupt here. + * # You can write resource dealocation code safely. + * end + * } + * end + * Thread.pass + * # ... + * th.raise "stop" + * + * # example: Guard from TimeoutError + * require 'timeout' + * Thread.control_interrupt(TimeoutError => :never) { + * timeout(10){ + * # TimeoutError doesn't occur here + * Thread.control_interrupt(TimeoutError => :on_blocking) { + * # possible to be killed by TimeoutError + * # while blocking operation + * } + * # TimeoutError doesn't occur here + * } + * } + * + * # example: Stack control settings + * Thread.control_interrupt(FooError => :never) { + * Thread.control_interrupt(BarError => :never) { + * # FooError and BarError are prohibited. + * } + * } + * + * # example: check ancestors + * Thread.control_interrupt(Exception => :never) { + * # all exceptions inherited from Exception are prohibited. + * } + * + */ + +/* + * call-seq: + * Thread.check_interrupt() -> nil + * + * Check queued interrupts. + * + * If there are queued interrupts, process respective procedures. + * + * This method can be defined as the following Ruby code: + * + * def Thread.check_interrupt + * Thread.control_interrupt(Object => :immediate) { + * Thread.pass + * } + * end + * + * Examples: + * + * th = Thread.new{ + * Thread.control_interrupt(RuntimeError => :on_blocking){ + * while true + * ... + * # reach safe point to invoke interrupt + * Thread.check_interrupt + * ... + * end + * } + * } + * ... + * th.raise # stop thread + * + * NOTE: This example can be described by the another code. + * You need to keep to avoid asynchronous interrupts. + * + * flag = true + * th = Thread.new{ + * Thread.control_interrupt(RuntimeError => :on_blocking){ + * while true + * ... + * # reach safe point to invoke interrupt + * break if flag == false + * ... + * end + * } + * } + * ... + * flag = false # stop thread + */ _______________________________________________ Rainbows! mailing list - rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org http://rubyforge.org/mailman/listinfo/rainbows-talk Do not quote signatures (like this one) or top post when replying ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-07-20 2:40 UTC | newest] Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-07-19 20:14 [PATCH] thread_timeout: document additional caveats Eric Wong [not found] ` <20120719201403.GA11657-yBiyF41qdooeIZ0/mPfg9Q@public.gmane.org> 2012-07-20 2:40 ` Eric Wong
Code repositories for project(s) associated with this public inbox https://yhbt.net/rainbows.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).