static void gvl_yield(rb_vm_t *vm, rb_thread_t *th) { native_mutex_lock(&vm->gvl.lock); gvl_release_common(vm); /* An another thread is processing GVL yield. */ if (UNLIKELY(vm->gvl.wait_yield)) { while (vm->gvl.wait_yield) native_cond_wait(&vm->gvl.switch_wait_cond, &vm->gvl.lock); goto acquire; } if (vm->gvl.waiting > 0) { /* Wait until another thread task take GVL. */ vm->gvl.need_yield = 1; vm->gvl.wait_yield = 1; while (vm->gvl.need_yield) native_cond_wait(&vm->gvl.switch_cond, &vm->gvl.lock); vm->gvl.wait_yield = 0; } else { native_mutex_unlock(&vm->gvl.lock); sched_yield(); native_mutex_lock(&vm->gvl.lock); } native_cond_broadcast(&vm->gvl.switch_wait_cond); acquire: gvl_acquire_common(vm); native_mutex_unlock(&vm->gvl.lock); }
static void lock_interrupt(void *ptr) { rb_mutex_t *mutex = (rb_mutex_t *)ptr; native_mutex_lock(&mutex->lock); if (mutex->cond_waiting > 0) native_cond_broadcast(&mutex->cond); native_mutex_unlock(&mutex->lock); }
int NdbCondition_Broadcast(struct NdbCondition* p_cond) { int result; if (p_cond == NULL) return 1; result = native_cond_broadcast(&p_cond->cond); return result; }