diff options
author | Ian Ownbey <ian@inspir.es> | 2009-01-31 14:18:08 -0800 |
---|---|---|
committer | Ian Ownbey <ian@inspir.es> | 2009-01-31 14:18:08 -0800 |
commit | fa82e8e3fb52e0107163e57a705cc652f276e1ab (patch) | |
tree | 8bf4e995294379699cefec179a77f711d079ad2b /lib/mongrel/semaphore.rb | |
parent | dda58fa2d58c4ab2bda0a9580841e3c4e09bb30c (diff) | |
parent | cb3b9862a5fef4f3fd197e0319bbea0de562f9da (diff) | |
download | unicorn-fa82e8e3fb52e0107163e57a705cc652f276e1ab.tar.gz |
* 'master' of git@github.com:fauna/mongrel: Merge pivotal code. Moving toward using a logger instead of dumping to STDERR all over the place. TODO been did. No commands.
Diffstat (limited to 'lib/mongrel/semaphore.rb')
-rw-r--r-- | lib/mongrel/semaphore.rb | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/mongrel/semaphore.rb b/lib/mongrel/semaphore.rb new file mode 100644 index 0000000..1c0b87c --- /dev/null +++ b/lib/mongrel/semaphore.rb @@ -0,0 +1,46 @@ +class Semaphore + def initialize(resource_count = 0) + @available_resource_count = resource_count + @mutex = Mutex.new + @waiting_threads = [] + end + + def wait + make_thread_wait unless resource_is_available + end + + def signal + schedule_waiting_thread if thread_is_waiting + end + + def synchronize + self.wait + yield + ensure + self.signal + end + + private + + def resource_is_available + @mutex.synchronize do + return (@available_resource_count -= 1) >= 0 + end + end + + def make_thread_wait + @waiting_threads << Thread.current + Thread.stop + end + + def thread_is_waiting + @mutex.synchronize do + return (@available_resource_count += 1) <= 0 + end + end + + def schedule_waiting_thread + thread = @waiting_threads.shift + thread.wakeup if thread + end +end |