43,16 → 43,12 |
#include <kernel/var.h> |
#include <kernel/func.h> |
#include "nonestar.h" |
#include "fsf_configuration_parameters.h" |
#include "fsf_core.h" |
#include "fsf_contract.h" |
#include "fsf_server.h" |
#include "tracer.h" |
#include <modules/comm_message.h> |
|
//#define NONESTAR_DEBUG |
#define NONESTAR_DEBUG |
|
#define NONESTAR_CHANGE_LEVEL 1 |
|
/*+ Status used in the level +*/ |
#define NONESTAR_READY MODULE_STATUS_BASE |
|
67,10 → 63,8 |
int budget; |
int current; |
int status; |
int flag; |
|
int scheduling_level; |
int new_level[MAX_PROC]; |
|
} NONESTAR_level_des; |
|
86,18 → 80,16 |
static int NONESTAR_public_create(LEVEL l, PID p, TASK_MODEL *m) |
{ |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
|
|
#ifdef NONESTAR_DEBUG |
kern_printf("(NN:Crt:%d)",p); |
#endif |
|
if (m->pclass != DUMMY_PCLASS) return -1; |
if (m->level != 0 && m->level != l) return -1; |
if (lev->current != NIL) return -1; |
|
if (m->level != 0 && m->level != l) return -1; |
if (lev->current != NIL) return -1; |
|
lev->current = p; |
lev->flag = 0; |
lev->status = NONESTAR_IDLE; |
|
proc_table[p].avail_time = lev->server_Q; |
123,48 → 115,15 |
|
} |
|
static int NONESTAR_change_level(LEVEL l, PID p) |
{ |
|
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
|
/* Change task level */ |
if (lev->flag & NONESTAR_CHANGE_LEVEL) { |
STD_command_message msg; |
proc_table[p].status = SLEEP; |
lev->current=NIL; |
|
lev->budget = -1; |
proc_table[p].task_level = lev->new_level[p]; |
|
/* Send change level command to local scheduler */ |
|
msg.command = STD_ACTIVATE_TASK; |
msg.param = NULL; |
|
level_table[ lev->new_level[p] ]->public_message(lev->new_level[p],p,&msg); |
|
return 1; |
|
} |
|
return 0; |
|
} |
|
|
|
static void NONESTAR_public_epilogue(LEVEL l, PID p) |
{ |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
//int r; |
int r; |
|
#ifdef NONESTAR_DEBUG |
kern_printf("(NN:Epi:%d)",p); |
#endif |
|
if (NONESTAR_change_level(l, p)) return; |
|
level_table[ lev->scheduling_level ] -> |
private_epilogue(lev->scheduling_level,p); |
/* |
205,18 → 164,7 |
static void NONESTAR_public_unblock(LEVEL l, PID p) |
{ |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
BUDGET_TASK_MODEL b; |
|
#ifdef NONESTAR_DEBUG |
kern_printf("(NS:pu)"); |
#endif |
lev->current=p; |
|
budget_task_default_model(b, lev->budget); |
|
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&b); |
|
} |
|
static void NONESTAR_public_block(LEVEL l, PID p) |
223,23 → 171,11 |
{ |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
|
#ifdef NONESTAR_DEBUG |
kern_printf("(NN:pb)"); |
#endif |
|
/* the task is blocked on a synchronization primitive. we have to |
remove it from the master module -and- from the local queue! */ |
lev->current=NIL; |
level_table[ lev->scheduling_level ]-> |
private_extract(lev->scheduling_level, p); |
|
} |
|
static int NONESTAR_public_message(LEVEL l, PID p, void *m) |
{ |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
STD_command_message *msg; |
DUMMY_TASK_MODEL *h; |
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]); |
|
switch ((long)(m)) { |
|
268,44 → 204,9 |
break; |
|
default: |
msg = (STD_command_message *)m; |
|
switch(msg->command) { |
case STD_SET_NEW_MODEL: |
/* if the NONESTAR_task_create is called, then the pclass must be a |
valid pclass. */ |
h=(DUMMY_TASK_MODEL *)(msg->param); |
|
/* now we know that m is a valid model */ |
lev->flag = 0; |
lev->current = p; |
lev->status = NONESTAR_IDLE; |
|
|
|
break; |
|
case STD_SET_NEW_LEVEL: |
|
lev->flag |= NONESTAR_CHANGE_LEVEL; |
lev->new_level[p] = (int)(msg->param); |
|
break; |
|
case STD_ACTIVATE_TASK: |
|
/* Enable wcet check */ |
proc_table[p].avail_time = lev->server_Q; |
proc_table[p].wcet = lev->server_Q; |
proc_table[p].control = (proc_table[p].control & ~CONTROL_CAP); |
|
NONESTAR_public_activate(l, p, NULL); |
|
break; |
} |
|
break; |
|
|
} |
|
|
354,7 → 255,6 |
|
lev->budget = NIL; |
lev->current = NIL; |
lev->flag = 0; |
lev->status = NONESTAR_IDLE; |
lev->server_Q = 0; |
lev->server_T = 0; |