Bug #275

bug involving condition variables

Added by Anonymous almost 4 years ago. Updated about 1 year ago.

[ruby-core:17765]
Status:Closed Start date:07/15/2008
Priority:Normal Due date:
Assignee:shyouhei (Shyouhei Urabe) % Done:

0%

Category:-
Target version:-
ruby -v:-

Description

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

History

Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

  • Assignee set to shyouhei (Shyouhei Urabe)
[ruby-dev:30809] and [ruby-Bugs-11507] are wrong.
ext/thread needs to be backported from 1.8 head or 1.8.7.

Updated by marcandre (Marc-Andre Lafortune) over 2 years ago

  • Status changed from Open to Closed
  • ruby -v set to -
Closing this issue since it appears fixed as of ruby 1.8.6 patch 387.

Also available in: Atom PDF