54,7 → 54,12 |
/*+ the level redefinition for the Round Robin level +*/ |
typedef struct { |
level_des l; /*+ the standard level descriptor +*/ |
|
|
int server_Q; |
int server_T; |
|
int budget[MAX_PROC]; |
|
int scheduling_level; |
|
} MPEGSTAR_level_des; |
72,6 → 77,18 |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MP:Crt:%d)",p); |
#endif |
|
if (m->pclass != NRT_PCLASS) return -1; |
if (m->level != 0 && m->level != l) return -1; |
|
proc_table[p].avail_time = lev->server_Q; |
proc_table[p].wcet = lev->server_Q; |
|
proc_table[p].control = (proc_table[p].control & ~CONTROL_CAP); |
|
return 0; /* OK */ |
} |
|
79,11 → 96,17 |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
level_table[ lev->scheduling_level ] -> |
private_dispatch(lev->scheduling_level, p, nostop); |
|
} |
|
static void MPEGSTAR_public_epilogue(LEVEL l, PID p) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
level_table[ lev->scheduling_level ] -> |
private_epilogue(lev->scheduling_level,p); |
|
} |
|
90,7 → 113,16 |
static void MPEGSTAR_public_activate(LEVEL l, PID p) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
BUDGET_TASK_MODEL b; |
budget_task_default_model(b, lev->budget[p]); |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MP:Act:%d:%d)",p,lev->budget[p]); |
#endif |
|
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&b); |
|
} |
|
static void MPEGSTAR_public_unblock(LEVEL l, PID p) |
114,6 → 146,9 |
/* Task EndCycle */ |
case (long)(NULL): |
|
level_table[ lev->scheduling_level ]-> |
public_message(lev->scheduling_level, p, NULL); |
|
break; |
|
/* Task Disable */ |
141,10 → 176,11 |
|
/*+ Registration function: |
TIME slice the slice for the Round Robin queue +*/ |
LEVEL MPEGSTAR_register_level() |
LEVEL MPEGSTAR_register_level(int master) |
{ |
LEVEL l; /* the level that we register */ |
MPEGSTAR_level_des *lev; /* for readableness only */ |
int i; |
|
l = level_alloc_descriptor(sizeof(MPEGSTAR_level_des)); |
|
161,6 → 197,44 |
lev->l.public_message = MPEGSTAR_public_message; |
lev->l.public_eligible = MPEGSTAR_public_eligible; |
|
for (i=0;i<MAX_PROC;i++) |
lev->budget[i] = NIL; |
|
lev->scheduling_level = master; |
|
return l; |
|
} |
|
int MPEGSTAR_setbudget(LEVEL l, PID p, int budget) |
{ |
|
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
lev->budget[p] = budget; |
|
return 0; |
|
} |
|
int MPEGSTAR_getbudget(LEVEL l, PID p) |
{ |
|
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
return lev->budget[p]; |
|
} |
|
int MPEGSTAR_budget_has_thread(LEVEL l, int budget) |
{ |
|
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
int i; |
|
for(i = 0; i< MAX_PROC; i++) |
if (lev->budget[i] == budget) return 1; |
|
return 0; |
|
} |