Bug #6278 ยป deadlock_detection_fix.patch
thread.c | ||
---|---|---|
th->priority = GET_THREAD()->priority;
|
||
th->thgroup = GET_THREAD()->thgroup;
|
||
th->spinlock_waiting_gvl = 0;
|
||
native_mutex_initialize(&th->interrupt_lock);
|
||
if (GET_VM()->event_hooks != NULL)
|
||
th->event_flags |= RUBY_EVENT_VM;
|
||
... | ... | |
}
|
||
GVL_UNLOCK_BEGIN();
|
||
interrupted = lock_func(th, mutex, timeout_ms);
|
||
th->spinlock_waiting_gvl = 1;
|
||
native_mutex_unlock(&mutex->lock);
|
||
GVL_UNLOCK_END();
|
||
th->spinlock_waiting_gvl = 0;
|
||
reset_unblock_function(th, &oldubf);
|
||
th->locking_mutex = Qfalse;
|
||
... | ... | |
GetMutexPtr(th->locking_mutex, mutex);
|
||
native_mutex_lock(&mutex->lock);
|
||
if (mutex->th == th || (!mutex->th && mutex->cond_waiting)) {
|
||
if (mutex->th == th || (!mutex->th && (mutex->cond_waiting || th->spinlock_waiting_gvl))) {
|
||
*found = 1;
|
||
}
|
||
native_mutex_unlock(&mutex->lock);
|
vm_core.h | ||
---|---|---|
rb_thread_lock_t interrupt_lock;
|
||
struct rb_unblock_callback unblock;
|
||
VALUE locking_mutex;
|
||
int spinlock_waiting_gvl;
|
||
struct rb_mutex_struct *keeping_mutexes;
|
||
struct rb_vm_tag *tag;
|