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