aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--thread.c11
-rw-r--r--thread_sync.c5
2 files changed, 11 insertions, 5 deletions
diff --git a/thread.c b/thread.c
index 8254c7dc0c..4a34081509 100644
--- a/thread.c
+++ b/thread.c
@@ -94,7 +94,8 @@ static ID id_locals;
enum SLEEP_FLAGS {
SLEEP_DEADLOCKABLE = 0x1,
- SLEEP_SPURIOUS_CHECK = 0x2
+ SLEEP_SPURIOUS_CHECK = 0x2,
+ SLEEP_BEFORE_CHECK_INTS = 0x4
};
static void sleep_timespec(rb_thread_t *, struct timespec, unsigned int fl);
@@ -1187,7 +1188,9 @@ sleep_forever(rb_thread_t *th, unsigned int fl)
status = fl & SLEEP_DEADLOCKABLE ? THREAD_STOPPED_FOREVER : THREAD_STOPPED;
th->status = status;
- RUBY_VM_CHECK_INTS_BLOCKING(th->ec);
+ if (!(fl & SLEEP_BEFORE_CHECK_INTS)) {
+ RUBY_VM_CHECK_INTS_BLOCKING(th->ec);
+ }
while (th->status == status) {
if (fl & SLEEP_DEADLOCKABLE) {
th->vm->sleeper++;
@@ -1293,7 +1296,9 @@ sleep_timespec(rb_thread_t *th, struct timespec ts, unsigned int fl)
getclockofday(&end);
timespec_add(&end, &ts);
th->status = THREAD_STOPPED;
- RUBY_VM_CHECK_INTS_BLOCKING(th->ec);
+ if (!(fl & SLEEP_BEFORE_CHECK_INTS)) {
+ RUBY_VM_CHECK_INTS_BLOCKING(th->ec);
+ }
while (th->status == THREAD_STOPPED) {
native_sleep(th, &ts);
woke = vm_check_ints_blocking(th->ec);
diff --git a/thread_sync.c b/thread_sync.c
index 5e511af0db..7b1054b2ac 100644
--- a/thread_sync.c
+++ b/thread_sync.c
@@ -438,7 +438,7 @@ rb_mutex_cleanup_keeping_mutexes(const rb_thread_t *current_thread)
static VALUE
rb_mutex_sleep_forever(VALUE time)
{
- rb_thread_sleep_deadly_allow_spurious_wakeup();
+ sleep_forever(GET_THREAD(), SLEEP_DEADLOCKABLE|SLEEP_BEFORE_CHECK_INTS);
return Qnil;
}
@@ -446,7 +446,8 @@ static VALUE
rb_mutex_wait_for(VALUE time)
{
struct timespec *t = (struct timespec*)time;
- sleep_timespec(GET_THREAD(), *t, 0); /* permit spurious check */
+ /* permit spurious check */
+ sleep_timespec(GET_THREAD(), *t, SLEEP_BEFORE_CHECK_INTS);
return Qnil;
}