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/