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::ConditionVariable
associated with theMonitor
object. -
#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); }