diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-07-07 07:36:34 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-07-07 07:36:34 +0000 |
commit | 441546edcfbb1b346c87b69c5f578d1a0e522e06 (patch) | |
tree | 04f606a008baebc445f38944ad37e87468da29ea /ruby_1_8_6/lib/mutex_m.rb | |
parent | fa93611c0f9a6db146341c792bfe3b7322ec00e2 (diff) |
add tag v1_8_6_269
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_6_269@17937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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 |