| Module | Mutex_m |
| In: |
lib/mutex_m.rb
|
# File lib/mutex_m.rb, line 42
42: def Mutex_m.append_features(cl)
43: super
44: define_aliases(cl) unless cl.instance_of?(Module)
45: end
# File lib/mutex_m.rb, line 32
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
# File lib/mutex_m.rb, line 47
47: def Mutex_m.extend_object(obj)
48: super
49: obj.mu_extended
50: end
# File lib/mutex_m.rb, line 52
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
# File lib/mutex_m.rb, line 88
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
locking
# File lib/mutex_m.rb, line 64
64: def mu_synchronize
65: begin
66: mu_lock
67: yield
68: ensure
69: mu_unlock
70: end
71: end
# File lib/mutex_m.rb, line 77
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
# File lib/mutex_m.rb, line 98
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