From baba657821e767c116f8451049453df1cf7bd322 Mon Sep 17 00:00:00 2001 From: shugo Date: Mon, 2 Apr 2001 05:27:49 +0000 Subject: [PATCH] * lib/monitor.rb (wait): fix timeout support. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1302 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 +++- lib/monitor.rb | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9a9228854a..5dc74d75b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,9 @@ -Mon Apr 2 13:54:21 2001 Shugo Maeda +Mon Apr 2 14:25:49 2001 Shugo Maeda * lib/monitor.rb (wait): ensure reentrance. + * lib/monitor.rb (wait): fix timeout support. + Mon Apr 2 12:44:53 2001 Shugo Maeda * lib/net/imap.rb: backport from ruby-1.7. diff --git a/lib/monitor.rb b/lib/monitor.rb index d36546ab6d..721c51a9f5 100644 --- a/lib/monitor.rb +++ b/lib/monitor.rb @@ -69,6 +69,15 @@ module MonitorMixin raise ThreadError, "current thread not owner" end + if timeout + ct = Thread.current + timeout_thread = Thread.start { + Thread.pass + sleep(timeout) + ct.raise(Timeout.new) + } + end + Thread.critical = true count = @monitor.mon_count @monitor.mon_count = 0 @@ -80,23 +89,18 @@ module MonitorMixin end t.wakeup if t @waiters.push(Thread.current) - - if timeout - t = Thread.current - timeout_thread = Thread.start { - sleep(timeout) - t.raise(Timeout.new) - } - end + begin Thread.stop rescue Timeout - @waiters.delete(Thread.current) ensure Thread.critical = true if timeout && timeout_thread.alive? Thread.kill(timeout_thread) end + if @waiters.include?(Thread.current) # interrupted? + @waiters.delete(Thread.current) + end while @monitor.mon_owner && @monitor.mon_owner != Thread.current @monitor.mon_waiting_queue.push(Thread.current)