@@ -25,44 +25,44 @@ #include #ifndef OF_AMIGAOS4 # include #endif -bool +int of_condition_new(of_condition_t *condition) { condition->waitingTasks = NULL; - return true; + return 0; } -bool +int of_condition_signal(of_condition_t *condition) { Forbid(); @try { if (condition->waitingTasks == NULL) - return true; + return 0; Signal(condition->waitingTasks->task, (1ul << condition->waitingTasks->sigBit)); condition->waitingTasks = condition->waitingTasks->next; } @finally { Permit(); } - return true; + return 0; } -bool +int of_condition_broadcast(of_condition_t *condition) { Forbid(); @try { if (condition->waitingTasks == NULL) - return true; + return 0; while (condition->waitingTasks != NULL) { Signal(condition->waitingTasks->task, (1ul << condition->waitingTasks->sigBit)); @@ -70,77 +70,73 @@ } } @finally { Permit(); } - return true; + return 0; } -bool +int of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) { ULONG signalMask = 0; return of_condition_wait_or_signal(condition, mutex, &signalMask); } -bool +int of_condition_wait_or_signal(of_condition_t *condition, of_mutex_t *mutex, ULONG *signalMask) { struct of_condition_waiting_task waitingTask = { .task = FindTask(NULL), .sigBit = AllocSignal(-1) }; - bool ret; + int error = 0; ULONG mask; - if (waitingTask.sigBit == -1) { - errno = EAGAIN; - return false; - } + if (waitingTask.sigBit == -1) + return EAGAIN; Forbid(); - if (!of_mutex_unlock(mutex)) { + if ((error = of_mutex_unlock(mutex)) != 0) { FreeSignal(waitingTask.sigBit); - return false; + return error; } waitingTask.next = condition->waitingTasks; condition->waitingTasks = &waitingTask; mask = Wait((1ul << waitingTask.sigBit) | *signalMask); if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) - ret = of_mutex_lock(mutex); - else { + error = of_mutex_lock(mutex); + else /* * This should not happen - it means something interrupted the * Wait(), so the best we can do is return EINTR. */ - ret = false; - errno = EINTR; - } + error = EINTR; FreeSignal(waitingTask.sigBit); Permit(); - return ret; + return error; } -bool +int of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout) { ULONG signalMask = 0; return of_condition_timed_wait_or_signal(condition, mutex, timeout, &signalMask); } -bool +int of_condition_timed_wait_or_signal(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout, ULONG *signalMask) { struct of_condition_waiting_task waitingTask = { .task = FindTask(NULL), @@ -180,29 +176,29 @@ .tv_sec = (ULONG)timeout, .tv_micro = (timeout - request.tr_time.tv_sec) * 1000000 #endif } }; + int error = 0; ULONG mask; - bool ret; NewList(&port.mp_MsgList); if (waitingTask.sigBit == -1 || port.mp_SigBit == -1) { - errno = EAGAIN; + error = EAGAIN; goto fail; } if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *)&request, 0) != 0) { - errno = EAGAIN; + error = EAGAIN; goto fail; } Forbid(); - if (!of_mutex_unlock(mutex)) { + if ((error = of_mutex_unlock(mutex)) != 0) { Permit(); goto fail; } waitingTask.next = condition->waitingTasks; @@ -211,22 +207,19 @@ SendIO((struct IORequest *)&request); mask = Wait((1ul << waitingTask.sigBit) | (1ul << port.mp_SigBit) | *signalMask); if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) - ret = of_mutex_lock(mutex); - else if (mask & (1ul << port.mp_SigBit)) { - ret = false; - errno = ETIMEDOUT; - } else { + error = of_mutex_lock(mutex); + else if (mask & (1ul << port.mp_SigBit)) + error = ETIMEDOUT; + else /* * This should not happen - it means something interrupted the * Wait(), so the best we can do is return EINTR. */ - ret = false; - errno = EINTR; - } + error = EINTR; condition->waitingTasks = waitingTask.next; if (!CheckIO((struct IORequest *)&request)) { AbortIO((struct IORequest *)&request); @@ -234,34 +227,27 @@ } CloseDevice((struct IORequest *)&request); Permit(); - FreeSignal(waitingTask.sigBit); - FreeSignal(port.mp_SigBit); - - return ret; - fail: if (waitingTask.sigBit != -1) FreeSignal(waitingTask.sigBit); if (port.mp_SigBit != -1) FreeSignal(port.mp_SigBit); - return false; + return error; } -bool +int of_condition_free(of_condition_t *condition) { Forbid(); @try { - if (condition->waitingTasks != NULL) { - errno = EBUSY; - return false; - } + if (condition->waitingTasks != NULL) + return EBUSY; } @finally { Permit(); } - return true; + return 0; }