Bug #275
closedbug involving condition variables
Description
=begin
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
=end