46,7 → 46,7 |
#include "mpegstar.h" |
#include "fsf_server.h" |
|
#define MPEGSTAR_DEBUG |
//#define MPEGSTAR_DEBUG |
|
/*+ Status used in the level +*/ |
#define MPEGSTAR_READY MODULE_STATUS_BASE |
58,12 → 58,23 |
int server_Q; |
int server_T; |
|
int budget[MAX_PROC]; |
int budget; |
int current; |
|
int scheduling_level; |
int cap_lev; |
|
} MPEGSTAR_level_des; |
|
|
|
static void capacity_handler(void *l) |
{ |
MPEGSTAR_level_des *lev = l; |
lev->cap_lev = NIL; |
event_need_reschedule(); |
} |
|
static int MPEGSTAR_public_eligible(LEVEL l, PID p) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
80,24 → 91,39 |
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MP:Crt:%d)",p); |
#endif |
|
if (m->pclass != NRT_PCLASS) return -1; |
|
if (m->pclass != HARD_PCLASS) return -1; |
if (m->level != 0 && m->level != l) return -1; |
|
lev->current = p; |
|
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); |
|
proc_table[p].wcet = lev->server_Q; |
proc_table[p].control = (proc_table[p].control & ~CONTROL_CAP); |
|
return 0; /* OK */ |
|
} |
|
static void MPEGSTAR_public_dispatch(LEVEL l, PID p, int nostop) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
struct timespec ty; |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MS:Dsp:%d)",p); |
#endif |
|
if (!nostop) { |
TIMESPEC_ASSIGN(&ty, &schedule_time); |
|
/* ...and finally, we have to post a capacity event on exec task because the shadow_task consume |
* capacity on exe task always */ |
ADDUSEC2TIMESPEC(proc_table[p].avail_time ,&ty); |
lev->cap_lev = kern_event_post(&ty,capacity_handler, lev); |
level_table[ lev->scheduling_level ] -> |
private_dispatch(lev->scheduling_level, p, nostop); |
} |
|
} |
|
104,7 → 130,15 |
static void MPEGSTAR_public_epilogue(LEVEL l, PID p) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
if (lev->cap_lev!=NIL) { |
kern_event_delete(lev->cap_lev); |
lev->cap_lev=NIL; |
} |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MS:Epi:%d)",p); |
#endif |
|
level_table[ lev->scheduling_level ] -> |
private_epilogue(lev->scheduling_level,p); |
|
114,10 → 148,11 |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
BUDGET_TASK_MODEL b; |
budget_task_default_model(b, lev->budget[p]); |
|
budget_task_default_model(b, lev->budget); |
|
#ifdef MPEGSTAR_DEBUG |
kern_printf("(MP:Act:%d:%d)",p,lev->budget[p]); |
kern_printf("(MP:Act:%d:%d)",p,lev->budget); |
#endif |
|
level_table[ lev->scheduling_level ]-> |
146,7 → 181,19 |
/* Task EndCycle */ |
case (long)(NULL): |
|
lev->current = NIL; |
|
kern_printf("(Ext %d)",p); |
|
if (lev->cap_lev != NIL) { |
kern_event_delete(lev->cap_lev); |
lev->cap_lev = NIL; |
} |
|
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level, p); |
|
level_table[ lev->scheduling_level ]-> |
public_message(lev->scheduling_level, p, NULL); |
|
break; |
180,7 → 227,6 |
{ |
LEVEL l; /* the level that we register */ |
MPEGSTAR_level_des *lev; /* for readableness only */ |
int i; |
|
l = level_alloc_descriptor(sizeof(MPEGSTAR_level_des)); |
|
197,8 → 243,8 |
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->budget = NIL; |
lev->current = NIL; |
|
lev->scheduling_level = master; |
|
211,7 → 257,7 |
|
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
lev->budget[p] = budget; |
lev->budget = budget; |
|
return 0; |
|
222,19 → 268,30 |
|
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
return lev->budget[p]; |
return lev->budget; |
|
} |
|
int MPEGSTAR_budget_has_thread(LEVEL l, int budget) |
{ |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
|
if (lev->budget == budget) return 1; |
return 0; |
|
} |
|
int MPEGSTAR_rescale(LEVEL l, TIME Q, TIME T) |
{ |
|
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; |
|
|
SERVER_adjust_budget(lev->scheduling_level,Q,T,lev->budget); |
lev->server_Q = Q; |
lev->server_T = T; |
if (lev->current != NIL) { |
proc_table[lev->current].avail_time = Q; |
proc_table[lev->current].wcet = Q; |
} |
|
return 0; |
|
} |