default virtual_scheduler Fixed_priority6 = { scheduler = { int importance; } /* int total_count = 0; */ states = { RUNNING running : scheduler; READY ready : select queue; READY yield : private scheduler; BLOCKED blocked : queue; } ordering_criteria = { highest importance } handler (event e) { On unblock.preemptive, unblock.timer.* { scheduler nxt = schedulerOf(e.target); if (nxt in blocked) { nxt => forwardImmediate(); if (nxt in ready && !empty(running) && nxt > running) { running => ready; } } else { nxt => forwardImmediate(); } } On system.clocktick { running => forwardImmediate (); } On block.*, process.end, unblock.nonpreemptive, process.new.wake, process.new.sleep { schedulerOf(e.target) => forwardImmediate(); } On preempt { running => forwardImmediate(); } On yield.system.immediate.* { if (schedulerOf(e.target) in running) { running => forwardImmediate(); } } On yield.system.pause.*, yield.user.* { if (schedulerOf(e.target) in running) { scheduler s = running; bool toyield = !empty(ready); s => forwardImmediate(); if (toyield) { s => yield; } } } On bossa.schedule { if (empty(ready)) { yield => ready; } select() => forwardImmediate(); if (!empty(yield)) { yield => ready; } } } interface = { void attach(scheduler s, int importance) { s.importance = importance; } void detach (scheduler s) { } void setImportance (scheduler s, int priority) { s.importance = priority; switch s in { case running: { if (!empty(ready) && select() > running) { running => ready; // preempt running } } case ready: { if (!empty(running) && (s > running)) { running => ready; // preempt running } } case blocked, yield: { } // nothing to do } } } /* function = { exported void yet_another_report(int x) { total_count += x; } exported void report(int x) { total_count += x; } exported void another_report(int x) { total_count += x; } } */ }