Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] Blocking calls handling #36

Open
wants to merge 1 commit into
base: indev
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions doc/blocking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Blocking calls handling

## Use case

1. The process wants to start a blocking operation (`sleep`, disk operation...).
Via an interrupt, it calls the corresponding function from the driver.
2. The driver launches the operation and keeps the pid of the process.
3. The driver calls `scheduler_wait_blocking`, with a callback to cancel the
operation as parameter (see below). The process is stopped and marked as
`WAITING`.
4. When the operation completes (usually via a hardware interrupt), the driver
calls `scheduler_wake_blocking` with the pid and a return value as parameter.
The process is marked as `READY`. Its saved value for `A` is set to the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure A is the correct register, as it gets reset by rfi

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's the return value from scheduler_wait_blocking, not from the interrupt

return value.
5. The execution of the process can restart from the line after the call to
`scheduler_wait_blocking`. The result code is the return value of
`scheduler_wait_blocking`.

## Scheduler

The scheduler only launches processes in the `READY` state. If none are
available, it runs `HLT`.

## Process end

If a process is killed while `WAITING`, the scheduler calls the callback with
the pid as parameter.