diff options
author | zedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-11-15 19:00:47 +0000 |
---|---|---|
committer | zedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-11-15 19:00:47 +0000 |
commit | a686152bf55e925103e4cead99e792604b9d0a0c (patch) | |
tree | 224c8c4fa6b6d96d214fe43761daaf8bf5b33af0 /lib | |
parent | 88a2eb7c9733cd112b03dc17e144a732e9476d2e (diff) | |
download | unicorn-a686152bf55e925103e4cead99e792604b9d0a0c.tar.gz |
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@379 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mutex_fix.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/mutex_fix.rb b/lib/mutex_fix.rb new file mode 100644 index 0000000..a844401 --- /dev/null +++ b/lib/mutex_fix.rb @@ -0,0 +1,34 @@ +require 'thread' + +# monkey patch Mutex so it does not leak memory. +class Mutex + + def lock + while (Thread.critical = true; @locked) + @waiting.unshift Thread.current + Thread.stop + end + @locked = true + Thread.critical = false + self + end + + def unlock + return unless @locked + Thread.critical = true + @locked = false + begin + t = @waiting.pop + t.wakeup if t + rescue ThreadError + retry + end + Thread.critical = false + begin + t.run if t + rescue ThreadError + end + self + end + +end
\ No newline at end of file |