Class: Monitor
| Relationships & Source Files | |
| Inherits: | Object | 
| Defined in: | ext/monitor/lib/monitor.rb, ext/monitor/monitor.c  | 
    
Overview
Use the Monitor class when you want to have a lock object for blocks with mutual exclusion.
require 'monitor'
lock = Monitor.new
lock.synchronize do
  # exclusive access
end
  Instance Attribute Summary
- #mon_locked? ⇒ Boolean readonly Internal use only
 - #mon_owned? ⇒ Boolean readonly Internal use only
 
Instance Method Summary
- 
    
      #enter  ⇒ nil 
      (also: #mon_enter)
    
    
Enters exclusive section.
 - 
    
      #exit  ⇒ nil 
      (also: #mon_exit)
    
    
Leaves exclusive section.
 - 
    
      #mon_enter  
    
    
Alias for #enter.
 - 
    
      #mon_exit  
    
    
Alias for #exit.
 - 
    
      #mon_synchronize  
    
    
Alias for #synchronize.
 - 
    
      #mon_try_enter  
    
    
Alias for #try_enter.
 - 
    
      #new_cond  
    
    
Creates a new
::MonitorMixin::ConditionVariableassociated with theMonitorobject. - 
    
      #synchronize  ⇒ result of the block 
      (also: #mon_synchronize)
    
    
Enters exclusive section and executes the block.
 - 
    
      #try_enter  ⇒ Boolean 
      (also: #try_mon_enter, #mon_try_enter)
    
    
Attempts to enter exclusive section.
 - 
    
      #try_mon_enter  
    
    
Alias for #try_enter.
 - #mon_check_owner Internal use only
 - #wait_for_cond(cond, timeout) Internal use only
 
Instance Attribute Details
    #mon_locked?  ⇒ Boolean  (readonly)
  
  # File 'ext/monitor/monitor.c', line 135
static VALUE
monitor_locked_p(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    return rb_mutex_locked_p(mc->mutex);
}
  
    #mon_owned?  ⇒ Boolean  (readonly)
  
  # File 'ext/monitor/monitor.c', line 143
static VALUE
monitor_owned_p(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    return (rb_mutex_locked_p(mc->mutex) && mc_owner_p(mc)) ? Qtrue : Qfalse;
}
  Instance Method Details
    #enter  ⇒ nil     Also known as: #mon_enter
  
Enters exclusive section.
# File 'ext/monitor/monitor.c', line 87
static VALUE
monitor_enter(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    if (!mc_owner_p(mc)) {
        rb_mutex_lock(mc->mutex);
        RB_OBJ_WRITE(monitor, &mc->owner, rb_fiber_current());
        mc->count = 0;
    }
    mc->count++;
    return Qnil;
}
  
    #exit  ⇒ nil     Also known as: #mon_exit
  
Leaves exclusive section.
# File 'ext/monitor/monitor.c', line 117
static VALUE
monitor_exit(VALUE monitor)
{
    monitor_check_owner(monitor);
    struct rb_monitor *mc = monitor_ptr(monitor);
    if (mc->count <= 0) rb_bug("monitor_exit: count:%d", (int)mc->count);
    mc->count--;
    if (mc->count == 0) {
        RB_OBJ_WRITE(monitor, &mc->owner, Qnil);
        rb_mutex_unlock(mc->mutex);
    }
    return Qnil;
}
  #mon_check_owner
# File 'ext/monitor/monitor.c', line 101
static VALUE
monitor_check_owner(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    if (!mc_owner_p(mc)) {
        rb_raise(rb_eThreadError, "current fiber not owner");
    }
    return Qnil;
}
  #mon_enter
Alias for #enter.
# File 'ext/monitor/lib/monitor.rb', line 270
alias mon_enter enter
#mon_exit
Alias for #exit.
# File 'ext/monitor/lib/monitor.rb', line 271
alias mon_exit exit
#mon_synchronize
Alias for #synchronize.
# File 'ext/monitor/lib/monitor.rb', line 272
alias mon_synchronize synchronize
#mon_try_enter
Alias for #try_enter.
# File 'ext/monitor/lib/monitor.rb', line 269
alias mon_try_enter try_enter
#new_cond
Creates a new ::MonitorMixin::ConditionVariable associated with the Monitor object.
# File 'ext/monitor/lib/monitor.rb', line 263
def new_cond ::MonitorMixin::ConditionVariable.new(self) end
    #synchronize  ⇒ result of the block     Also known as: #mon_synchronize
  
Enters exclusive section and executes the block.  Leaves the exclusive section automatically when the block exits.  See example under ::MonitorMixin.
# File 'ext/monitor/monitor.c', line 226
static VALUE
monitor_synchronize(VALUE monitor)
{
    monitor_enter(monitor);
    return rb_ensure(monitor_sync_body, monitor, monitor_sync_ensure, monitor);
}
  
    #try_enter  ⇒ Boolean     Also known as: #try_mon_enter, #mon_try_enter
  
Attempts to enter exclusive section.  Returns false if lock fails.
# File 'ext/monitor/monitor.c', line 65
static VALUE
monitor_try_enter(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);
    if (!mc_owner_p(mc)) {
        if (!rb_mutex_trylock(mc->mutex)) {
            return Qfalse;
        }
        RB_OBJ_WRITE(monitor, &mc->owner, rb_fiber_current());
        mc->count = 0;
    }
    mc->count += 1;
    return Qtrue;
}
  #try_mon_enter
Alias for #try_enter.
# File 'ext/monitor/lib/monitor.rb', line 268
alias try_mon_enter try_enter
#wait_for_cond(cond, timeout)
# File 'ext/monitor/monitor.c', line 191
static VALUE
monitor_wait_for_cond(VALUE monitor, VALUE cond, VALUE timeout)
{
    VALUE count = monitor_exit_for_cond(monitor);
    struct wait_for_cond_data data = {
        monitor,
        cond,
        timeout,
        count,
    };
    return rb_ensure(monitor_wait_for_cond_body, (VALUE)&data,
                     monitor_enter_for_cond, (VALUE)&data);
}