Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
8da1c423bc6da7ee8a5f58521db7ea89dcd2f06f
[simgrid.git] / src / bindings / ruby / Semaphore.rb
1 require 'thread'
2 class Semaphore
3   
4   
5   Thread.abort_on_exception = true
6
7   attr_accessor :permits, :mutex, :cv
8   
9   
10   
11   def initialize ( permits )
12     
13     
14       @permits = permits
15       @mutex = Mutex.new
16       @cv = ConditionVariable.new
17     
18   end
19   
20   
21   def acquire()
22
23     raise "Interrupted Thread " if (!Thread.current.alive?)
24     @mutex.synchronize {
25     while @permits < 1
26       @cv.wait(mutex)
27     end
28     @permits = @permits - 1
29     }
30   end
31     
32   
33   def release()
34     @mutex.synchronize{
35       @value = @value + 1
36       @cv.signal
37          
38       }
39     
40   end
41   
42   
43
44   
45 end