Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 156 → Rev 159

/shark/trunk/kernel/modules/edf.c
20,11 → 20,11
 
/**
------------
CVS : $Id: edf.c,v 1.4 2003-01-07 17:07:50 pj Exp $
CVS : $Id: edf.c,v 1.5 2003-05-05 07:31:43 pj Exp $
 
File: $File$
Revision: $Revision: 1.4 $
Last update: $Date: 2003-01-07 17:07:50 $
Revision: $Revision: 1.5 $
Last update: $Date: 2003-05-05 07:31:43 $
------------
 
This file contains the scheduling module EDF (Earliest Deadline First)
178,18 → 178,12
{
EDF_level_des *lev = (EDF_level_des *)(level_table[l]);
 
if (lev->flags & EDF_FAILED_GUARANTEE) {
*freebandwidth = 0;
return 0;
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
return 0;
 
return 0;
}
 
static int EDF_public_create(LEVEL l, PID p, TASK_MODEL *m)
201,6 → 195,19
if (m->level != 0 && m->level != l) return -1;
h = (HARD_TASK_MODEL *)m;
if (!h->wcet || !h->mit) return -1;
 
/* check the free bandwidth... */
if (lev->flags & EDF_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / h->mit) * h->wcet;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
return -1;
}
 
/* now we know that m is a valid model */
 
#ifdef EDFDEBUG
222,30 → 229,6
proc_table[p].control |= CONTROL_CAP;
}
 
/* update the bandwidth... */
if (lev->flags & EDF_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / h->mit) * h->wcet;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
/* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
in this case, we don't raise an exception... in fact, after the
EDF_task_create the task_create will call level_guarantee that return
-1... return -1 in EDF_task_create isn't correct, because:
. generally, the guarantee must be done when also the resources
are registered
. returning -1 will cause the task_create to return with an errno
ETASK_CREATE instead of ENO_GUARANTEE!!!
 
Why I use the flag??? because if the lev->U overflows, if i.e. I set
it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
*/
lev->flags |= EDF_FAILED_GUARANTEE;
}
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
252,8 → 235,7
static void EDF_public_detach(LEVEL l, PID p)
{
/* the EDF level doesn't introduce any dinamic allocated new field.
we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
bandwidth */
we have only to decrement the allocated bandwidth */
 
EDF_level_des *lev = (EDF_level_des *)(level_table[l]);
 
261,10 → 243,9
edf_printf("(det%d)", p);
#endif
 
if (lev->flags & EDF_FAILED_GUARANTEE)
lev->flags &= ~EDF_FAILED_GUARANTEE;
else
if (lev->flags & EDF_ENABLE_GUARANTEE) {
lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
}
}
 
static void EDF_public_dispatch(LEVEL l, PID p, int nostop)
520,7 → 501,7
}
 
iq_init(&lev->ready, &freedesc, 0);
lev->flags = flags & 0x07;
lev->flags = flags;
lev->U = 0;
 
return l;
/shark/trunk/kernel/modules/cbs.c
20,11 → 20,11
 
/**
------------
CVS : $Id: cbs.c,v 1.4 2003-01-07 17:07:50 pj Exp $
CVS : $Id: cbs.c,v 1.5 2003-05-05 07:31:43 pj Exp $
 
File: $File$
Revision: $Revision: 1.4 $
Last update: $Date: 2003-01-07 17:07:50 $
Revision: $Revision: 1.5 $
Last update: $Date: 2003-05-05 07:31:43 $
------------
 
This file contains the aperiodic server CBS (Total Bandwidth Server)
259,17 → 259,12
{
CBS_level_des *lev = (CBS_level_des *)(level_table[l]);
 
if (lev->flags & CBS_FAILED_GUARANTEE) {
*freebandwidth = 0;
return 0;
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
return 0;
return 0;
}
 
static int CBS_public_create(LEVEL l, PID p, TASK_MODEL *m)
284,6 → 279,17
 
soft = (SOFT_TASK_MODEL *)m;
 
if (lev->flags & CBS_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / soft->period) * soft->met;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
return -1;
}
 
/* Enable wcet check */
proc_table[p].avail_time = soft->met;
proc_table[p].wcet = soft->met;
301,21 → 307,6
if (soft->arrivals == SAVE_ARRIVALS)
lev->flag[p] |= CBS_SAVE_ARRIVALS;
 
