summaryrefslogtreecommitdiffstats
path: root/rsnix/src/sched.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-21 20:13:59 +0200
committersalmonik <salmonik@tuta.io>2026-08-21 20:13:59 +0200
commit2f4cf666c0c7bd224932fa48973e7334360c1de3 (patch)
tree7526314b18728b05c4e9d285b9a41cf6fcd6d6d6 /rsnix/src/sched.rs
parentimage: single dd-able system.img replaces vvfat+data-disk pair (diff)
downloadrs-dos-2f4cf666c0c7bd224932fa48973e7334360c1de3.tar.gz
rs-dos-2f4cf666c0c7bd224932fa48973e7334360c1de3.zip
input: total keyboard routing + per-terminal discipline (ADR 0006 ph1)
wm: FOCUSED is now a plain window id — window 0 (home terminal) is an ordinary focusable window in the z-order. The CONSOLE sentinel (usize::MAX) and the focused()==0 special cases are gone; focus_console() is an alias for focus(0). Desktop clicks focus window 0. The WM input pump routes every key unconditionally: IRQ ring -> pump -> focused window's owner; nothing polls the scancode rings directly any more. tty: read_line() reads from the calling task's message queue (the old global-ring read_line and the duplicate read_line_from_queue are merged); raw mode (read_byte/try_read_byte) consumes the same queue; interrupt_pressed drains the queue instead of the ring. shell: task 0 owns home terminal window 0 and blocks on its queue like a windowed shell; cat/hexdump stdin paths pass the home terminal handle. sched: watchdog comments updated (shell parks on recv_blocking). Verified in QEMU: F1 spawns terminals, F2 cycles focus home->term1-> term2, keystrokes land only in the focused window, ^C cancels a line, edit runs raw over the queue and exits to a working prompt; test-disk regression PASS.
Diffstat (limited to 'rsnix/src/sched.rs')
-rw-r--r--rsnix/src/sched.rs13
1 files changed, 7 insertions, 6 deletions
diff --git a/rsnix/src/sched.rs b/rsnix/src/sched.rs
index 39ecb65..0c4938e 100644
--- a/rsnix/src/sched.rs
+++ b/rsnix/src/sched.rs
@@ -201,7 +201,7 @@ const WATCHDOG_SPIN_TICKS: u32 = 1500;
201const WATCHDOG_BOOT_SPIN_TICKS: u32 = 750; 201const WATCHDOG_BOOT_SPIN_TICKS: u32 = 750;
202 202
203/// True once the shell REPL is live (set by main.rs before shell::run()). 203/// True once the shell REPL is live (set by main.rs before shell::run()).
204/// The shell legitimately parks in poll_key with a fixed frame when it is; 204/// The shell legitimately blocks on its message queue once live;
205/// before that, task 0 running boot code must not sit in a fixed frame. 205/// before that, task 0 running boot code must not sit in a fixed frame.
206static SHELL_RUNNING: AtomicBool = AtomicBool::new(false); 206static SHELL_RUNNING: AtomicBool = AtomicBool::new(false);
207 207
@@ -264,16 +264,17 @@ pub fn on_tick(cur: usize) -> usize {
264 TASKS[CURRENT].ticks += 1; 264 TASKS[CURRENT].ticks += 1;
265 // Spin detection: a task whose interrupted frame never moves 265 // Spin detection: a task whose interrupted frame never moves
266 // (identical RSP on every tick) is stuck in a hot loop — no yield, 266 // (identical RSP on every tick) is stuck in a hot loop — no yield,
267 // no sleep, no block. The shell (id 0) legitimately parks in 267 // no sleep, no block. The shell (id 0) legitimately blocks on
268 // poll_key with a fixed frame, and idle (id 1) hlt's; both exempt. 268 // recv_blocking with a fixed frame, and idle (id 1) hlt's; both
269 // exempt.
269 let id = CURRENT; 270 let id = CURRENT;
270 let w = &mut SPIN_WATCH[id]; 271 let w = &mut SPIN_WATCH[id];
271 if w.last_rsp == cur { 272 if w.last_rsp == cur {
272 w.same += 1; 273 w.same += 1;
273 // Background tasks (id >= 2): spinning is never legitimate. 274 // Background tasks (id >= 2): spinning is never legitimate.
274 // Task 0 (shell): exempt once the REPL is live (poll_key parks 275 // Task 0 (shell): exempt once the REPL is live (recv_blocking
275 // with a fixed frame); during the boot phase a fixed frame 276 // parks with a fixed frame); during the boot phase a fixed
276 // means usb/ehci init is wedged on real hardware. 277 // frame means usb/ehci init is wedged on real hardware.
277 let threshold = if id == SHELL_TID && !SHELL_RUNNING.load(Ordering::Relaxed) { 278 let threshold = if id == SHELL_TID && !SHELL_RUNNING.load(Ordering::Relaxed) {
278 WATCHDOG_BOOT_SPIN_TICKS 279 WATCHDOG_BOOT_SPIN_TICKS
279 } else if id >= 2 { 280 } else if id >= 2 {