1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/monitor.rb (mon_try_enter, mon_enter): should reset @mon_count

just in case the previous owner thread dies without mon_exit.
  [fix GH-874] Patch by @chrisberkhout

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50525 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shugo 2015-05-18 04:56:22 +00:00
parent 47349e8701
commit 7be5169804
3 changed files with 40 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Mon May 18 13:55:01 2015 Shugo Maeda <shugo@ruby-lang.org>
* lib/monitor.rb (mon_try_enter, mon_enter): should reset @mon_count
just in case the previous owner thread dies without mon_exit.
[fix GH-874] Patch by @chrisberkhout
Sun May 17 17:21:29 2015 Eric Wong <e@80x24.org>
* lib/webrick/utils.rb (set_non_blocking): use IO#nonblock=

View file

@ -170,6 +170,7 @@ module MonitorMixin
return false
end
@mon_owner = Thread.current
@mon_count = 0
end
@mon_count += 1
return true
@ -184,6 +185,7 @@ module MonitorMixin
if @mon_owner != Thread.current
@mon_mutex.lock
@mon_owner = Thread.current
@mon_count = 0
end
@mon_count += 1
end

View file

@ -33,6 +33,22 @@ class TestMonitor < Test::Unit::TestCase
assert_equal((1..10).to_a, ary)
end
def test_enter_second_after_killed_thread
th = Thread.start {
@monitor.enter
Thread.current.kill
@monitor.exit
}
th.join
@monitor.enter
@monitor.exit
th2 = Thread.start {
@monitor.enter
@monitor.exit
}
assert_join_threads([th, th2])
end
def test_synchronize
ary = []
queue = Queue.new
@ -111,6 +127,22 @@ class TestMonitor < Test::Unit::TestCase
assert_join_threads([th, th2])
end
def test_try_enter_second_after_killed_thread
th = Thread.start {
assert_equal(true, @monitor.try_enter)
Thread.current.kill
@monitor.exit
}
th.join
assert_equal(true, @monitor.try_enter)
@monitor.exit
th2 = Thread.start {
assert_equal(true, @monitor.try_enter)
@monitor.exit
}
assert_join_threads([th, th2])
end
def test_cond
cond = @monitor.new_cond