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