Project

General

Profile

Bug #4723 » 0001-remove-transition_for_lock.patch

kosaki (Motohiro KOSAKI), 05/17/2011 10:48 PM

View differences:

thread.c
{
int interrupted = 0;
int err = 0;
native_mutex_lock(&mutex->lock);
th->transition_for_lock = 0;
mutex->cond_waiting++;
for (;;) {
......
}
}
mutex->cond_waiting--;
th->transition_for_lock = 1;
native_mutex_unlock(&mutex->lock);
return interrupted;
}
......
set_unblock_function(th, lock_interrupt, mutex, &oldubf);
th->status = THREAD_STOPPED_FOREVER;
th->vm->sleeper++;
th->locking_mutex = self;
native_mutex_lock(&mutex->lock);
th->vm->sleeper++;
/*
* Carefully! while some contended threads are in lock_fun(),
* Carefully! while some contended threads are in lock_func(),
* vm->sleepr is unstable value. we have to avoid both deadlock
* and busy loop.
*/
if (vm_living_thread_num(th->vm) == th->vm->sleeper) {
timeout_ms = 100;
}
GVL_UNLOCK_BEGIN();
interrupted = lock_func(th, mutex, timeout_ms);
native_mutex_unlock(&mutex->lock);
GVL_UNLOCK_END();
th->transition_for_lock = 1;
BLOCKING_REGION_CORE({
interrupted = lock_func(th, mutex, timeout_ms);
});
th->transition_for_lock = 0;
remove_signal_thread_list(th);
reset_unblock_function(th, &oldubf);
th->locking_mutex = Qfalse;
......
rb_thread_t *th;
GetThreadPtr(thval, th);
if (th->status != THREAD_STOPPED_FOREVER || RUBY_VM_INTERRUPTED(th) || th->transition_for_lock) {
if (th->status != THREAD_STOPPED_FOREVER || RUBY_VM_INTERRUPTED(th)) {
*found = 1;
}
else if (th->locking_mutex) {
......
rb_thread_t *th;
GetThreadPtr(thval, th);
printf("th:%p %d %d %d", th, th->status, th->interrupt_flag, th->transition_for_lock);
printf("th:%p %d %d", th, th->status, th->interrupt_flag);
if (th->locking_mutex) {
mutex_t *mutex;
GetMutexPtr(th->locking_mutex, mutex);
vm_core.h
struct rb_unblock_callback unblock;
VALUE locking_mutex;
struct rb_mutex_struct *keeping_mutexes;
int transition_for_lock;
struct rb_vm_tag *tag;
struct rb_vm_protect_tag *protect_tag;
    (1-1/1)