summaryrefslogtreecommitdiff
path: root/test/monitor
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-10-20 04:52:20 +0900
committerGitHub <noreply@github.com>2019-10-20 04:52:20 +0900
commitcaac5f777ae288b5982708b8690e712e1cae0cf6 (patch)
treee4257d65c062b7e8c9e4c4b962cee3ca7c5e1d4c /test/monitor
parent434966bffddd4299d34f5d1f7f225bf7396d0807 (diff)
make monitor.so for performance. (#2576)
Recent monitor.rb has performance problem because of interrupt handlers. 'Monitor#synchronize' is frequently used primitive so the performance of this method is important. This patch rewrite 'monitor.rb' with 'monitor.so' (C-extension) and make it faster. See [Feature #16255] for details. Monitor class objects are normal object which include MonitorMixin. This patch introduce a Monitor class which is implemented on C and MonitorMixin uses Monitor object as re-entrant (recursive) Mutex. This technique improve performance because we don't need to care atomicity and we don't need accesses to instance variables any more on Monitor class.
Notes
Notes: Merged-By: ko1 <ko1@atdot.net>
Diffstat (limited to 'test/monitor')
-rw-r--r--test/monitor/test_monitor.rb16
1 files changed, 8 insertions, 8 deletions
diff --git a/test/monitor/test_monitor.rb b/test/monitor/test_monitor.rb
index 9d07bf75f7..49c34e067e 100644
--- a/test/monitor/test_monitor.rb
+++ b/test/monitor/test_monitor.rb
@@ -273,24 +273,24 @@ class TestMonitor < Test::Unit::TestCase
end
def test_wait_interruption
- queue = Queue.new
cond = @monitor.new_cond
- @monitor.define_singleton_method(:mon_enter_for_cond) do |*args|
- queue.deq
- super(*args)
- end
+
th = Thread.start {
@monitor.synchronize do
begin
cond.wait(0.1)
+ @monitor.mon_owned?
rescue Interrupt
- @monitor.instance_variable_get(:@mon_owner)
+ @monitor.mon_owned?
end
end
}
sleep(0.1)
th.raise(Interrupt)
- queue.enq(nil)
- assert_equal th, th.value
+
+ begin
+ assert_equal true, th.value
+ rescue Interrupt
+ end
end
end