Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 907 → Rev 908

/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