class Monitor

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

Public Instance Methods

Enters exclusive section.

static VALUE
monitor_enter(VALUE monitor)
{
    struct monitor_args args;
    monitor_args_init(&args, monitor);
    monitor_enter0(&args);
    return Qnil;
}
Also aliased as: mon_enter

Leaves exclusive section.

static VALUE
monitor_exit(VALUE monitor)
{
    struct monitor_args args;
    monitor_args_init(&args, monitor);
    monitor_exit0(&args);
    return Qnil;
}
Also aliased as: mon_exit
Alias for: enter
Alias for: exit

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

Enters exclusive section and executes the block. Leaves the exclusive section automatically when the block exits. See example under MonitorMixin.

static VALUE
monitor_synchronize(VALUE monitor)
{
    struct monitor_args args;
    monitor_args_init(&args, monitor);
    monitor_enter0(&args);
    return rb_ensure(monitor_sync_body, (VALUE)&args, monitor_sync_ensure, (VALUE)&args);
}
Also aliased as: mon_synchronize

Attempts to enter exclusive section. Returns false if lock fails.

static VALUE
monitor_try_enter(VALUE monitor)
{
    struct rb_monitor *mc = monitor_ptr(monitor);

    VALUE current_fiber = rb_fiber_current();
    if (!mc_owner_p(mc, current_fiber)) {
        if (!rb_mutex_trylock(mc->mutex)) {
            return Qfalse;
        }
        RB_OBJ_WRITE(monitor, &mc->owner, current_fiber);
        mc->count = 0;
    }
    mc->count += 1;
    return Qtrue;
}
Also aliased as: try_mon_enter, mon_try_enter