From: Oleg Shaldybin <oleg.shaldybin@...>
Date: 2012-10-20T13:10:09+09:00
Subject: [ruby-core:48127] Re: [ruby-trunk - Bug #7087] ::ConditionVariable#wait does not work with Monitor because Monitor#sleep does not exist



On Oct 1, 2012, at 2:38 AM, "shugo (Shugo Maeda)" <redmine@ruby-lang.org> wrote:

> 
> Issue #7087 has been updated by shugo (Shugo Maeda).
> 
> 
> kosaki (Motohiro KOSAKI) wrote:
>> monitor is based on Java monitor semantics.
> 
> My Java knowledge is rusted, but monitor is not based on Java monitor semantics, at least when it was designed.  Java's monitor mechanism mixes a mutex and a condition variable into one object, but I don't think it's well designed.  I guess Java has a better solution (java.util.concurrent.locks.{Lock,Condition}?) now.  The name monitor was taken from Java, but it was just because the name mutex had been already taken at that time.
> 
> rklemme (Robert Klemme) wrote:
>> kosaki (Motohiro KOSAKI) wrote:
>>> At least, this is intentional. condtion variable and monitor have different inspiration source.
>>> condition variable is based on POSIX CV and monitor is based on Java monitor semantics. To be
>>> honest, I'm not familiar Java's conditon variable.
>> 
>> For me the difference between Mutex and Monitor is only reentrancy.  Other than that I'd have expected them to be identical (usage and interface).
> 
> Monitor has its own version of ConditionVariable.  Use Monitor#new_cond to get its instance.
> 
>>> Could you please explain the detail of your
>>> suggestion? Which semantics do you hope?
>> 
>> I would have expected that I can use a Monitor / instance which includes MonitorMixin the same way as a Mutex with ::ConditionVariable.  If that is not intended then I'd rather have an exception TypeError from ::ConditionVariable#wait indicating that a Mutex must be used than the exception about the private sleep method (which happens to be the one from Kernel).
> 
> It's not intended, but TypeError is not preferred in Ruby because it breaks duck typing.
> I think it's better to add Mutex#new_cond and to make the argument of ConditionVariable#wait obsolete.
> Java's java.util.concurrent.locks.Lock seems to have an equivalent method called newCondition().
> 
> ----------------------------------------
> Bug #7087: ::ConditionVariable#wait does not work with Monitor because Monitor#sleep does not exist
> https://bugs.ruby-lang.org/issues/7087#change-29819
> 
> Author: rklemme (Robert Klemme)
> Status: Open
> Priority: Low
> Assignee: 
> Category: 
> Target version: 
> ruby -v: ruby 1.9.3p194 (2012-04-20) [i686-linux]
> 
> 
> See program attached to bug #7086: timeout_4 always throws:
> 
> ERROR: method "timeout_4": #<NoMethodError: private method `sleep' called for #<Monitor:0x87e49f8>>
> 
> $ irb19 -r monitor
> irb(main):001:0> Monitor.new.method(:sleep)
> => #<Method: Monitor(Kernel)#sleep>
> irb(main):002:0> Monitor.instance_methods.grep /sleep/
> => []
> 
> 
> -- 
> http://bugs.ruby-lang.org/
>