about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-11-15 19:00:47 +0000
committerzedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9>2006-11-15 19:00:47 +0000
commita686152bf55e925103e4cead99e792604b9d0a0c (patch)
tree224c8c4fa6b6d96d214fe43761daaf8bf5b33af0 /lib
parent88a2eb7c9733cd112b03dc17e144a732e9476d2e (diff)
downloadunicorn-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.rb34
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