summaryrefslogtreecommitdiff
path: root/spec/ruby/library/monitor/synchronize_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/library/monitor/synchronize_spec.rb')
-rw-r--r--spec/ruby/library/monitor/synchronize_spec.rb30
1 files changed, 30 insertions, 0 deletions
diff --git a/spec/ruby/library/monitor/synchronize_spec.rb b/spec/ruby/library/monitor/synchronize_spec.rb
new file mode 100644
index 0000000000..d851b98d6c
--- /dev/null
+++ b/spec/ruby/library/monitor/synchronize_spec.rb
@@ -0,0 +1,30 @@
+require_relative '../../spec_helper'
+require 'monitor'
+
+describe "Monitor#synchronize" do
+ it "unlocks after return, even if it was interrupted by Thread#raise" do
+ exc_class = Class.new(RuntimeError)
+
+ monitor = Monitor.new
+ 10.times do
+ locked = false
+
+ thread = Thread.new do
+ begin
+ monitor.synchronize do
+ locked = true
+ # Do not wait here, we are trying to interrupt the ensure part of #synchronize
+ end
+ sleep # wait for exception if it did not happen yet
+ rescue exc_class
+ monitor.should_not.mon_locked?
+ :ok
+ end
+ end
+
+ Thread.pass until locked
+ thread.raise exc_class, "interrupt"
+ thread.value.should == :ok
+ end
+ end
+end