Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 337 → Rev 338

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