blob: 9d56b2bacd43e4dc76045d12f852ff85fac1a3d5 [file] [log] [blame] [view]
Timeouts in CHERIoT-RTOS
========================
CHERIoT RTOS aims to provide a consistent notion of timeout for APIs.
Ticks
-----
Timeouts are described in terms of 'ticks'.
A tick is the time between two scheduling events, bounded by a time specified in the [board description file](BoardDescriptions.md).
In the current scheduler design, the hardware timer fires once every tick and performs a context switch.
A future tickless design will likely adjust this slightly and redefine a tick an upper bound on a scheduler operation, such that a voluntary yield causes a tick to finish early.
The macros in [`tick_macros.h`](../sdk/include/tick_macros.h) provide helpers for converting between ticks and milliseconds.
These are approximate and code that has strong timing requirements should query a timer after waking from a timeout.
Timeouts
--------
Timeouts are described by the `Timeout` structure in [`timeout.h`](../sdk/include/timeout.h).
These describe the number of ticks that *have* elapsed and the number of ticks remaining that *may* elapse before a timeout occurs.
The special value `UnlimitedTimeout` indicates that an unbounded number of ticks may elapse.
Each function that may block should take a pointer to a `Timeout` structure.
This API structure is intended to allow chaining.
The same `Timeout*` is passed to any scheduler API that can suspend the calling thread and will time out if the remaining number reaches zero.
The caller may then inspect the `elapsed` field to see how many ticks have elapsed while blocking.
Note that the `elapsed` number of ticks at the end of a blocking operation may exceed the initial `remaining` value (i.e. the maximum timeout).
When a timeout expires, the thread becomes runnable but a higher-priority thread may still prevent it from running.