Update to RDoc 2.1.0 r112
[rbx.git] / stdlib / mutex_m.rb
blob8e0d42bc8dd9b7a59a8484c1373f123aac4d1070
1 #--
2 #   mutex_m.rb - 
3 #       $Release Version: 3.0$
4 #       $Revision: 1.7 $
5 #       $Date: 1998/02/27 04:28:57 $
6 #       Original from mutex.rb
7 #       by Keiju ISHITSUKA(keiju@ishitsuka.com)
8 #       modified by matz
9 #       patched by akira yamada
10 #++
12 # == Usage
14 # Extend an object and use it like a Mutex object:
16 #   require "mutex_m.rb"
17 #   obj = Object.new
18 #   obj.extend Mutex_m
19 #   # ...
21 # Or, include Mutex_m in a class to have its instances behave like a Mutex
22 # object:
24 #   class Foo
25 #     include Mutex_m
26 #     # ...
27 #   end
28 #   
29 #   obj = Foo.new
31 module Mutex_m
32   def Mutex_m.define_aliases(cl)
33     cl.module_eval %q{
34       alias locked? mu_locked?
35       alias lock mu_lock
36       alias unlock mu_unlock
37       alias try_lock mu_try_lock
38       alias synchronize mu_synchronize
39     }
40   end  
42   def Mutex_m.append_features(cl)
43     super
44     define_aliases(cl) unless cl.instance_of?(Module)
45   end
46   
47   def Mutex_m.extend_object(obj)
48     super
49     obj.mu_extended
50   end
52   def mu_extended
53     unless (defined? locked? and
54             defined? lock and
55             defined? unlock and
56             defined? try_lock and
57             defined? synchronize)
58       Mutex_m.define_aliases(class<<self;self;end)
59     end
60     mu_initialize
61   end
62   
63   # locking 
64   def mu_synchronize
65     begin
66       mu_lock
67       yield
68     ensure
69       mu_unlock
70     end
71   end
72   
73   def mu_locked?
74     @mu_locked
75   end
76   
77   def mu_try_lock
78     result = false
79     Thread.critical = true
80     unless @mu_locked
81       @mu_locked = true
82       result = true
83     end
84     Thread.critical = false
85     result
86   end
87   
88   def mu_lock
89     while (Thread.critical = true; @mu_locked)
90       @mu_waiting.push Thread.current
91       Thread.stop
92     end
93     @mu_locked = true
94     Thread.critical = false
95     self
96   end
97   
98   def mu_unlock
99     return unless @mu_locked
100     Thread.critical = true
101     wait = @mu_waiting
102     @mu_waiting = []
103     @mu_locked = false
104     Thread.critical = false
105     for w in wait
106       w.run
107     end
108     self
109   end
110   
111   private
112   
113   def mu_initialize
114     @mu_waiting = []
115     @mu_locked = false;
116   end
118   def initialize(*args)
119     mu_initialize
120     super
121   end