53,6 → 53,9 |
|
#define POSIXSTAR_CHANGE_LEVEL 1 |
|
/* flags */ |
#define POSIXSTAR_FLAG_NOPREEMPT 4 |
|
/*+ the level redefinition for the Round Robin level +*/ |
typedef struct { |
level_des l; /*+ the standard level descriptor +*/ |
72,6 → 75,8 |
|
int budget[MAX_PROC]; |
|
int flag[MAX_PROC]; |
|
PID activated; |
int scheduling_level; |
int cap_lev; |
98,6 → 103,10 |
|
int prio; |
|
|
/* check if the task is preempteble or not */ |
if (lev->flag[lev->activated] & POSIXSTAR_FLAG_NOPREEMPT) return; |
|
prio = lev->maxpriority; |
|
for (;;) { |
210,6 → 219,7 |
proc_table[p].wcet = lev->slice; |
} |
|
lev->flag[p] = 0; |
#if defined POSIXSTAR_DEBUG |
kern_printf("(slice %d)", proc_table[p].wcet); |
#endif |
599,3 → 609,17 |
return 0; |
} |
|
|
void POSIXSTAR_set_nopreemtive_current(LEVEL l) { |
|
POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]); |
|
lev->flag[lev->activated]|=POSIXSTAR_FLAG_NOPREEMPT; |
} |
|
void POSIXSTAR_unset_nopreemtive_current(LEVEL l) { |
|
POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]); |
|
lev->flag[lev->activated]&=~POSIXSTAR_FLAG_NOPREEMPT; |
} |