From: Joel VanderWerf Date: 2008-07-14T15:12:16+09:00 Subject: bug involving condition variables 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), the output is: # 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). If it doesn't look like there's some obvious stupidity, I'll file a bug. ------------------------------- 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 -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407