diff options
author | Evan Weaver <eweaver@twitter.com> | 2009-01-31 14:17:06 -0800 |
---|---|---|
committer | Evan Weaver <eweaver@twitter.com> | 2009-01-31 14:17:06 -0800 |
commit | cb3b9862a5fef4f3fd197e0319bbea0de562f9da (patch) | |
tree | 58dabd544368870fc98c814e0816b5c3bc361a8f /lib/mongrel/semaphore.rb | |
parent | 3dd3bd73b8b9f520dbf35290a652d2fc0e423007 (diff) | |
download | unicorn-cb3b9862a5fef4f3fd197e0319bbea0de562f9da.tar.gz |
Breaks world. Added option to throttle number of concurrent threads processing requests. Conflicts: bin/mongrel_rails lib/mongrel.rb lib/mongrel/configurator.rb lib/mongrel/rails.rb test/unit/test_ws.rb
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 |