Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 333 → Rev 334

/shark/trunk/ports/first/modules/mpegstar.c
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;
}