418,7 → 418,113 |
|
} |
|
int |
fsf_bind_local_thread_to_server |
(fsf_server_id_t server, |
pthread_t thread, |
fsf_sched_params_t *sched_params) |
{ |
|
STD_command_message *msg; |
int local_scheduler_level,scheduler_id; |
|
/* Move thread from the posix module to local scheduler */ |
|
#ifdef FSF_DEBUG |
kern_printf("(Bind thread = %d to Server = %d)",thread,server); |
#endif |
|
/* Check if server and thread exsist */ |
if (server == -1 || thread == -1) |
return FSF_ERR_BAD_ARGUMENT; |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_budget(fsf_server_level,server); |
if (local_scheduler_level==-1) |
return FSF_ERR_UNKNOWN_APPSCHEDULED_THREAD; |
|
scheduler_id = SERVER_get_local_scheduler_id_from_budget(fsf_server_level,server); |
|
/* Check if thread is already bind */ |
switch(scheduler_id) { |
|
case FSF_RM: |
{ |
TASK_MODEL *m=(TASK_MODEL*)sched_params; |
HARD_TASK_MODEL *h=(HARD_TASK_MODEL *)sched_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; |
|
/* now we know that m is a valid model */ |
if (RMSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BAD_ARGUMENT; |
|
/* Set server on local scheduler */ |
RMSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
|
/* Send change level command to posix level */ |
} |
case FSF_EDF: |
{ |
TASK_MODEL *m=(TASK_MODEL*)sched_params; |
HARD_TASK_MODEL *h=(HARD_TASK_MODEL *)sched_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 (EDFSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BAD_ARGUMENT; |
|
/* Set server on local scheduler */ |
EDFSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
|
} |
break; |
|
case FSF_POSIX: |
{ |
TASK_MODEL *m=(TASK_MODEL*)sched_params; |
|
if (m->pclass != NRT_PCLASS) |
return FSF_ERR_SCHED_POLICY_NOT_COMPATIBLE; |
|
if (POSIXSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BAD_ARGUMENT; |
|
/* Set server on local scheduler */ |
POSIXSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
} |
|
default: |
return FSF_ERR_BAD_ARGUMENT; |
} |
|
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
if (msg) { |
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(sched_params); |
level_table[local_scheduler_level]->public_message(local_scheduler_level,thread,msg); |
|
msg->command = STD_SET_NEW_LEVEL; |
msg->param = (void *)(local_scheduler_level); |
task_message(msg,thread,0); |
|
free(msg); |
} else return FSF_ERR_INTERNAL_ERROR; |
|
return 0; |
|
} |
|
|
int fsf_bind_thread_to_server |
(fsf_server_id_t server, |
pthread_t thread) |
438,6 → 544,9 |
return FSF_ERR_BAD_ARGUMENT; |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_budget(fsf_server_level,server); |
if (local_scheduler_level==-1) |
return FSF_ERR_UNKNOWN_APPSCHEDULED_THREAD; |
|
scheduler_id = SERVER_get_local_scheduler_id_from_budget(fsf_server_level,server); |
|
/* Check if thread is already bind */ |
480,7 → 589,7 |
|
/* Check if server and thread exsist */ |
if (server == NIL) |
return FSF_ERR_INVALID_SERVER; |
return FSF_ERR_BAD_ARGUMENT; |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_budget(fsf_server_level,server); |
scheduler_id = SERVER_get_local_scheduler_id_from_budget(fsf_server_level,server); |
489,7 → 598,7 |
#endif |
/* Check if thread is already bind */ |
switch (scheduler_id) { |
case FSF_POSIX: |
case FSF_POSIX: |
|
nrt_task_def_arg(*(NRT_TASK_MODEL *)(local_scheduler_arg),arg); |
nrt_task_def_level(*(NRT_TASK_MODEL *)(local_scheduler_arg),local_scheduler_level); |
499,7 → 608,7 |
#ifdef FSF_DEBUG |
kern_printf("(FSF:Error creating thread)"); |
#endif |
return FSF_ERR_CREATE_THREAD; |
return FSF_ERR_INTERNAL_ERROR; |
} |
|
POSIXSTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
512,7 → 621,7 |
|
*thread = task_create("EDFSTAR", thread_code, local_scheduler_arg, NULL); |
if (*thread == NIL) |
return FSF_ERR_CREATE_THREAD; |
return FSF_ERR_INTERNAL_ERROR; |
|
EDFSTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
|
525,7 → 634,7 |
|
*thread = task_create("RMSTAR", thread_code, local_scheduler_arg, NULL); |
if (*thread == NIL) |
return FSF_ERR_CREATE_THREAD; |
return FSF_ERR_INTERNAL_ERROR; |
|
RMSTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
|
537,7 → 646,7 |
|
*thread = task_create("NONESTAR", thread_code, local_scheduler_arg, NULL); |
if (*thread == NIL) |
return FSF_ERR_CREATE_THREAD; |
return FSF_ERR_INTERNAL_ERROR; |
|
NONESTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
|
544,7 → 653,7 |
break; |
|
default: |
return FSF_ERR_INVALID_SERVER; |
return FSF_ERR_INTERNAL_ERROR; |
break; |
} |
|
672,7 → 781,7 |
|
/* Check server id */ |
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
return FSF_ERR_BAD_ARGUMENT; |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_budget(fsf_server_level,server); |
scheduler_id = SERVER_get_local_scheduler_id_from_budget(fsf_server_level,server); |
682,19 → 791,19 |
|
/* Check if some thread use the server */ |
if(POSIXSTAR_budget_has_thread(local_scheduler_level,server)) |
return FSF_ERR_SERVER_USED; |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
|
break; |
case FSF_EDF: |
/* Check if some thread use the server */ |
if(EDFSTAR_budget_has_thread(local_scheduler_level,server)) |
return FSF_ERR_SERVER_USED; |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
break; |
|
case FSF_RM: |
/* Check if some thread use the server */ |
if(RMSTAR_budget_has_thread(local_scheduler_level,server)) |
return FSF_ERR_SERVER_USED; |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
|
break; |
|
701,7 → 810,7 |
case FSF_NONE: |
/* Check if some thread use the server */ |
if(NONESTAR_budget_has_thread(local_scheduler_level,server)) |
return FSF_ERR_SERVER_USED; |
return FSF_ERR_NOT_CONTRACTED_SERVER; |
|
break; |
|
716,7 → 825,7 |
f=kern_fsave(); |
if (recalculate_contract(fsf_max_bw)==-1) { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
return FSF_ERR_INTERNAL_ERROR; |
} |
#ifdef FSF_DEBUG |
kern_printf("(Adjust budget)"); |