Issue #275 has been reported by Anonymous. ---------------------------------------- Bug #275: bug involving condition variables http://redmine.ruby-lang.org/issues/show/275 Author: Anonymous Status: Open Priority: Normal Assigned to: Category: Target version: The following code generates a ThreadError ("not owner", raised in unlock_mutex_inner()). However, the ThreadError never gets reported at the top level (even though my code is re-raising it and Thread.abort_on_exception = true). A ThreadError that I raise directly gets reported normally. For 1.8.6-p114 (Linux and Windows OCI), the output is: #<ThreadError: not owner> For 1.8.4, there is no output (so it looks like this difference has something to do with the thread rewrite in 1.8.6). See also ruby-talk:308103. require 'thread' Thread.abort_on_exception = true class MyQueue def initialize @q = [] @mutex = Mutex.new @cond = ConditionVariable.new end def push(obj) @mutex.synchronize do @q << obj @cond.signal end end def pop @mutex.synchronize do if (last=@q.pop) return last end loop do @cond.wait(@mutex) if (last=@q.pop) return last end end end end end queue = MyQueue.new def wait(queue) #raise ThreadError, "foo bar" # why does this behave differently than # the "not owner" ThreadError ? queue.pop queue.pop # without the rescue clause the program has no exceptions--why? rescue ThreadError => ex p ex raise ex # Why no exception reported at top level? end Thread.new {wait(queue)} sleep 0.01 Thread.new do queue.push "foobar" end sleep 0.01 ---------------------------------------- http://redmine.ruby-lang.org