51,7 → 51,10 |
/*+ Status used in the level +*/ |
#define MPEGSTAR_READY MODULE_STATUS_BASE |
|
/*+ the level redefinition for the Round Robin level +*/ |
#define FRAME_IDLE 0 |
#define FRAME_DECODING 1 |
#define FRAME_SKIPPED 2 |
|
typedef struct { |
level_des l; /*+ the standard level descriptor +*/ |
|
60,6 → 63,7 |
|
int budget; |
int current; |
int status; |
|
int scheduling_level; |
|
87,6 → 91,7 |
if (lev->current != NIL) return -1; |
|
lev->current = p; |
lev->status = FRAME_IDLE; |
|
proc_table[p].avail_time = lev->server_Q; |
proc_table[p].wcet = lev->server_Q; |
114,6 → 119,7 |
static void MPEGSTAR_public_epilogue(LEVEL l, PID p) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
int r; |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MS:Epi:%d)",p); |
121,7 → 127,21 |
|
level_table[ lev->scheduling_level ] -> |
private_epilogue(lev->scheduling_level,p); |
|
|
r = SERVER_get_remain_capacity(lev->scheduling_level,lev->budget); |
if (r < 0) { |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MS:FRAME SKIP %d)",p); |
#endif |
|
lev->status = FRAME_SKIPPED; |
|
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level, p); |
|
} |
|
} |
|
static void MPEGSTAR_public_activate(LEVEL l, PID p) |
135,6 → 155,8 |
kern_printf("(MP:Act:%d:%d)",p,lev->budget); |
#endif |
|
lev->status = FRAME_DECODING; |
|
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&b); |
|
165,6 → 187,8 |
kern_printf("(MS:EndCycle:%d)",p); |
#endif |
|
lev->status = FRAME_IDLE; |
|
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level, p); |
|
196,7 → 220,9 |
kern_printf("(MS:End:%d)", p); |
#endif |
|
lev->current = NIL; proc_table[p].status = FREE; |
lev->current = NIL; |
lev->status = FRAME_IDLE; |
proc_table[p].status = FREE; |
|
} |
|
226,6 → 252,7 |
|
lev->budget = NIL; |
lev->current = NIL; |
lev->status = FRAME_IDLE; |
lev->server_Q = 0; |
lev->server_T = 0; |
|
285,7 → 312,19 |
return SERVER_get_remain_capacity(fsf_get_server_level(),budget); |
} |
|
int MPEGSTAR_get_last_reclaiming() |
int MPEGSTAR_get_last_reclaiming(int budget) |
{ |
return SERVER_get_last_reclaiming(fsf_get_server_level(),exec_shadow); |
} |
|
int MPEGSTAR_is_frame_skipped(int budget) |
{ |
LEVEL l = SERVER_get_local_scheduler_level_from_budget(fsf_get_server_level(),budget); |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
if (lev->status == FRAME_SKIPPED) |
return 1; |
else |
return 0; |
|
} |