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:
#<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).
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
# 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