/* update the bandwidth... */
if (lev->flags & CBS_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / soft->period) * soft->met;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
/* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
(see EDF.c) */
lev->flags |= CBS_FAILED_GUARANTEE;
}
 
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
322,15 → 313,13
static void CBS_public_detach(LEVEL l, PID p)
{
/* the CBS level doesn't introduce any dinamic allocated new field.
we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
bandwidth */
we have only to decrement the allocated bandwidth */
 
CBS_level_des *lev = (CBS_level_des *)(level_table[l]);
 
if (lev->flags & CBS_FAILED_GUARANTEE)
lev->flags &= ~CBS_FAILED_GUARANTEE;
else
if (lev->flags & CBS_ENABLE_GUARANTEE) {
lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
}
}
 
static int CBS_public_eligible(LEVEL l, PID p)
566,7 → 555,7
 
lev->scheduling_level = master;
 
lev->flags = flags & 0x01;
lev->flags = flags;
 
return l;
}
/shark/trunk/kernel/modules/rm.c
20,11 → 20,11
 
/**
------------
CVS : $Id: rm.c,v 1.4 2003-01-07 17:07:50 pj Exp $
CVS : $Id: rm.c,v 1.5 2003-05-05 07:31:44 pj Exp $
 
File: $File$
Revision: $Revision: 1.4 $
Last update: $Date: 2003-01-07 17:07:50 $
Revision: $Revision: 1.5 $
Last update: $Date: 2003-05-05 07:31:44 $
------------
 
This file contains the scheduling module RM (Rate Monotonic)
168,18 → 168,12
{
RM_level_des *lev = (RM_level_des *)(level_table[l]);
 
if (lev->flags & RM_FAILED_GUARANTEE) {
*freebandwidth = 0;
return 0;
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
return 0;
 
return 0;
}
 
static int RM_public_create(LEVEL l, PID p, TASK_MODEL *m)
192,6 → 186,19
if (m->level != 0 && m->level != l) return -1;
h = (HARD_TASK_MODEL *)m;
if (!h->wcet || !h->mit) return -1;
 
/* update the bandwidth... */
if (lev->flags & RM_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / h->mit) * h->wcet;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
return -1;
}
 
/* now we know that m is a valid model */
 
*iq_query_priority(p, &lev->ready) = lev->period[p] = h->mit;
209,30 → 216,6
proc_table[p].control |= CONTROL_CAP;
}
 
/* update the bandwidth... */
if (lev->flags & RM_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / h->mit) * h->wcet;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
/* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
in this case, we don't raise an exception... in fact, after the
RM_task_create the task_create will call level_guarantee that return
-1... return -1 in RM_task_create isn't correct, because:
. generally, the guarantee must be done when also the resources
are registered
. returning -1 will cause the task_create to return with an errno
ETASK_CREATE instead of ENO_GUARANTEE!!!
 
Why I use the flag??? because if the lev->U overflows, if i.e. I set
it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
*/
lev->flags |= RM_FAILED_GUARANTEE;
}
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
244,10 → 227,9
 
RM_level_des *lev = (RM_level_des *)(level_table[l]);
 
if (lev->flags & RM_FAILED_GUARANTEE)
lev->flags &= ~RM_FAILED_GUARANTEE;
else
if (lev->flags & RM_ENABLE_GUARANTEE) {
lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
}
}
 
static void RM_public_dispatch(LEVEL l, PID p, int nostop)
488,7 → 470,7
}
 
iq_init(&lev->ready, &freedesc, 0);
lev->flags = flags & 0x07;
lev->flags = flags;
lev->U = 0;
 
return l;