docs: add orchestrator runtime concept page and board composition - #449
docs: add orchestrator runtime concept page and board composition#449rusty1968 wants to merge 1 commit into
Conversation
06c5a1a to
51b4dfa
Compare
|
Add to docs/src/SUMMARY.md: |
|
The runtime page says "The three share one
What actually keeps the loop live is the other half, which the page does not state: every decode and every effect executor returns promptly. That is why staging is a pump rather than a single transfer call. Could the page say that rule directly instead of deriving liveness from the shared wait? Two related questions:
|
|
The page says So today the same boot window is tracked twice, in two units ( The part that does break: the walkers are polled and nothing signals the loop on their behalf. If Which one is meant to survive? |
|
poll_boot_walks(now_millis) returns Event::Timeout(id) when a walk hits WalkVerdict::Failed (services/orchestrator/driver/src/driver.rs:150), so there is an edge from the driver back into dispatch that the picture does not show. Worth an arrow? |
| It gathers three possible inbound sources — **hardware interrupts** | ||
| (boot-progress lines the orchestrator owns directly), **IPC channels**, and |
There was a problem hiding this comment.
Is the boot monitoring really steered by hardware interrupts? Our trait based implementation as of now is naturally agnostic, but when we discussed this we talked about polling the GPIO lines, instead of waiting for real hardware interrupts handled by the hardware NVIC and ISRs.
I understand what you want to say by this, but if we are not relying on hardware inerrupts we should adapt the wording here.
| `Signals::USER` on a client channel to notify without a reply). The loop is | ||
| written once against "a member that signaled, or the deadline that lapsed," | ||
| never against a specific source; what differs between sources is only the | ||
| *decoder* that turns each into an `Event`. |
There was a problem hiding this comment.
What does this decoder look like and where is it defined?
| The runtime is a single-threaded loop parked in one place: a kernel | ||
| `object_wait` over a **wait group**. Every inbound source is registered once as a | ||
| *member* of that group (`wait_group_add`), and the wait returns whichever member | ||
| signaled. Each member resolves to at most one `Event`: |
There was a problem hiding this comment.
So what is the use case for a registered member to resolve to no Event?
If this is not the case, we should be precise and say
| signaled. Each member resolves to at most one `Event`: | |
| signaled. Each member maps to exactly one `Event`: |
| The unifying idea is the kernel **wait group**: interrupts and IPC are not | ||
| separate mechanisms but interchangeable *members* of one group, and a watchdog | ||
| deadline is that same wait's *timeout* — so all three collapse into the return | ||
| of one `object_wait(handle, signal_mask, deadline)`. A *signal* here is just a |
There was a problem hiding this comment.
Could we link the source defintiion/link to pigweed kernel upstream sources here?
Introduces a design page on the orchestrator runtime and how it turns hardware and IPC activity into the events the state machine consumes.