/shark/trunk/ports/first/first-contract.c |
---|
11,11 → 11,8 |
// S.Ha.R.K. Implementation |
//===================================================================== |
#include "fsf_core.h" |
#include "fsf.h" |
#include "fsf_server.h" |
#include "fsf_shared_objects.h" |
#include "fsf_hierarchical.h" |
#include "fsf_spare_capacity.h" |
#include <kernel/descr.h> |
#include <kernel/func.h> |
#include <pistar.h> |
157,10 → 154,10 |
{ |
if (!contract) return FSF_ERR_BAD_ARGUMENT; |
if ((d_equals_t==false && deadline != FSF_NULL_DEADLINE) || |
(d_equals_t==true && deadline == FSF_NULL_DEADLINE)) |
if ((d_equals_t==true && deadline != FSF_NULL_DEADLINE) || |
(d_equals_t==false && deadline == FSF_NULL_DEADLINE)) |
return FSF_ERR_BAD_ARGUMENT; |
if (TIMESPEC_A_GT_B(deadline, &contract->period_max)) |
if (deadline != FSF_NULL_DEADLINE && TIMESPEC_A_GT_B(deadline, &contract->period_max)) |
return FSF_ERR_BAD_ARGUMENT; |
contract->d_equals_t = d_equals_t; |
/shark/trunk/ports/first/include/fsf_service_task.h |
---|
50,6 → 50,7 |
bandwidth_t U; // actual bandwidth |
bandwidth_t Umin; // min bandwidth |
bandwidth_t Umax; // max bandwidth |
TIME Cmax; |
TIME Cmin; |
TIME Tmin; |
TIME Tmax; |
/shark/trunk/ports/first/include/message.h |
---|
40,7 → 40,7 |
#ifndef __MESSAGE_H__ |
#define __MESSAGE_H__ |
typedef enum message_type { |
typedef enum { |
NO_TYPE=-1, |
NEGOTIATE_CONTRACT, |
RENEGOTIATE_CONTRACT, |
50,12 → 50,19 |
NUM_MESSAGE, |
} message_type; |
typedef struct qual_imp { |
int importance; |
int quality; |
} qual_imp; |
typedef struct mess { |
message_type type; |
fsf_contract_parameters_t contract; |
fsf_server_id_t server; |
union { |
fsf_contract_parameters_t contract; |
qual_imp qi; |
} |
} mess; |
/shark/trunk/ports/first/server-task.c |
---|
34,7 → 34,7 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* |
* |
* CVS : $Id: server-task.c,v 1.12 2004-11-24 10:24:43 trimarchi Exp $ |
* CVS : $Id: server-task.c,v 1.13 2004-12-09 10:27:08 trimarchi Exp $ |
*/ |
#include "ll/i386/64bit.h" |
55,9 → 55,11 |
struct mess msg; |
fsf_renegotiation_status_t status; |
int wait_renegotiation=0; |
/* |
struct timespec next_act; |
struct timespec period; |
struct timespec act_time; |
*/ |
PORT rec,tra; |
rec = port_connect("CHANW",sizeof(struct mess),STREAM,READ); |
74,6 → 76,7 |
kern_printf("ADM"); |
#endif |
wait_renegotiation=0; |
//kern_printf("(REN %d)", msg.server); |
port_send(tra,&msg,BLOCK); |
//kern_gettime(&act_time); |
//fsf_get_budget_and_period(service_server,NULL,&period); |
117,8 → 120,46 |
continue; |
} |
break; |
case CHANGE_PARAMETER: |
// this CASE change the quality and importance |
case CHANGE_PARAMETER: |
{ |
fsf_contract_parameters_t new_contract; |
struct timespec period; |
struct timespec budget; |
int i=0; |
// this CASE change the quality and importance |
//fsf_initialize_contract(&new_contract); |
// find contract |
while(i<current_server) { |
if (server_list[i].server==msg.server) break; |
i++; |
} |
//kern_printf("(RCQI)"); |
NULL_TIMESPEC(&period); |
ADDUSEC2TIMESPEC(server_list[i].Tmax, &period); |
NULL_TIMESPEC(&budget); |
ADDUSEC2TIMESPEC(server_list[i].Cmin, &budget); |
fsf_set_contract_basic_parameters(&new_contract,&budget,&period,FSF_DEFAULT_WORKLOAD); |
NULL_TIMESPEC(&period); |
ADDUSEC2TIMESPEC(server_list[i].Tmin, &period); |
NULL_TIMESPEC(&budget); |
ADDUSEC2TIMESPEC(server_list[i].Cmax, &budget); |
fsf_set_contract_reclamation_parameters(&new_contract, &budget, &period, FSF_DEFAULT_GRANULARITY,NULL, |
msg.qi.quality,msg.qi.importance); |
if (server_list[i].d_equals_t == true) { |
NULL_TIMESPEC(&new_contract.deadline); |
new_contract.d_equals_t = true; |
} else { |
NULL_TIMESPEC(&period); |
ADDUSEC2TIMESPEC(server_list[i].deadline, &period); |
TIMESPEC_ASSIGN(&new_contract.deadline, &period); |
new_contract.d_equals_t = false; |
} |
if (renegotiate_contract(&new_contract, msg.server)==FSF_ERR_CONTRACT_REJECTED) |
msg.server=-1; |
} |
break; |
default : |
126,6 → 167,7 |
} |
// send response server is -1 if the operation fail |
//kern_printf("(msg server %d)", msg.server); |
port_send(tra,&msg,BLOCK); |
//kern_gettime(&act_time); |
//fsf_get_budget_and_period(service_server,NULL,&period); |
151,7 → 193,7 |
#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 == false) |
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); |
164,7 → 206,7 |
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 == false) |
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); |
/shark/trunk/ports/first/first-server.c |
---|
139,7 → 139,7 |
break; |
} |
if (contract->d_equals_t == false) { |
if (contract->d_equals_t == true) { |
*budget = SERVER_setbudget(fsf_server_level, |
TIMESPEC2USEC(&(contract->budget_min)), |
TIMESPEC2USEC(&(contract->period_max)), |
204,6 → 204,8 |
T=TIMESPEC2USEC(&contract->period_min); |
Q=TIMESPEC2USEC(&contract->budget_max); |
server_list[i].Cmax=Q; |
mul32div32to32(MAX_BANDWIDTH,Q,T,server_list[current_server].Umax); |
T=TIMESPEC2USEC(&contract->period_min); |
218,12 → 220,12 |
mul32div32to32(MAX_BANDWIDTH,Q,T,server_list[i].Umin); |
server_list[i].U=server_list[i].Umin; |
if (contract->d_equals_t == false) { |
if (contract->d_equals_t == true) { |
server_list[i].deadline = 0; |
server_list[i].d_equals_t = false; |
server_list[i].d_equals_t = true; |
} else { |
server_list[i].deadline = TIMESPEC2USEC(&contract->deadline);; |
server_list[i].d_equals_t = true; |
server_list[i].d_equals_t = false; |
} |
server_list[i].Qs = contract->quality; |
294,6 → 296,7 |
server_list[i].U=server_list[i+1].Umin; |
server_list[i].Umax=server_list[i+1].Umax; |
server_list[i].Cmin=server_list[i+1].Cmin; |
server_list[i].Cmax=server_list[i+1].Cmax; |
server_list[i].Tmin=server_list[i+1].Tmin; |
server_list[i].Tmax=server_list[i+1].Tmax; |
server_list[i].Qs=server_list[i+1].Qs; |
336,6 → 339,9 |
// send response server is -1 if the operation fail |
m.type=CHANGE_PARAMETER; |
m.server=server; |
m.qi.quality = new_quality; |
m.qi.importance = new_importance; |
//memmove(&m.contract,contract, sizeof(fsf_contract_parameters_t)); |
port_send(channel[1],&m,BLOCK); |
347,7 → 353,7 |
//*server=m.server; |
return 0; |
} |
899,7 → 905,7 |
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 == false) |
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); |
912,7 → 918,7 |
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 == false) |
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); |
955,13 → 961,13 |
#ifdef FSF_DEBUG |
int temp; |
kern_printf("(Recalculate contract)"); |
kern_printf("(RC)"); |
#endif |
/* The current bandwidth is the min bandwidth */ |
current_bandwidth=SERVER_return_bandwidth(fsf_server_level); |
#ifdef FSF_DEBUG |
kern_printf("(nserver %d)", current_server); |
kern_printf("(SER%d)", current_server); |
#endif |
//kern_printf("(CS:%d)", current_server); |
do { |
978,7 → 984,7 |
} |
#ifdef FSF_DEBUG |
kern_printf("(Total Quality %d)", Qt); |
kern_printf("(TQ%d)", Qt); |
#endif |
isok=1; |
for (i=0; i<current_server; i++) { |
997,7 → 1003,7 |
#ifdef FSF_DEBUG |
mul32div32to32(server_list[i].U,100, MAX_BANDWIDTH, temp); |
kern_printf("(Server %d bw %d)", server_list[i].server, temp); |
kern_printf("(SER %d BW %d)", server_list[i].server, temp); |
#endif |
} |
} |
1012,18 → 1018,19 |
fsf_server_id_t server) |
{ |
struct mess message; |
struct mess msg; |
// 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; |
msg.type=RENEGOTIATE_CONTRACT; |
memmove(&msg.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
msg.server = server; |
//kern_printf("(REN %d)", server); |
port_send(channel[1],&msg,BLOCK); |
port_send(channel[1],&message,BLOCK); |
port_receive(channel[0], &msg, BLOCK); |
port_receive(channel[0], &message, BLOCK); |
if (message.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
//kern_printf("(REN %d)", msg.server); |
if (msg.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
return 0; |
} |
1035,18 → 1042,18 |
union sigval sig_value) |
{ |
struct mess message; |
struct mess msg; |
// send response server is -1 if the operation fail |
message.type=REQUEST_RENEGOTIATE_CONTRACT; |
memmove(&message.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
message.server = server; |
msg.type=REQUEST_RENEGOTIATE_CONTRACT; |
memmove(&msg.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
msg.server = server; |
port_send(channel[1],&message,BLOCK); |
port_send(channel[1],&msg,BLOCK); |
port_receive(channel[0], &message, BLOCK); |
port_receive(channel[0], &msg, BLOCK); |
if (message.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
if (msg.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
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 server-task.o first-error.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/nonestar.o ./modules/pistar.o |