Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 872 → Rev 873

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