Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 240 → Rev 241

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