Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1003 → Rev 1008

/shark/trunk/ports/first/first-server.c
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;