44,8 → 44,7 |
#include <kernel/func.h> |
#include <kernel/trace.h> |
#include "posixstar.h" |
#include "cbsstar.h" |
#include "comm_message.h" |
#include "fsf_server.h" |
|
//#define POSIXSTAR_DEBUG |
|
237,38 → 236,6 |
|
} |
|
static int POSIXSTAR_private_change_level(LEVEL l, PID p) |
{ |
|
POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]); |
|
/* Change task level */ |
if (lev->flag[p] & POSIXSTAR_CHANGE_LEVEL) { |
|
STD_command_message msg; |
|
proc_table[p].status = SLEEP; |
|
level_table[lev->scheduling_level]->private_extract(lev->scheduling_level,p); |
iq_extract(p,&lev->ready[lev->priority[p]]); |
|
POSIXSTAR_private_scheduler(lev); |
|
lev->nact[p] = 0; |
lev->budget[p] = -1; |
|
proc_table[p].task_level = lev->new_level[p]; |
msg.command = STD_ACTIVATE_TASK; |
level_table[lev->new_level[p]] -> public_message(lev->new_level[p],p,&msg); |
|
return 1; |
|
} |
|
return 0; |
|
} |
|
static void POSIXSTAR_public_epilogue(LEVEL l, PID p) |
{ |
POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]); |
277,8 → 244,6 |
kern_printf("(PS:Epi:%d)",p); |
#endif |
|
if (POSIXSTAR_private_change_level(l,p)) return; |
|
if (p==lev->activated) { |
if (lev->yielding) { |
lev->yielding = 0; |
388,8 → 353,6 |
static int POSIXSTAR_public_message(LEVEL l, PID p, void *m) |
{ |
POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]); |
STD_command_message *msg; |
NRT_TASK_MODEL *nrt; |
|
#ifdef POSIXSTAR_DEBUG |
kern_printf("(PS:Msg:%d)",p); |
400,8 → 363,6 |
/* Task EndCycle */ |
case (long)(NULL): |
|
if (POSIXSTAR_private_change_level(l,p)) return 0; |
|
if (lev->nact[p] > 0) { |
/* continue!!!! */ |
lev->nact[p]--; |
427,56 → 388,8 |
|
default: |
|
msg = (STD_command_message *)m; |
|
switch(msg->command) { |
case STD_SET_NEW_LEVEL: |
break; |
|
lev->flag[p] |= POSIXSTAR_CHANGE_LEVEL; |
lev->new_level[p] = (int)(msg->param); |
|
break; |
case STD_SET_NEW_MODEL: |
|
nrt = (NRT_TASK_MODEL *)(msg->param); |
|
lev->priority[p] = nrt->weight; |
|
if (nrt->slice) { |
lev->new_slice[p] = nrt->slice; |
} else { |
lev->new_slice[p] = 0; |
} |
|
if (nrt->policy == NRT_RR_POLICY) |
lev->new_control[p] |= CONTROL_CAP; |
|
if (nrt->arrivals == SAVE_ARRIVALS) |
lev->nact[p] = 0; |
else |
lev->nact[p] = -1; |
|
lev->flag[p] = 0; |
|
break; |
case STD_ACTIVATE_TASK: |
|
if (lev->new_slice[p]) { |
proc_table[p].avail_time = lev->new_slice[p]; |
proc_table[p].wcet = lev->new_slice[p]; |
} else { |
proc_table[p].avail_time = lev->slice; |
proc_table[p].wcet = lev->slice; |
} |
|
proc_table[p].control |= lev->new_control[p]; |
|
POSIXSTAR_public_activate(l,p); |
|
break; |
|
} |
|
} |
|
return 0; |