Thread::signal_wait() status gets overwritten

29 May 2018

Thread::signal_wait seems to be erroneous:

Thread.cpp

osEvent Thread::signal_wait(int32_t signals, uint32_t millisec) {
    uint32_t res;
    osEvent evt;
    uint32_t options = osFlagsWaitAll;
    if (signals == 0) {
        options = osFlagsWaitAny;
        signals = 0x7FFFFFFF;
    }
    res = osThreadFlagsWait(signals, options, millisec);
    if (res & osFlagsError) {
        switch (res) {
            case osFlagsErrorISR:
                evt.status = osErrorISR;
                break;
            case osFlagsErrorResource:
                evt.status = osOK;
                break;
            case osFlagsErrorTimeout:
                evt.status = (osStatus)osEventTimeout;
                break;
            case osFlagsErrorParameter:
            default:
                evt.status = (osStatus)osErrorValue;
                break;
        }
    }
    evt.status = (osStatus)osEventSignal;
    evt.value.signals = res;

    return evt;
}

When a osFlagsError occurs, evt.status is written, but the break afterwards jumps to evt.status = (osStatus)osEventSignal;

A return statement before the closing } if-bracket would solve the problem (maybe clear evt.value.signals to 0 first).