| 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. |