module Basic(RUNNING process running, READY select queue ready, READY process yield, BLOCKED queue blocked, TERMINATED terminated) { handler (event e) { On yield.system.pause.*, yield.user.* { e.target => yield; } On yield.system.immediate.* { if (e.target in running) { e.target => ready; } } On process.new { e.target => ready; } On process.end { e.target => terminated; } On block.* { e.target => blocked; } On unblock.preemptive { if (e.target in blocked) { e.target => ready; } } On unblock.nonpreemptive { if (e.target in blocked) { e.target => ready; } } On preempt { running => ready; } On bossa.schedule { if (empty(ready)) { yield => ready; } select() => running; if (!empty(yield)) { yield => ready; } } } interface = { void attach (process p) { p => ready; } void detach (process p) { } } }