Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 866 → Rev 867

/shark/trunk/ports/first/modules/nonestar.c
43,12 → 43,16
#include <kernel/var.h>
#include <kernel/func.h>
#include "nonestar.h"
#include "fsf_contract.h"
#include "fsf_configuration_parameters.h"
#include "fsf_core.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
 
63,8 → 67,10
int budget;
int current;
int status;
int flag;
int scheduling_level;
int new_level[MAX_PROC];
 
} NONESTAR_level_des;
 
80,16 → 86,18
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;
115,15 → 123,48
 
}
 
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);
/*
164,7 → 205,18
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)
171,11 → 223,23
{
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]);
NONESTAR_level_des *lev = (NONESTAR_level_des *)(level_table[l]);
STD_command_message *msg;
DUMMY_TASK_MODEL *h;
 
switch ((long)(m)) {
 
204,9 → 268,44
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;
}
 
 
255,6 → 354,7
 
lev->budget = NIL;
lev->current = NIL;
lev->flag = 0;
lev->status = NONESTAR_IDLE;
lev->server_Q = 0;
lev->server_T = 0;