/shark/trunk/ports/first/include/message.h |
---|
40,20 → 40,21 |
#ifndef __MESSAGE_H__ |
#define __MESSAGE_H__ |
typedef enum message_type = |
( |
typedef enum message_type { |
NO_TYPE=-1, |
NEGOTIATE_CONTRACT, |
RENEGOTIATE_CONTRACT, |
CHANGE_PARAMETER, |
NUM_MESSAGE |
); |
NUM_MESSAGE, |
} message_type; |
typedef struct mess { |
message_type type; |
fsf_contract_parameters_t contract; |
fsf_server_id_t server; |
}; |
} mess; |
#endif |
/shark/trunk/ports/first/server-task.c |
---|
34,41 → 34,46 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* |
* |
* CVS : $Id: server-task.c,v 1.1 2004-05-20 12:13:55 trimarchi Exp $ |
* CVS : $Id: server-task.c,v 1.2 2004-05-25 12:38:05 trimarchi Exp $ |
*/ |
#include "ll/i386/64bit.h" |
#include <kernel/kern.h> |
#include <modules/sem.h> |
#include <modules/hartport.h> |
#include <modules/cabs.h> |
#include <string.h> |
#include "fsf_contract.h" |
#include "fsf_server.h" |
#include "fsf_service_task.h" |
#include "message.h" |
TASK service_task() { |
struct mess message; |
PORT rec,tra; |
char *mchannel[2]={"MCHANR","MCHANW"}; |
CAB mchannelid[2]; |
rec = port_connect("CHANW",sizeof(struct mess),STREAM,READ); |
TASK service_task(void *arg) { |
cprintf("task start\n", rec); |
tra = port_connect("CHANR",sizeof(struct mess),STREAM,WRITE); |
cprintf("task start\n", tra); |
int id=(int) arg; |
struct mess_type message; |
CAB ch=mchannelid[id]; |
cprintf("Fine connect %d\n", rec); |
while(1) { |
message = (struct mess_type) cab_getmes(channel); |
// wait for renegotiation |
cprintf("(pr_t %d)",port_receive(rec,&message,BLOCK)); |
switch (message.type) { |
case NEGOTIATE_CONTRACT: |
if (negotiate_contract(message.contract, message.server)!=FSF_ERR_CONTRACT_REJECTED) { |
if (negotiate_contract(&message.contract, &message.server)==FSF_ERR_CONTRACT_REJECTED) |
message.server=-1; |
} else { |
} |
break; |
case RENEGOTIATE_CONTRACT: |
renegotiate_contract(message.contract, message.server); |
if (renegotiate_contract(&message.contract, message.server)==FSF_ERR_CONTRACT_REJECTED) |
message.server=-1; |
break; |
default : |
75,18 → 80,75 |
break; |
} |
// send response server is -1 if the operation fail |
cprintf("(ps_t %d)",port_send(tra,&message,BLOCK)); |
task_endcycle(); |
} |
} |
task_endcycle(); |
int renegotiate_contract |
(const fsf_contract_parameters_t *new_contract, |
fsf_server_id_t server) |
{ |
TIME T,Q; |
int i; |
#ifdef FSF_DEBUG |
kern_printf("(Renegotiate for server %d)",server); |
#endif |
if (!new_contract) |
return FSF_ERR_NOT_INITIALIZED; |
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
// change the parameter |
relink_contract_to_server(new_contract, server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
return FSF_ERR_CREATE_SERVER; |
} |
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, server_list[i].deadline); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
} |
return 0; |
} |
int negotiate_contract |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server) |
{ |
int i=0; |
TIME T; |
TIME Q; |
/* Check if contract is initialized */ |
97,11 → 159,65 |
if (add_contract(contract)) |
return FSF_ERR_CONTRACT_REJECTED; |
/* SERVER => BUDGET */ |
set_SERVER_budget_from_contract(contract,server); |
#ifdef FSF_DEBUG |
kern_printf("(New Server %d)",*server); |
#endif |
if (*server >= 0) { |
link_contract_to_server(contract,*server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
return FSF_ERR_CREATE_SERVER; |
} |
#ifdef FSF_DEBUG |
kern_printf("(Adjust budget)"); |
#endif |
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , server_list[i].deadline); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
} |
} |
else { |
return FSF_ERR_CREATE_SERVER; |
} |
return 0; |
} |
#if defined MICHAEL |
int recalculate_contract(bandwidth_t U) { |
bandwidth_t current_bandwidth; |
unsigned int temp_U; |
159,3 → 275,4 |
return 0; |
} |
#endif |
/shark/trunk/ports/first/first-server.c |
---|
12,13 → 12,20 |
//===================================================================== |
#include "ll/i386/64bit.h" |
#include <kernel/kern.h> |
#include <modules/sem.h> |
#include <modules/hartport.h> |
#include <modules/cabs.h> |
#include "fsf_contract.h" |
#include "fsf_server.h" |
#include "fsf_service_task.h" |
#include "message.h" |
#include <pthread.h> |
#include <stdlib.h> |
//#define FSF_DEBUG |
int current_server=0; |
26,7 → 33,10 |
bandwidth_t fsf_max_bw = 0; |
int fsf_server_level; |
PID server_task; |
PORT channel[2]; |
int FSF_register_module(int server_level, bandwidth_t max_bw) |
{ |
printk("FSF Module\n"); |
38,6 → 48,31 |
} |
void FSF_start_service_task(SOFT_TASK_MODEL *model) { |
// create the service task |
cprintf("Create Service Task\n"); |
// create the communication channel for negotiation and renegotiation |
channel[1] = port_create("CHANW",sizeof(struct mess),1,STREAM,WRITE); |
cprintf("(ch %d)", channel[1]); |
channel[0] = port_create("CHANR",sizeof(struct mess),1,STREAM,READ); |
cprintf("(ch %d)", channel[0]); |
server_task = task_create("stask",service_task,model,NULL); |
if (server_task == -1) { |
cprintf("error creating service task\n"); |
sys_shutdown_message("Could not create service_task"); |
sys_end(); |
return; |
} |
task_activate(server_task); |
} |
/* Convert the contract specification to |
* budget parameters |
*/ |
242,75 → 277,21 |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server) |
{ |
SYS_FLAGS f; |
int i=0; |
TIME T; |
TIME Q; |
/* Check if contract is initialized */ |
if (!contract) return FSF_ERR_NOT_INITIALIZED; |
struct mess message; |
/* Admission Test */ |
if (FSF_ADMISSION_TEST_IS_ENABLED) |
if (add_contract(contract)) |
return FSF_ERR_CONTRACT_REJECTED; |
f = kern_fsave(); |
// send response server is -1 if the operation fail |
message.type=NEGOTIATE_CONTRACT; |
memmove(&message.contract,contract, sizeof(fsf_contract_parameters_t)); |
/* SERVER => BUDGET */ |
set_SERVER_budget_from_contract(contract,server); |
cprintf("(ps %d)",port_send(channel[1],&message,BLOCK)); |
#ifdef FSF_DEBUG |
kern_printf("(New Server %d)",*server); |
#endif |
cprintf("(pr %d)\n",port_receive(channel[0], &message, BLOCK)); |
if (*server >= 0) { |
link_contract_to_server(contract,*server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
#ifdef FSF_DEBUG |
kern_printf("(Adjust budget)"); |
#endif |
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (message.server==-1) |
return FSF_ERR_CONTRACT_REJECTED; |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , server_list[i].deadline); |
*server=message.server; |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
} |
} |
else { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
kern_frestore(f); |
return 0; |
} |
597,63 → 578,24 |
return 0; |
} |
int fsf_renegotiate_contract |
(const fsf_contract_parameters_t *new_contract, |
fsf_server_id_t server) |
{ |
SYS_FLAGS f; |
TIME T,Q; |
int i; |
#ifdef FSF_DEBUG |
kern_printf("(Renegotiate for server %d)",server); |
#endif |
struct mess message; |
if (!new_contract) |
return FSF_ERR_NOT_INITIALIZED; |
// send response server is -1 if the operation fail |
message.type=RENEGOTIATE_CONTRACT; |
memmove(&message.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
message.server = server; |
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
// compute the new value |
f = kern_fsave(); |
// change the parameter |
relink_contract_to_server(new_contract, server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
//port_send(channel,&message,BLOCK); |
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, server_list[i].deadline); |
//port_receive(channel, &message, BLOCK); |
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (message.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].deadline); |
} |
server_list[i].U=server_list[i].Umin; |
} |
kern_frestore(f); |
return 0; |
} |
/shark/trunk/ports/first/makefile |
---|
10,7 → 10,7 |
OBJS_PATH = $(BASE)/ports/first |
FIRST = first-contract.o first-server.o first-sync.o \ |
FIRST = first-contract.o first-server.o first-sync.o server-task.o \ |
./modules/grubstar.o ./modules/posixstar.o \ |
./modules/edfstar.o ./modules/cbsstar.o ./modules/rmstar.o \ |
./modules/mpegstar.o |