//we will need to wait some more.
if (ticks_to_wait != portMAX_DELAY) {
ticks_remaining = ticks_end - xTaskGetTickCount();
+
+ // ticks_remaining will always be less than or equal to the original ticks_to_wait,
+ // unless the timeout is reached - in which case it unsigned underflows to a much
+ // higher value.
+ //
+ // (Check is written this non-intuitive way to allow for the case where xTaskGetTickCount()
+ // has overflowed but the ticks_end value has not overflowed.)
+ if(ticks_remaining > ticks_to_wait) {
+ //Timeout, but there is not enough free space for the item that need to be sent.
+ xSemaphoreGive(rb->free_space_sem);
+ return pdFALSE;
+ }
}
- // ticks_remaining will always be less than or equal to the original ticks_to_wait,
- // unless the timeout is reached - in which case it unsigned underflows to a much
- // higher value.
- //
- // (Check is written this non-intuitive way to allow for the case where xTaskGetTickCount()
- // has overflowed but the ticks_end value has not overflowed.)
}
- } while (ringbufferFreeMem(rb) < needed_size && ticks_remaining > 0 && ticks_remaining <= ticks_to_wait);
+ } while (ringbufferFreeMem(rb) < needed_size);
//Lock the mux in order to make sure no one else is messing with the ringbuffer and do the copy.
portENTER_CRITICAL(&rb->mux);