Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 660 → Rev 661

/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;