thread_sync.c (do_sleep): avoid thread-switch/interrupt check

Calling rb_mutex_sleep directly should avoid
thread-switching/interrupt checking which can lead to occasional
failures.

Unfortunately, this means overriding Mutex#sleep is no longer
supported.  Will let this commit run for a bit see if CI failures
from ConditionVariable specs continue...

cf. https://rubyci.org/logs/rubyci.s3.amazonaws.com/ubuntu/ruby-trunk/log/20180817T213003Z.fail.html.gz

[ruby-core:88524] [Bug #14999]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64436 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-18 04:24:31 +00:00
Родитель 38f137276d
Коммит d7ddbff295
1 изменённых файлов: 6 добавлений и 0 удалений

Просмотреть файл

@ -1358,6 +1358,12 @@ static VALUE
do_sleep(VALUE args)
{
struct sleep_call *p = (struct sleep_call *)args;
if (rb_obj_class(p->mutex) == rb_cMutex) {
return rb_mutex_sleep(p->mutex, p->timeout);
}
/* FIXME: Mutex_m may still check interrupts here */
return rb_funcallv(p->mutex, id_sleep, 1, &p->timeout);
}