27,6 → 27,7 |
#include "nonestar.h" |
#include "rmstar.h" |
#include "tdstar.h" |
#include "fedfstar.h" |
|
#include <pthread.h> |
#include <stdlib.h> |
97,9 → 98,13 |
// create the communication channel for negotiation and renegotiation |
|
channel[1] = port_create("CHANW",sizeof(struct mess),1,STREAM,WRITE); |
if (channel[1]<0) exit(-1); |
|
channel[0] = port_create("CHANR",sizeof(struct mess),1,STREAM,READ); |
if (channel[0]<0) exit(-1); |
|
//kern_printf("FSF port WRITE %d, READ %d\n", channel[1], channel[0]); |
|
fsf_initialize_contract(&service_contract); |
|
err=fsf_set_contract_basic_parameters(&service_contract,&default_budget,&default_period,FSF_DEFAULT_WORKLOAD); |
145,6 → 150,9 |
case FSF_EDF: |
local_scheduler_level = EDFSTAR_register_level(fsf_server_level); |
break; |
case FSF_FEDF: |
local_scheduler_level = FEDFSTAR_register_level(fsf_server_level); |
break; |
case FSF_FP: |
local_scheduler_level = RMSTAR_register_level(fsf_server_level); |
break; |
375,6 → 383,40 |
} |
|
|
void copy_contract(fsf_contract_parameters_t *contractd, const fsf_contract_parameters_t *contracts) { |
|
contractd->budget_min=contracts->budget_min; |
contractd->period_max=contracts->period_max; |
contractd->budget_max=contracts->budget_max; |
contractd->period_min=contracts->period_min; |
contractd->workload=contracts->workload; |
contractd->d_equals_t=contracts->d_equals_t; |
contractd->deadline=contracts->deadline; |
contractd->quality=contracts->quality; |
contractd->policy=contracts->policy; |
/* |
int budget_overrun_sig_notify; |
union sigval budget_overrun_sig_value; |
int deadline_miss_sig_notify; |
union sigval deadline_miss_sig_value; |
|
fsf_granularity_t granularity; |
fsf_utilization_set_t utilization_set; |
int quality; |
int importance; |
|
fsf_preemption_level_t preemption_level; |
fsf_critical_sections_t critical_sections; |
|
fsf_sched_policy_t policy; |
|
fsf_network_id_t network_id; |
bool granted_capacity_flag; |
*/ |
|
|
} |
|
int fsf_negotiate_contract |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server) |
383,12 → 425,12 |
|
// send response server is -1 if the operation fail |
m.type=NEGOTIATE_CONTRACT; |
memmove(&m.contract,contract, sizeof(fsf_contract_parameters_t)); |
copy_contract(&m.contract,contract); |
port_send(channel[1],&m,BLOCK); |
port_receive(channel[0], &m, BLOCK); |
if (m.server==-1) { |
*server=0; |
return 0; |
return FSF_ERR_CONTRACT_REJECTED; |
} |
|
*server=m.server; |
580,6 → 622,26 |
|
} |
break; |
|
case FSF_FEDF: |
{ |
TASK_MODEL *m=(TASK_MODEL*)(sched_params->params); |
HARD_TASK_MODEL *h=(HARD_TASK_MODEL *)(sched_params->params); |
|
if (m->pclass != HARD_PCLASS) |
return FSF_ERR_SCHED_POLICY_NOT_COMPATIBLE; |
|
h = (HARD_TASK_MODEL *)m; |
|
if (!h->wcet || !h->mit) return FSF_ERR_SCHED_POLICY_NOT_COMPATIBLE; |
|
if (FEDFSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BAD_ARGUMENT; |
|
/* Set server on local scheduler */ |
FEDFSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
|
} |
|
case FSF_RR: |
{ |
755,6 → 817,18 |
|
break; |
|
case FSF_FEDF: |
hard_task_def_arg(*(HARD_TASK_MODEL *)(local_scheduler_arg->params),arg); |
hard_task_def_level(*(HARD_TASK_MODEL *)(local_scheduler_arg->params),local_scheduler_level); |
|
*thread = task_create("FEDFSTAR", thread_code, local_scheduler_arg->params, NULL); |
if (*thread == NIL) |
return FSF_ERR_INTERNAL_ERROR; |
|
FEDFSTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
|
break; |
|
case FSF_FP: |
|
hard_task_def_arg(*(HARD_TASK_MODEL *)(local_scheduler_arg->params),arg); |
830,6 → 904,11 |
EDFSTAR_set_nopreemtive_current(local_scheduler_level); |
return 1; |
break; |
case FSF_FEDF: |
FEDFSTAR_set_nopreemtive_current(local_scheduler_level); |
return 1; |
break; |
|
case FSF_FP: |
RMSTAR_set_nopreemtive_current(local_scheduler_level); |
return 1; |
861,6 → 940,12 |
EDFSTAR_unset_nopreemtive_current(local_scheduler_level); |
return 1; |
break; |
|
case FSF_FEDF: |
EDFSTAR_unset_nopreemtive_current(local_scheduler_level); |
return 1; |
break; |
|
case FSF_FP: |
RMSTAR_unset_nopreemtive_current(local_scheduler_level); |
return 1; |
892,6 → 977,10 |
case FSF_EDF: |
*server = EDFSTAR_getbudget(local_scheduler_level,thread); |
return 0; |
case FSF_FEDF: |
*server = FEDFSTAR_getbudget(local_scheduler_level,thread); |
return 0; |
|
case FSF_FP: |
*server = RMSTAR_getbudget(local_scheduler_level,thread); |
return 0; |
948,6 → 1037,12 |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
break; |
|
case FSF_FEDF: |
/* Check if some thread use the server */ |
if(FEDFSTAR_budget_has_thread(local_scheduler_level,server)) |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
break; |
|
case FSF_FP: |
/* Check if some thread use the server */ |
if(RMSTAR_budget_has_thread(local_scheduler_level,server)) |
1133,7 → 1228,7 |
|
// send response server is -1 if the operation fail |
msg.type=RENEGOTIATE_CONTRACT; |
memmove(&msg.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
copy_contract(&msg.contract,new_contract); |
msg.server = server; |
//kern_printf("(REN %d)", server); |
port_send(channel[1],&msg,BLOCK); |
1157,7 → 1252,7 |
|
// send response server is -1 if the operation fail |
msg.type=REQUEST_RENEGOTIATE_CONTRACT; |
memmove(&msg.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
copy_contract(&msg.contract,new_contract); |
msg.server = server; |
msg.sig_notify=sig_notify; |
msg.sig_value=sig_value; |