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

test/net/imap/test_imap.rb (test_exception_during_idle): kill infinite looper

It is possible for Mutex#sleep (via ConditionVariable#wait)
to prematurely wake up under MJIT (because Mutex#sleep can't
handle spurious wakeups).  This affects @idle_done_cond in
Net::IMAP#idle and means the response handler may never
set `in_idle' to `true`.

In any case, ensure the infinite looping `raiser' thread
stops running when the test is done.

Will work on reducing the effect of spurious wakeups from
MJIT...

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64387 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-16 03:37:14 +00:00
parent 6fc7f10309
commit 0783fd9366

View file

@ -231,7 +231,7 @@ class IMAPTest < Test::Unit::TestCase
in_idle = false in_idle = false
exception_raised = false exception_raised = false
c = m.new_cond c = m.new_cond
@threads << Thread.start do raiser = Thread.start do
m.synchronize do m.synchronize do
until in_idle until in_idle
c.wait(0.1) c.wait(0.1)
@ -243,6 +243,7 @@ class IMAPTest < Test::Unit::TestCase
c.signal c.signal
end end
end end
@threads << raiser
imap.idle do |res| imap.idle do |res|
m.synchronize do m.synchronize do
in_idle = true in_idle = true
@ -260,6 +261,7 @@ class IMAPTest < Test::Unit::TestCase
imap.logout imap.logout
ensure ensure
imap.disconnect if imap imap.disconnect if imap
raiser.kill unless in_idle
end end
end end