Index: src/condition_amiga.m ================================================================== --- src/condition_amiga.m +++ src/condition_amiga.m @@ -83,30 +83,33 @@ { struct of_condition_waiting_task waitingTask = { .task = FindTask(NULL), .sigBit = AllocSignal(-1) }; + bool ret; if (waitingTask.sigBit == -1) return false; + + Forbid(); if (!of_mutex_unlock(mutex)) { FreeSignal(waitingTask.sigBit); return false; } - Forbid(); - waitingTask.next = condition->waitingTasks; condition->waitingTasks = &waitingTask; Wait(1 << waitingTask.sigBit); - Permit(); - FreeSignal(waitingTask.sigBit); - return true; + ret = of_mutex_lock(mutex); + + Permit(); + + return ret; } bool of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout) @@ -150,10 +153,11 @@ .tv_micro = (timeout - request.tr_time.tv_sec) * 1000000 #endif } }; ULONG mask; + bool ret; NewList(&port.mp_MsgList); if (waitingTask.sigBit == -1 || port.mp_SigBit == -1) goto fail; @@ -160,21 +164,24 @@ if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *)&request, 0) != 0) goto fail; - if (!of_mutex_unlock(mutex)) + Forbid(); + + if (!of_mutex_unlock(mutex)) { + Permit(); goto fail; - - Forbid(); + } waitingTask.next = condition->waitingTasks; condition->waitingTasks = &waitingTask; SendIO((struct IORequest *)&request); mask = Wait((1 << waitingTask.sigBit) | (1 << port.mp_SigBit)); + ret = of_mutex_lock(mutex); condition->waitingTasks = waitingTask.next; if (!CheckIO((struct IORequest *)&request)) { AbortIO((struct IORequest *)&request); @@ -188,11 +195,11 @@ goto fail; FreeSignal(waitingTask.sigBit); FreeSignal(port.mp_SigBit); - return true; + return ret; fail: if (waitingTask.sigBit != -1) FreeSignal(waitingTask.sigBit); if (port.mp_SigBit != -1)