Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 226 → Rev 234

/shark/trunk/ports/first/modules/cbsstar.c
74,9 → 74,7
LEVEL loc_sched_level; /* Local scheduler level */
PID current; /* the task currently put in execution */
int flags;
int overran; /* overran flag */
 
IQUEUE tasks; /* a FIFO queue for the tasks handled
using the budget */
115,7 → 113,6
#endif
 
b->dline_timer = NIL;
b->overran = 0;
 
/* we modify the deadline according to rule 4 ... */
/* there is a while because if the wcet is << than the system tick
156,14 → 153,9
event_need_reschedule();
 
}
} else
if (b->current != NIL && b->avail > 0) {
#ifdef CBSSTAR_DEBUG
cbsstar_printf("#");
#endif
}
}
if (b->flags == CBSSTAR_NOACTIVE && b->dline_timer != NIL) {
if (b->flags == CBSSTAR_NOACTIVE) {
kern_gettime(&b->dline);
ADDUSEC2TIMESPEC(b->T, &b->dline);
186,19 → 178,7
activating a new task or an old task... */
 
/* check 1: if the deadline is before than the actual scheduling time */
 
/* check 2: if ( avail_time >= (cbs_dline - acttime)* (wcet/period) )
(rule 7 in the CBS article!) */
TIME t;
struct timespec t2,t3;
 
t = (b->T * b->avail) / b->Q;
t3.tv_sec = t / 1000000;
t3.tv_nsec = (t % 1000000) * 1000;
 
SUBTIMESPEC(&b->dline, acttime, &t2);
if (/* 1 */ TIMESPEC_A_LT_B(&b->dline, acttime) ||
/* 2 */ TIMESPEC_A_GT_B(&t3, &t2) ) {
if (TIMESPEC_A_LT_B(&b->dline, acttime)) {
TIMESPEC_ASSIGN(&b->dline, acttime);
ADDUSEC2TIMESPEC(b->T, &b->dline);
}
212,9 → 192,6
/* record the current task inserted in the master module */
b->current = p;
 
/* reset overran flag */
b->overran = 0;
 
job_task_default_model(job, b->dline);
job_task_def_noexc(job);
level_table[ lev->scheduling_level ]->
227,8 → 204,6
struct timespec ty;
TIME tx;
struct budget_struct *b = &lev->b[lev->tb[p]];
TIME t;
struct timespec t2,t3, acttime;
 
if (lev->cap_lev != NIL && b->current == p) {
kern_event_delete(lev->cap_lev);
235,30 → 210,18
lev->cap_lev = NIL;
}
 
kern_gettime(&acttime);
 
t = (b->T * b->avail) / b->Q;
t3.tv_sec = t / 1000000;
t3.tv_nsec = (t % 1000000) * 1000;
 
SUBTIMESPEC(&b->dline, &acttime, &t2);
SUBTIMESPEC(&schedule_time, &cap_lasttime, &ty);
tx = TIMESPEC2USEC(&ty);
lev->b[lev->tb[p]].avail -= tx;
b->avail -= tx;
 
#ifdef CBSSTAR_DEBUG
cbsstar_printf2("(CS:Cap p%d av=%d)", p, lev->b[lev->tb[p]].avail);
kern_printf("(CS:Cap p%d av=%d)", p, b->avail);
#endif
 
if (lev->b[lev->tb[p]].avail <= 0 || TIMESPEC_A_GT_B(&t3, &t2)) {
lev->b[lev->tb[p]].avail = 0;
lev->b[lev->tb[p]].flags = CBSSTAR_NOACTIVE;
}
if (b->avail <= 0) b->flags = CBSSTAR_NOACTIVE;
 
if (TIMESPEC_A_LT_B(&b->dline, &schedule_time)) {
/* we modify the deadline ... */
b->overran = 1;
TIMESPEC_ASSIGN(&b->dline, &schedule_time);
ADDUSEC2TIMESPEC(b->T, &b->dline);
}
319,7 → 282,6
level_table[ lev->scheduling_level ]->
private_extract(lev->scheduling_level, p);
/* we modify the deadline ... */
b->overran = 1;
TIMESPEC_ASSIGN(&b->dline, &schedule_time);
ADDUSEC2TIMESPEC(b->T, &b->dline);
 
488,7 → 450,6
private_extract(lev->scheduling_level, p);
 
iq_insertfirst(p, &b->tasks);
 
b->current = NIL;
}
637,15 → 598,6
 
}
 
int CBSSTAR_was_budget_overran(LEVEL l, int budget)
{
 
CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
 
return lev->b[budget].overran;
 
}
 
int CBSSTAR_is_active(LEVEL l, int budget)
{
CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
/shark/trunk/ports/first/first-server.c
169,6 → 169,10
/* Send change level command to posix level */
msg = (STD_command_message *)malloc(sizeof(STD_command_message));
 
#ifdef FSF_DEBUG
kern_printf("(MSG POSIXSTAR LEV %d SER %d THR %d)",local_scheduler_level,server,thread);
#endif
 
msg->command = STD_SET_NEW_MODEL;
msg->param = (void *)(rt_arg);
level_table[local_scheduler_level]->public_message(local_scheduler_level,thread,msg);