12,12 → 12,7 |
//===================================================================== |
|
#include "fsf_contract.h" |
#include "cbsstar.h" |
#include "posixstar.h" |
#include "rmstar.h" |
#include "edfstar.h" |
#include "posix.h" |
#include "comm_message.h" |
#include "fsf_server.h" |
|
#include <pthread.h> |
#include <stdlib.h> |
24,16 → 19,14 |
|
//#define FSF_DEBUG |
|
int fsf_cbsstar_level; |
int fsf_posix_level; |
int fsf_server_level; |
|
int FSF_register_module(int posix_level, int cbsstar_level) |
int FSF_register_module(int server_level) |
{ |
|
printk("FSF Module\n"); |
|
fsf_posix_level = posix_level; |
fsf_cbsstar_level = cbsstar_level; |
fsf_server_level = server_level; |
|
return 0; |
|
42,7 → 35,7 |
/* Convert the contract specification to |
* budget parameters |
*/ |
int set_CBSSTAR_budget_from_contract |
int set_SERVER_budget_from_contract |
(const fsf_contract_parameters_t *contract, |
int *budget) |
{ |
51,17 → 44,17 |
|
switch (contract->local_scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
local_scheduler_level = POSIXSTAR_register_level(fsf_cbsstar_level,5000,32); |
local_scheduler_level = POSIXSTAR_register_level(fsf_server_level,5000,32); |
break; |
case FSF_SCHEDULER_EDF: |
local_scheduler_level = EDFSTAR_register_level(fsf_cbsstar_level); |
local_scheduler_level = EDFSTAR_register_level(fsf_server_level); |
break; |
case FSF_SCHEDULER_RM: |
local_scheduler_level = RMSTAR_register_level(fsf_cbsstar_level); |
local_scheduler_level = RMSTAR_register_level(fsf_server_level); |
break; |
} |
|
*budget = CBSSTAR_setbudget(fsf_cbsstar_level, |
*budget = SERVER_setbudget(fsf_server_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
local_scheduler_level,contract->local_scheduler_id); |
70,15 → 63,15 |
|
} |
|
int adjust_CBSSTAR_budget_from_contract |
int adjust_SERVER_budget_from_contract |
(const fsf_contract_parameters_t *contract, |
int budget) |
{ |
|
CBSSTAR_adjust_budget(fsf_cbsstar_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
budget); |
SERVER_adjust_budget(fsf_server_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
budget); |
|
return 0; |
|
121,8 → 114,8 |
if (add_contract(contract)) |
return FSF_ERR_CONTRACT_REJECTED; |
|
/* SERVER = BUDGET */ |
set_CBSSTAR_budget_from_contract(contract,server); |
/* SERVER => BUDGET */ |
set_SERVER_budget_from_contract(contract,server); |
|
#ifdef FSF_DEBUG |
kern_printf("(New Server %d)",*server); |
137,107 → 130,58 |
|
} |
|
int fsf_bind_thread_to_server |
(fsf_server_id_t server, |
pthread_t thread, |
void *rt_arg) |
int fsf_create_thread |
(fsf_server_id_t server, |
pthread_t *thread, |
pthread_attr_t *attr, |
fsf_thread_code_t thread_code, |
void *arg, |
void *local_scheduler_arg) |
{ |
|
STD_command_message *msg; |
NRT_TASK_MODEL nrt; |
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); |
kern_printf("(FSF:Insert thread = %d to Server = %d)",thread,server); |
#endif |
|
/* Check if server and thread exsist */ |
if (server == -1 || thread == -1) |
return FSF_ERR_BIND_THREAD; |
if (server == NIL) |
return FSF_ERR_INVALID_SERVER; |
|
local_scheduler_level = CBSSTAR_get_local_scheduler_level_from_budget(fsf_cbsstar_level,server); |
scheduler_id = CBSSTAR_get_local_scheduler_id_from_budget(fsf_cbsstar_level,server); |
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); |
|
/* Check if thread is already bind */ |
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
if (POSIXSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BIND_THREAD; |
|
/* Set server on local scheduler */ |
POSIXSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
nrt_task_def_arg(nrt,arg); |
nrt_task_def_ctrl_jet(nrt); |
nrt_task_def_level(nrt,local_scheduler_level); |
|
/* Send change level command to posix level */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
*thread = task_create("POSIXSTAR", thread_code, &nrt, NULL); |
if (*thread == NIL) |
return FSF_ERR_CREATE_THREAD; |
|
#ifdef FSF_DEBUG |
kern_printf("(MSG POSIXSTAR LEV %d SER %d THR %d)",local_scheduler_level,server,thread); |
#endif |
POSIXSTAR_setbudget(local_scheduler_level, *thread, (int)(server)); |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(rt_arg); |
level_table[local_scheduler_level]->public_message(local_scheduler_level,thread,msg); |
task_activate(*thread); |
|
msg->command = STD_SET_NEW_LEVEL; |
msg->param = (void *)(local_scheduler_level); |
task_message(msg,thread,0); |
|
free(msg); |
|
break; |
case FSF_SCHEDULER_EDF: |
|
if (EDFSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BIND_THREAD; |
|
/* Set server on local scheduler */ |
EDFSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
|
/* Send change level command to posix level */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
|
#ifdef FSF_DEBUG |
kern_printf("(MSG EDFSTAR LEV %d SEV %d THR %d)",local_scheduler_level,server,thread); |
#endif |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(rt_arg); |
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); |
|
break; |
|
case FSF_SCHEDULER_RM: |
|
if (RMSTAR_getbudget(local_scheduler_level,thread) != -1) |
return FSF_ERR_BIND_THREAD; |
|
/* Set server on local scheduler */ |
RMSTAR_setbudget(local_scheduler_level,thread,(int)(server)); |
|
/* Send change level command to posix level */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
|
#ifdef FSF_DEBUG |
kern_printf("(MSG RMSTAR LEV %d SEV %d THR %d)",local_scheduler_level,server,thread); |
#endif |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(rt_arg); |
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); |
|
default: |
return FSF_ERR_BIND_THREAD; |
return FSF_ERR_INVALID_SERVER; |
break; |
} |
|
245,164 → 189,6 |
|
} |
|
int fsf_unbind_thread_from_server |
(pthread_t thread) |
{ |
|
int local_scheduler_level, scheduler_id; |
|
/* Move thread from the local scheduler module to posix level */ |
|
#ifdef FSF_DEBUG |
kern_printf("(UnBind thread = %d)",thread); |
#endif |
|
/* Check if thread exsists */ |
if (thread == -1) |
return FSF_ERR_UNBIND_THREAD; |
|
local_scheduler_level = CBSSTAR_get_local_scheduler_level_from_pid(fsf_cbsstar_level,thread); |
scheduler_id = CBSSTAR_get_local_scheduler_id_from_pid(fsf_cbsstar_level,thread); |
|
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
/* Check if it is bind to a server */ |
if (POSIXSTAR_getbudget(local_scheduler_level,thread) == -1) |
return FSF_ERR_UNBIND_THREAD; |
else { |
|
STD_command_message *msg; |
NRT_TASK_MODEL nrt; |
|
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
|
/* Send change level command to local scheduler */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(&nrt); |
level_table[fsf_posix_level]->public_message(fsf_posix_level,thread,msg); |
|
msg->command = STD_SET_NEW_LEVEL; |
msg->param = (void *)(fsf_posix_level); |
task_message(msg,thread,0); |
|
free(msg); |
|
} |
break; |
case FSF_SCHEDULER_EDF: |
|
if (EDFSTAR_getbudget(local_scheduler_level,thread) == -1) |
return FSF_ERR_UNBIND_THREAD; |
else { |
|
STD_command_message *msg; |
NRT_TASK_MODEL nrt; |
|
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
|
/* Send change level command to local scheduler */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(&nrt); |
level_table[fsf_posix_level]->public_message(fsf_posix_level,thread,msg); |
|
msg->command = STD_SET_NEW_LEVEL; |
msg->param = (void *)(fsf_posix_level); |
task_message(msg,thread,0); |
|
free(msg); |
|
} |
break; |
|
case FSF_SCHEDULER_RM: |
|
if (RMSTAR_getbudget(local_scheduler_level,thread) == -1) |
return FSF_ERR_UNBIND_THREAD; |
else { |
|
STD_command_message *msg; |
NRT_TASK_MODEL nrt; |
|
nrt_task_default_model(nrt); |
nrt_task_def_save_arrivals(nrt); |
|
/* Send change level command to local scheduler */ |
msg = (STD_command_message *)malloc(sizeof(STD_command_message)); |
|
msg->command = STD_SET_NEW_MODEL; |
msg->param = (void *)(&nrt); |
level_table[fsf_posix_level]->public_message(fsf_posix_level,thread,msg); |
|
msg->command = STD_SET_NEW_LEVEL; |
msg->param = (void *)(fsf_posix_level); |
task_message(msg,thread,0); |
|
free(msg); |
|
} |
|
break; |
} |
|
return 0; |
|
} |
|
int fsf_negotiate_contract_for_new_thread |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server, |
pthread_t *thread, |
pthread_attr_t *attr, |
fsf_thread_code_t thread_code, |
void *arg, |
void *rt_arg) |
|
{ |
|
int error; |
|
/* Create server */ |
error = fsf_negotiate_contract(contract, server); |
if (error) return error; |
|
/* Create pthread */ |
if (pthread_create(thread, attr, thread_code, arg)) |
return FSF_ERR_CREATE_THREAD; |
|
/* Bind thread to server */ |
error = fsf_bind_thread_to_server(*server, *thread, rt_arg); |
if (error) return error; |
|
return 0; |
|
} |
|
int fsf_negotiate_contract_for_myself |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server, |
void *rt_arg) |
{ |
|
int error; |
|
/* Create server */ |
error = fsf_negotiate_contract(contract, server); |
if (error) return error; |
|
/* Bind current thread to server */ |
error = fsf_bind_thread_to_server(*server, exec_shadow, rt_arg); |
if (error) return error; |
|
return 0; |
|
} |
|
int fsf_get_server |
(fsf_server_id_t *server, |
pthread_t thread) |
409,8 → 195,8 |
{ |
int local_scheduler_level, scheduler_id; |
|
local_scheduler_level = CBSSTAR_get_local_scheduler_level_from_pid(fsf_cbsstar_level,thread); |
scheduler_id = CBSSTAR_get_local_scheduler_id_from_pid(fsf_cbsstar_level, thread); |
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level,thread); |
scheduler_id = SERVER_get_local_scheduler_id_from_pid(fsf_server_level, thread); |
|
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
441,8 → 227,8 |
if (*server < 0) |
return FSF_ERR_INVALID_SERVER; |
|
local_scheduler_level = CBSSTAR_get_local_scheduler_level_from_budget(fsf_cbsstar_level,*server); |
scheduler_id = CBSSTAR_get_local_scheduler_id_from_budget(fsf_cbsstar_level,*server); |
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); |
|
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
466,7 → 252,7 |
break; |
} |
|
CBSSTAR_removebudget(fsf_cbsstar_level,*server); |
SERVER_removebudget(fsf_server_level,*server); |
|
level_free_descriptor(local_scheduler_level); |
|
493,6 → 279,7 |
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
|
return adjust_CBSSTAR_budget_from_contract(new_contract,server); |
return adjust_SERVER_budget_from_contract(new_contract,server); |
|
} |
|