/* Je saute à tous les coups la période d'exécution des taches bleu, même s'il n'y a pas de surcharge*/ module Rto (BLOCKED queue period_yield, BLOCKED queue blue_period_yield, BLOCKED queue blocked) { type signal_t = enum {SKIP_NEXT_COMPUTATION}; type color_t = enum {RED, BLUE}; process = { int skip; int skip_counter; color_t color; requires timer end_period; } void signal (process, signal_t); admission = { admission_criteria(int skip) = { (skip > 1) } } handler (event e) { On unblock.timer.end_period { e.target.skip_counter--; if (e.target.color == BLUE) { e.target.color = RED; e.target.skip_counter = e.target.skip; // signal the application to skip the previous blue computation signal(e.target,SKIP_NEXT_COMPUTATION); if (e.target in blue_period_yield) { e.target => period_yield; } } else { if (e.target.skip_counter <= 0) { e.target.color = BLUE; switch e.target in { case RUNNING, READY, period_yield: { e.target => blue_period_yield; } case BLOCKED, TERMINATED: { } } } } next(); } On unblock.preemptive, unblock.nonpreemptive { if (e.target in blocked && e.target.color == BLUE) { e.target => blue_period_yield; } next(); } } interface = { void attach (requires process p, int skip) { p.skip = skip; p.skip_counter = skip; p.color = RED; next(); } } }