Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 660 → Rev 661

/shark/trunk/ports/first/modules/grubstar.c
44,12 → 44,14
 
/* this structure contains the status for a single budget */
struct budget_struct {
TIME Q; /* budget */
TIME T; /* period */
bandwidth_t Ub; /* bandwidth */
TIME Q; /* Budget */
TIME T; /* Period */
TIME D; /* Deadline */
bandwidth_t Ub; /* Bandwidth */
 
struct timespec dline; /* deadline */
int dline_timer; /* oslib event for budget reactivation*/
struct timespec dline; /* deadline */
struct timespec replenish; /* server period */
int replenish_timer;
int vtimer;
int avail; /* current budget */
91,7 → 93,7
} GRUBSTAR_level_des;
 
 
static void GRUBSTAR_deadline_timer_hardreservation(void *a)
static void GRUBSTAR_timer_hardreservation(void *a)
{
struct budget_struct *b = a;
PID p;
103,7 → 105,7
kern_printf("(GS:HrdRes:");
#endif
 
b->dline_timer = NIL;
b->replenish_timer = NIL;
 
b->last_reclaiming = 0;
b->avail += b->Q;
115,12 → 117,12
if (b->flags==GRUBSTAR_RECLAIMING && b->avail>0)
if (lev->Uf < lev->U) lev->Uf += b->Ub;
 
if (b->avail > 0) b->flags = GRUBSTAR_ACTIVE;
 
if (b->current == NIL && b->flags) {
if (iq_query_first(&(b->tasks)) != NIL) {
JOB_TASK_MODEL job;
 
if (b->avail > 0) b->flags = GRUBSTAR_ACTIVE;
 
p = iq_getfirst(&b->tasks);
#ifdef GRUBSTAR_DEBUG
127,12 → 129,13
kern_printf("%d",p);
#endif
 
ADDUSEC2TIMESPEC(b->T, &b->dline);
kern_gettime(&b->dline);
ADDUSEC2TIMESPEC(b->D, &b->dline);
 
b->current = p;
job_task_default_model(job, b->dline);
job_task_def_noexc(job);
//job_task_def_noexc(job);
level_table[ lev->scheduling_level ]->
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
142,10 → 145,10
}
if (b->flags == GRUBSTAR_NOACTIVE) {
kern_gettime(&b->dline);
ADDUSEC2TIMESPEC(b->T, &b->dline);
kern_gettime(&b->replenish);
ADDUSEC2TIMESPEC(b->T, &b->replenish);
b->dline_timer=kern_event_post(&b->dline, GRUBSTAR_deadline_timer_hardreservation, b);
b->replenish_timer=kern_event_post(&b->replenish, GRUBSTAR_timer_hardreservation, b);
}
 
#ifdef GRUBSTAR_DEBUG
188,7 → 191,7
TIME t;
struct timespec t2,t3;
 
mul32div32to32(b->T,b->avail,b->Q,t);
mul32div32to32(b->D,b->avail,b->Q,t);
t3.tv_sec = t / 1000000;
t3.tv_nsec = (t % 1000000) * 1000;
 
204,8 → 207,10
SUBTIMESPEC(&b->dline, acttime, &t2);
if (/* 1 */ TIMESPEC_A_LT_B(&b->dline, acttime) ||
/* 2 */ TIMESPEC_A_GT_B(&t3, &t2) ) {
TIMESPEC_ASSIGN(&b->replenish, acttime);
ADDUSEC2TIMESPEC(b->T, &b->replenish);
TIMESPEC_ASSIGN(&b->dline, acttime);
ADDUSEC2TIMESPEC(b->T, &b->dline);
ADDUSEC2TIMESPEC(b->D, &b->dline);
b->avail = b->Q;
b->last_reclaiming = 0;
}
219,7 → 224,7
b->current = p;
job_task_default_model(job, b->dline);
job_task_def_noexc(job);
//job_task_def_noexc(job);
level_table[ lev->scheduling_level ]->
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
 
233,7 → 238,6
TIME t;
struct timespec t2,t3;
 
if (b->vtimer!=NIL) kern_event_delete(b->vtimer);
b->vtimer=NIL;
259,13 → 263,15
if (TIMESPEC_A_LT_B(&b->dline, &schedule_time)) {
/* we modify the deadline ... */
TIMESPEC_ASSIGN(&b->dline, &schedule_time);
ADDUSEC2TIMESPEC(b->T, &b->dline);
ADDUSEC2TIMESPEC(b->D, &b->dline);
TIMESPEC_ASSIGN(&b->replenish, &schedule_time);
ADDUSEC2TIMESPEC(b->T, &b->replenish);
}
 
if (b->flags == GRUBSTAR_NOACTIVE && b->dline_timer == NIL) {
b->dline_timer=kern_event_post(&b->dline, GRUBSTAR_deadline_timer_hardreservation, b);
if (b->flags == GRUBSTAR_NOACTIVE && b->replenish_timer == NIL) {
b->replenish_timer=kern_event_post(&b->replenish, GRUBSTAR_timer_hardreservation, b);
} else {
mul32div32to32(b->T,b->avail,b->Q,t);
mul32div32to32(b->D,b->avail,b->Q,t);
t3.tv_sec = t / 1000000;
t3.tv_nsec = (t % 1000000) * 1000;
SUBTIMESPEC(&b->dline, &t3, &t2);
305,7 → 311,7
private_extract(lev->scheduling_level, p);
/* we modify the deadline ... */
kern_gettime(&b->dline);
ADDUSEC2TIMESPEC(b->T, &b->dline);
ADDUSEC2TIMESPEC(b->D, &b->dline);
 
/* and the capacity */
b->avail = b->Q;
320,9 → 326,9
 
b->flags = GRUBSTAR_ACTIVE;
 
if (b->dline_timer!=NIL) {
kern_event_delete(b->dline_timer);
b->dline_timer=NIL;
if (b->replenish_timer!=NIL) {
kern_event_delete(b->replenish_timer);
b->replenish_timer=NIL;
}
 
if (b->vtimer!=NIL) {
333,7 → 339,7
/* and, finally, we reinsert the task in the master level */
job_task_default_model(job, b->dline);
job_task_def_noexc(job);
//job_task_def_noexc(job);
level_table[ lev->scheduling_level ]->
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
585,9 → 591,11
for (i=0; i<n; i++) {
lev->b[i].Q = 0;
lev->b[i].T = 0;
lev->b[i].D = 0;
lev->b[i].Ub = 0;
NULL_TIMESPEC(&lev->b[i].dline);
lev->b[i].dline_timer = NIL;
NULL_TIMESPEC(&lev->b[i].replenish);
lev->b[i].replenish_timer = NIL;
lev->b[i].vtimer = NIL;
lev->b[i].avail = 0;
lev->b[i].current = -1;
613,7 → 621,7
 
}
 
int GRUBSTAR_setbudget(LEVEL l, TIME Q, TIME T, LEVEL local_scheduler_level, int scheduler_id)
int GRUBSTAR_setbudget(LEVEL l, TIME Q, TIME T, TIME D, LEVEL local_scheduler_level, int scheduler_id)
{
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]);
int r;
638,6 → 646,7
lev->b[r].Q = Q;
lev->b[r].T = T;
lev->b[r].D = D;
lev->b[r].Ub = b;
lev->b[r].avail = Q;
lev->b[r].flags = GRUBSTAR_RECLAIMING;
668,9 → 677,11
 
lev->b[budget].Q = 0;
lev->b[budget].T = 0;
lev->b[budget].D = 0;
lev->b[budget].Ub = 0;
NULL_TIMESPEC(&lev->b[budget].dline);
lev->b[budget].dline_timer = NIL;
NULL_TIMESPEC(&lev->b[budget].replenish);
lev->b[budget].replenish_timer = NIL;
lev->b[budget].avail = 0;
lev->b[budget].current = -1;
lev->b[budget].flags = GRUBSTAR_RECLAIMING;
683,7 → 694,7
/* Change Q and T parameters of a budget
* It returns the time to wait before the change is effective
*/
int GRUBSTAR_adjust_budget(LEVEL l, TIME Q, TIME T, int budget)
int GRUBSTAR_adjust_budget(LEVEL l, TIME Q, TIME T, TIME D, int budget)
{
 
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]);
697,6 → 708,7
 
lev->b[budget].Q = Q;
lev->b[budget].T = T;
lev->b[budget].D = D;
mul32div32to32(MAX_BANDWIDTH,Q,T,lev->b[budget].Ub);
 
lev->U += lev->b[budget].Ub;
711,7 → 723,7
 
}
 
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, int budget)
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, TIME *D, int budget)
{
 
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]);
718,6 → 730,7
*Q = lev->b[budget].Q;
*T = lev->b[budget].T;
*D = lev->b[budget].D;
 
return 0;