Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / semaphore.rb
blob8eca4e3e9ad4f81115228d8c9625dcb462951bda
1 # semaphore.rb - efficient implementation of Fukumoto's semaphore
3 # Copyright 2008  MenTaLguY <mental@rydia.net>
5 # All rights reserved.
6
7 # Redistribution and use in source and binary forms, with or without 
8 # modification, are permitted provided that the following conditions are met:
9
10 # * Redistributions of source code must retain the above copyright notice,
11 #   thi slist of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above copyright notice
13 #   this list of conditions and the following disclaimer in the documentatio
14 #   and/or other materials provided with the distribution.
15 # * Neither the name of the Evan Phoenix nor the names of its contributors 
16 #   may be used to endorse or promote products derived from this software 
17 #   without specific prior written permission.
18
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
20 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
31 class Semaphore
32   def initialize(initvalue = 0)
33     @channel = Channel.new
34     initvalue.times { @channel << nil }
35   end
37   def signal
38     @channel << nil
39     self
40   end
41   alias_method :up, :signal
42   alias_method :v, :signal
44   def wait
45     @channel.receive
46     self
47   end
48   alias_method :down, :wait
49   alias_method :p, :wait
51   def exclusive #:yields:
52     wait
53     begin
54       yield
55     ensure
56       signal
57     end
58   end
59   alias_method :synchronize, :exclusive
60 end