Module: Mutex_m
- Defined in:
- lib/mutex_m.rb
Overview
--
mutex_m.rb -
$Release Version: 3.0$
$Revision: 1.7 $
$Date: 1998/02/27 04:28:57 $
Original from mutex.rb
by Keiju ISHITSUKA([email protected])
modified by matz
patched by akira yamada
++
Usage
Extend an object and use it like a Mutex object:
require "mutex_m.rb"
obj = Object.new
obj.extend Mutex_m
# ...
Or, include Mutex_m in a class to have its instances behave like a Mutex object:
class Foo
include Mutex_m
# ...
end
obj = Foo.new
Class Method Summary collapse
Instance Method Summary collapse
- #mu_extended ⇒ Object
- #mu_lock ⇒ Object
- #mu_locked? ⇒ Boolean
-
#mu_synchronize ⇒ Object
locking.
- #mu_try_lock ⇒ Object
- #mu_unlock ⇒ Object
Class Method Details
.append_features(cl) ⇒ Object
42 43 44 45 |
# File 'lib/mutex_m.rb', line 42 def Mutex_m.append_features(cl) super define_aliases(cl) unless cl.instance_of?(Module) end |
.define_aliases(cl) ⇒ Object
32 33 34 35 36 37 38 39 40 |
# File 'lib/mutex_m.rb', line 32 def Mutex_m.define_aliases(cl) cl.module_eval %q{ alias locked? mu_locked? alias lock mu_lock alias unlock mu_unlock alias try_lock mu_try_lock alias synchronize mu_synchronize } end |
.extend_object(obj) ⇒ Object
47 48 49 50 |
# File 'lib/mutex_m.rb', line 47 def Mutex_m.extend_object(obj) super obj.mu_extended end |
Instance Method Details
#mu_extended ⇒ Object
52 53 54 55 56 57 58 59 60 61 |
# File 'lib/mutex_m.rb', line 52 def mu_extended unless (defined? locked? and defined? lock and defined? unlock and defined? try_lock and defined? synchronize) Mutex_m.define_aliases(class<<self;self;end) end mu_initialize end |
#mu_lock ⇒ Object
88 89 90 91 92 93 94 95 96 |
# File 'lib/mutex_m.rb', line 88 def mu_lock while (Thread.critical = true; @mu_locked) @mu_waiting.push Thread.current Thread.stop end @mu_locked = true Thread.critical = false self end |
#mu_locked? ⇒ Boolean
73 74 75 |
# File 'lib/mutex_m.rb', line 73 def mu_locked? @mu_locked end |
#mu_synchronize ⇒ Object
locking
64 65 66 67 68 69 70 71 |
# File 'lib/mutex_m.rb', line 64 def mu_synchronize begin mu_lock yield ensure mu_unlock end end |
#mu_try_lock ⇒ Object
77 78 79 80 81 82 83 84 85 86 |
# File 'lib/mutex_m.rb', line 77 def mu_try_lock result = false Thread.critical = true unless @mu_locked @mu_locked = true result = true end Thread.critical = false result end |
#mu_unlock ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/mutex_m.rb', line 98 def mu_unlock return unless @mu_locked Thread.critical = true wait = @mu_waiting @mu_waiting = [] @mu_locked = false Thread.critical = false for w in wait w.run end self end |