A patch against: -rw-r--r-- 1 hgs staff 4467539 Jul 13 13:08 stable-snapshot.tar.gz md5sum: 7e3db77a67f3b2a14e8a93229bb2d49d stable-snapshot.tar.gz This is an attempt to improve the docs for Monitor. I don't fully understand the details of how the threading is being done here, but I think what I have written does not depend on those details and is thus accurate. HTH Hugh --- ruby-stable-snapshot/lib/monitor.rb.orig 2005-09-02 15:52:56.000000000 +0100 +++ ruby-stable-snapshot/lib/monitor.rb 2006-07-13 16:53:59.818832000 +0100 @@ -86,6 +86,10 @@ class ConditionVariable class Timeout < Exception; end + # Create a new timer with the argument timeout, and add the + # current thread to the list of waiters. Then the thread is + # stopped. It will be resumed when a corresponding #signal + # occurs. def wait(timeout = nil) @monitor.instance_eval {mon_check_owner()} timer = create_timer(timeout) @@ -112,18 +116,22 @@ end end + + # call #wait while the supplied block returns +true+. def wait_while while yield wait end end + # call #wait until the supplied block returns +true+. def wait_until until yield wait end end + # Wake up and run the next waiter def signal @monitor.instance_eval {mon_check_owner()} Thread.critical = true @@ -133,6 +141,7 @@ Thread.pass end + # Wake up all the waiters. def broadcast @monitor.instance_eval {mon_check_owner()} Thread.critical = true @@ -235,6 +244,9 @@ # # FIXME: This isn't documented in Nutshell. + # + # Create a new condition variable for this monitor. + # This facilitates control of the monitor with #signal and #wait. # def new_cond return ConditionVariable.new(self) @@ -247,6 +259,7 @@ mon_initialize end + # called by initialize method to set defaults for instance variables. def mon_initialize @mon_owner = nil @mon_count = 0 @@ -254,6 +267,8 @@ @mon_waiting_queue = [] end + # Throw a ThreadError exception if the current thread + # does't own the monitor def mon_check_owner if @mon_owner != Thread.current raise ThreadError, "current thread not owner" @@ -289,6 +304,17 @@ end end +# Monitors provide means of mutual exclusion for Thread programming. +# A critical region is created by means of the synchronize method, +# which takes a block. +# The condition variables (created with #new_cond) may be used +# to control the execution of a monitor with #signal and #wait. +# +# the Monitor class wraps MonitorMixin, and provides aliases +# alias try_enter try_mon_enter +# alias enter mon_enter +# alias exit mon_exit +# to access its methods more concisely. class Monitor include MonitorMixin alias try_enter try_mon_enter