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
   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