Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / mutex_m.rb
blobaa5354abdc0fa7fea616c2309356b097841b94c1
1 #--
2 #   mutex_m.rb - 
3 #       $Release Version: 3.0$
4 #       $Revision$
5 #       $Date$
6 #       Original from mutex.rb
7 #       by Keiju ISHITSUKA(keiju@ishitsuka.com)
8 #       modified by matz
9 #       patched by akira yamada
10 #       gutted by MenTaLguY
11 #++
13 # == Usage
15 # Extend an object and use it like a Mutex object:
17 #   require "mutex_m.rb"
18 #   obj = Object.new
19 #   obj.extend Mutex_m
20 #   # ...
22 # Or, include Mutex_m in a class to have its instances behave like a Mutex
23 # object:
25 #   class Foo
26 #     include Mutex_m
27 #     # ...
28 #   end
29 #   
30 #   obj = Foo.new
32 require 'thread'
34 module Mutex_m
35   def Mutex_m.define_aliases(cl)
36     cl.module_eval %q{
37       alias locked? mu_locked?
38       alias lock mu_lock
39       alias unlock mu_unlock
40       alias try_lock mu_try_lock
41       alias synchronize mu_synchronize
42     }
43   end  
45   def Mutex_m.append_features(cl)
46     super
47     define_aliases(cl) unless cl.instance_of?(Module)
48   end
49   
50   def Mutex_m.extend_object(obj)
51     super
52     obj.mu_extended
53   end
55   def mu_extended
56     unless (defined? locked? and
57             defined? lock and
58             defined? unlock and
59             defined? try_lock and
60             defined? synchronize)
61       Mutex_m.define_aliases(class<<self;self;end)
62     end
63     mu_initialize
64   end
65   
66   # locking 
67   def mu_synchronize
68     @mu_mutex.synchronize { yield }
69   end
70   
71   def mu_locked?
72     @mu_mutex.locked?
73   end
74   
75   def mu_try_lock
76     @mu_mutex.try_lock
77   end
78   
79   def mu_lock
80     @mu_mutex.lock
81     self
82   end
83   
84   def mu_unlock
85     @mu_mutex.unlock
86     self
87   end
88   
89   private
90   
91   def mu_initialize
92     @mu_mutex = ::Mutex.new
93   end
95   def initialize(*args)
96     mu_initialize
97     super
98   end
99 end