/shark/trunk/ports/first/first-sync.c |
---|
69,7 → 69,7 |
bool *was_budget_overran) |
{ |
TIME T,Q; |
TIME T,Q,D; |
int budget, local_scheduler_level, scheduler_id; |
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level, exec_shadow); |
94,7 → 94,7 |
if (next_budget != NULL && next_period != NULL) { |
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, budget); |
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, &D, budget); |
#ifdef FSF_DEBUG |
kern_printf("(budget %d Q=%d T=%d)",budget,(int)Q,(int)T); |
137,7 → 137,7 |
bool *was_budget_overran) |
{ |
TIME T,Q; |
TIME T,Q,D; |
int budget, local_scheduler_level, scheduler_id; |
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level, exec_shadow); |
162,7 → 162,7 |
if (next_budget != NULL && next_period != NULL) { |
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, budget); |
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, &D, budget); |
#ifdef FSF_DEBUG |
kern_printf("(budget %d Q=%d T=%d)",budget,(int)Q,(int)T); |
/shark/trunk/ports/first/include/grubstar.h |
---|
72,13 → 72,13 |
-2 The budgets allocated locally to this module have bandwidth > 1 |
-3 wrong LEVEL id |
*/ |
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); |
int GRUBSTAR_removebudget(LEVEL l, int budget); |
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); |
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, int budget); |
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, TIME *D, int budget); |
int GRUBSTAR_was_budget_overran(LEVEL l, int budget); |
/shark/trunk/ports/first/include/fsf_contract.h |
---|
314,6 → 314,8 |
TIME Cmin; |
TIME Tmin; |
TIME Tmax; |
TIME deadline; |
bool d_equals_t; |
} server_elem; |
int recalculate_contract(bandwidth_t U); |
/shark/trunk/ports/first/modules/mpegstar.c |
---|
295,7 → 295,7 |
LEVEL l = SERVER_get_local_scheduler_level_from_budget(fsf_get_server_level(),budget); |
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]); |
SERVER_adjust_budget(lev->scheduling_level,Q,T,lev->budget); |
SERVER_adjust_budget(lev->scheduling_level,Q,T,T,lev->budget); |
lev->server_Q = Q; |
lev->server_T = T; |
if (lev->current != NIL) { |
/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; |
/shark/trunk/ports/first/first-server.c |
---|
63,10 → 63,19 |
break; |
} |
if (contract->d_equals_t == TRUE) { |
*budget = SERVER_setbudget(fsf_server_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
TIMESPEC2USEC(&(contract->period_max)), |
local_scheduler_level,contract->local_scheduler_id); |
} else { |
*budget = SERVER_setbudget(fsf_server_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
TIMESPEC2USEC(&(contract->deadline)), |
local_scheduler_level,contract->local_scheduler_id); |
} |
return 0; |
74,12 → 83,13 |
int adjust_SERVER_budget |
(int budget, const TIME budget_actual, |
const TIME period_actual) |
const TIME period_actual, const TIME dline_actual) |
{ |
SERVER_adjust_budget(fsf_server_level, |
budget_actual, |
period_actual, |
dline_actual, |
budget); |
return 0; |
126,7 → 136,15 |
mul32div32to32(MAX_BANDWIDTH,Q,T,server_list[i].Umin); |
server_list[i].U=server_list[i].Umin; |
if (contract->d_equals_t == TRUE) { |
server_list[i].deadline = 0; |
server_list[i].d_equals_t = TRUE; |
} else { |
server_list[i].deadline = TIMESPEC2USEC(&contract->deadline);; |
server_list[i].d_equals_t = FALSE; |
} |
#ifdef FSF_DEBUG |
mul32div32to32(server_list[i].Umax,100, MAX_BANDWIDTH, temp); |
kern_printf("(Umax %d)",temp); |
167,6 → 185,14 |
mul32div32to32(MAX_BANDWIDTH,Q,T,server_list[current_server].Umin); |
server_list[current_server].U=server_list[current_server].Umin; |
if (contract->d_equals_t == TRUE) { |
server_list[current_server].deadline = 0; |
server_list[current_server].d_equals_t = TRUE; |
} else { |
server_list[current_server].deadline = TIMESPEC2USEC(&contract->deadline); |
server_list[current_server].d_equals_t = FALSE; |
} |
#ifdef FSF_DEBUG |
mul32div32to32(server_list[current_server].Umax,100, MAX_BANDWIDTH, temp); |
kern_printf("(Umax %d)",temp); |
199,6 → 225,8 |
server_list[i].Tmin=server_list[i+1].Tmin; |
server_list[i].Tmax=server_list[i+1].Tmax; |
server_list[i].Qs=server_list[i+1].Qs; |
server_list[i].deadline = server_list[i+1].deadline; |
server_list[i].d_equals_t = server_list[i+1].d_equals_t; |
i++; |
} |
252,7 → 280,11 |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T); |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , server_list[i].deadline); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
261,10 → 293,14 |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin); |
} |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
} |
471,8 → 507,12 |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T); |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, server_list[i].deadline); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
480,8 → 520,12 |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin); |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin, server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin, server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
588,8 → 632,11 |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T); |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, server_list[i].deadline); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
597,8 → 644,11 |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin); |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |