5,7 → 5,7 |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Authors: |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* Mauro Marinoni |
* Anton Cervin |
147,6 → 147,7 |
job_task_default_model(job, et->dline); |
level_table[lev->scheduling_level]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job); |
et->flags |= ELASTIC_JOB_PRESENT; |
} |
|
|
252,7 → 253,7 |
if (et->U < et->oldU) { |
/* Task has been compressed. Change its deadline NOW! */ |
if (et->flags & ELASTIC_JOB_PRESENT) { |
/* Remove job from level and change its deadline */ |
/* Remove job from level */ |
level_table[lev->scheduling_level]-> |
private_extract(lev->scheduling_level, i); |
} |
296,8 → 297,6 |
{ |
ELASTIC_level_des *lev = (ELASTIC_level_des *)(level_table[l]); |
|
return 1; |
|
if (*freebandwidth >= lev->U) { |
*freebandwidth -= (unsigned int)lev->U; |
return 1; |
304,6 → 303,7 |
} else { |
return 0; |
} |
|
} |
|
|
437,6 → 437,7 |
static int ELASTIC_public_message(LEVEL l, PID p, void *m) |
{ |
ELASTIC_level_des *lev = (ELASTIC_level_des *)(level_table[l]); |
ELASTIC_task_descr *et = &lev->elist[p]; |
|
switch((long)(m)) { |
|
444,6 → 445,7 |
|
level_table[lev->scheduling_level]-> |
private_extract(lev->scheduling_level,p); |
et->flags &= ~ELASTIC_JOB_PRESENT; |
|
proc_table[p].status = ELASTIC_IDLE; |
|
456,6 → 458,7 |
|
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level,p); |
et->flags &= ~ELASTIC_JOB_PRESENT; |
|
proc_table[p].status = SLEEP; |
|
472,9 → 475,11 |
static void ELASTIC_public_end(LEVEL l, PID p) |
{ |
ELASTIC_level_des *lev = (ELASTIC_level_des *)(level_table[l]); |
ELASTIC_task_descr *et = &lev->elist[p]; |
|
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level,p); |
et->flags &= ~ELASTIC_JOB_PRESENT; |
|
} |
|
550,7 → 555,7 |
saveE = et->E; |
saveU = et->U; |
|
et->E = 0; /* set elasticity to zero to make correct compression */ |
et->E = 0; /* set elasticity to zero to force period */ |
et->U = ((long long)MAX_BANDWIDTH * (long long)et->C)/period; |
|
if (ELASTIC_compress(lev) == -1) { |
573,13 → 578,14 |
SYS_FLAGS f; |
ELASTIC_level_des *lev; |
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level]; |
TIME retval; |
|
f = kern_fsave(); |
|
if (lev->elist[p].flags & ELASTIC_PRESENT) { |
|
retval = lev->elist[p].T; |
kern_frestore(f); |
return lev->elist[p].T; |
return retval; |
|
} else { |
|
590,8 → 596,8 |
|
} |
|
int ELASTIC_set_E(PID p, int E) { |
|
int ELASTIC_set_E(PID p, int E) |
{ |
SYS_FLAGS f; |
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level]; |
ELASTIC_task_descr *et = &lev->elist[p]; |
598,12 → 604,12 |
int saveE; |
|
f = kern_fsave(); |
|
|
if (et->flags & ELASTIC_PRESENT) { |
|
saveE = et->E; |
|
et->E = E; |
|
et->E = E; |
if (ELASTIC_compress(lev) == -1) { |
#ifdef ELASTIC_DEBUG |
cprintf("ELASTIC_set_E failed: could not compress\n"); |
611,45 → 617,40 |
et->E = saveE; |
kern_frestore(f); |
return -1; |
|
} |
|
|
kern_frestore(f); |
return 0; |
|
|
} else { |
|
|
kern_frestore(f); |
return -1; |
|
} |
|
} |
|
int ELASTIC_get_E(PID p) { |
|
|
SYS_FLAGS f; |
ELASTIC_level_des *lev; |
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level]; |
|
|
f = kern_fsave(); |
|
|
if (lev->elist[p].flags & ELASTIC_PRESENT) { |
|
|
kern_frestore(f); |
return lev->elist[p].E; |
|
|
} else { |
|
|
kern_frestore(f); |
return -1; |
|
} |
|
} |
|
int ELASTIC_set_beta(PID p, int beta) { |
|
|
SYS_FLAGS f; |
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level]; |
ELASTIC_task_descr *et = &lev->elist[p]; |
656,12 → 657,13 |
int saveBeta; |
|
f = kern_fsave(); |
|
|
if (et->flags & ELASTIC_PRESENT) { |
|
|
saveBeta = et->beta; |
|
et->beta = beta; |
|
et->beta = beta; |
|
if (ELASTIC_compress(lev) == -1) { |
#ifdef ELASTIC_DEBUG |
cprintf("ELASTIC_set_beta failed: could not compress\n"); |
669,44 → 671,44 |
et->beta = saveBeta; |
kern_frestore(f); |
return -1; |
|
} |
|
|
kern_frestore(f); |
return 0; |
|
|
} else { |
|
|
kern_frestore(f); |
return -1; |
|
|
} |
|
|
} |
|
int ELASTIC_get_beta(PID p) { |
|
|
SYS_FLAGS f; |
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level]; |
|
int retval; |
|
f = kern_fsave(); |
|
|
if (lev->elist[p].flags & ELASTIC_PRESENT) { |
|
retval = lev->elist[p].beta; |
kern_frestore(f); |
return lev->elist[p].beta; |
|
return retval; |
|
} else { |
|
|
kern_frestore(f); |
return -1; |
|
|
} |
|
|
} |
|
int ELASTIC_set_bandwidth(LEVEL level, ext_bandwidth_t U) { |
|
|
SYS_FLAGS f; |
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[level]; |
|
721,16 → 723,16 |
kern_frestore(f); |
return -1; |
} |
|
|
kern_frestore(f); |
return 0; |
|
|
} |
|
ext_bandwidth_t ELASTIC_get_bandwidth(LEVEL level) { |
|
|
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[level];; |
|
return lev->U; |
|
|
} |