Subversion Repositories shark

Compare Revisions

Regard whitespace Rev 872 → Rev 873

/shark/trunk/ports/first/include/fsf_basic_types.h
144,7 → 144,6
// TABLE_DRIVEN : struct timespec (schedule duration)
 
 
 
// Error codes
#define FSF_ERR_TOO_MANY_TASKS 0x02003001
#define FSF_ERR_BAD_ARGUMENT 0x02003002
151,7 → 150,7
#define FSF_ERR_INVALID_SYNCH_OBJ_HANDLE 0x02003003
#define FSF_ERR_NO_RENEGOTIATION_REQUESTED 0x02003004
#define FSF_ERR_CONTRACT_REJECTED 0x02003005
#define FSF_ERR_NOT_SCHEDULED_CALLING_THREAD 0x02003006
#define FSF_ERR_NOT_SCHEDULED_CALLING_THREAD 0x02003006 // ??
#define FSF_ERR_UNBOUND_THREAD 0x02003007
#define FSF_ERR_UNKNOWN_APPSCHEDULED_THREAD 0x02003008
#define FSF_ERR_NOT_CONTRACTED_SERVER 0x02003009
164,13 → 163,16
#define FSF_ERR_TOO_MANY_SERVERS 0x02003016
#define FSF_ERR_INVALID_SCHEDULER_REPLY 0x02003017
#define FSF_ERR_TOO_MANY_PENDING_REPLENISHMENTS 0x02003018
#define FSF_WRN_MODULE_NOT_SUPPORTED 0x02004001
 
// New error
#define FSF_ERR_INVALID_SERVER 0x0200301A
#define FSF_ERR_SERVER_USED 0x0200301B
#define FSF_ERR_CREATE_SERVER 0x0200301C
#define FSF_ERR_CREATE_THREAD 0x0200301D
// added by Peppe
#define FSF_ERR_TIME_SPEC_IN_THE_PAST 0x02003020 //JULIO: Shall this be actually an error??
 
// added by Julio
#define FSF_ERR_SYSTEM_ALREADY_INITIALIZED 0x02004002
#define FSF_ERR_SHARED_OBJ_ALREADY_INITIALIZED 0x02004003
#define FSF_ERR_SHARED_OBJ_NOT_INITIALIZED 0x02004004
#define FSF_ERR_SCHED_POLICY_NOT_COMPATIBLE 0x02004005
 
 
#define FSF_WRN_MODULE_NOT_SUPPORTED 0x02004001
/shark/trunk/ports/first/modules/grubstar.c
660,6 → 660,7
lev->b[i].l = l;
lev->b[i].last_reclaiming = 0;
lev->b[i].negotiation = 0;
lev->b[i].loc_sched_level=-1;
iq_init(&lev->b[i].tasks, NULL, 0);
}
 
758,6 → 759,7
lev->b[budget].current = -1;
lev->b[budget].flags = GRUBSTAR_RECLAIMING;
lev->b[budget].last_reclaiming = 0;
lev->b[budget].loc_sched_level;
 
return 0;
 
/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);
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)");