diff options
Diffstat (limited to 'ruby_1_8_6/lib/mutex_m.rb')
-rw-r--r-- | ruby_1_8_6/lib/mutex_m.rb | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/ruby_1_8_6/lib/mutex_m.rb b/ruby_1_8_6/lib/mutex_m.rb new file mode 100644 index 0000000000..8e0d42bc8d --- /dev/null +++ b/ruby_1_8_6/lib/mutex_m.rb @@ -0,0 +1,122 @@ +#-- +# mutex_m.rb - +# $Release Version: 3.0$ +# $Revision: 1.7 $ +# $Date: 1998/02/27 04:28:57 $ +# Original from mutex.rb +# by Keiju ISHITSUKA(keiju@ishitsuka.com) +# 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 + +module Mutex_m + 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 + + def Mutex_m.append_features(cl) + super + define_aliases(cl) unless cl.instance_of?(Module) + end + + def Mutex_m.extend_object(obj) + super + obj.mu_extended + end + + 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 + + # locking + def mu_synchronize + begin + mu_lock + yield + ensure + mu_unlock + end + end + + def mu_locked? + @mu_locked + end + + def mu_try_lock + result = false + Thread.critical = true + unless @mu_locked + @mu_locked = true + result = true + end + Thread.critical = false + result + end + + 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 + + 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 + + private + + def mu_initialize + @mu_waiting = [] + @mu_locked = false; + end + + def initialize(*args) + mu_initialize + super + end +end |