Writing Custom Resource Allocation Rules
Naming the Function
The function can have any name that is not a standard user-callable function name.
Arguments
#include "factor.h"
void myrule(gp, nu, ldp, mlist)
RESGRP *gp; /* pointer to resource group. */
int nu; /* number of units required. */
LOAD *ldp; /* pointer to the load. */
CSLIST *mlist; /* current selection list. */
The function must accept four arguments in the following order:
- A pointer to the resource group (Type: RESGRP*).
- An integer for the number of resources to be selected from that group for allocation (Type: int).
- A pointer to the load requesting to allocate from the resource group (Type: LOAD*).
- A list to be populated with RMTAGS of resources selected for allocation from the group (Type: CSLIST*).
Adding and Removing Group Members
Group members can be added and removed from the list of selected resources (mlist) using the system support functions seadsl and sermsl, respectively. To add group members to the list, use function seadsl as follows:
void seadsl(CSLIST *mlist, RESMEMB *rmp)
To remove group members from the list, use function sermsl as follows:
void sermsl(CSLIST *mlist, RMTAG *rmt)
Return Values
The function should return nothing (Type: void).
Here is an example of a rule to select available resource group members on the basis of least mean utilization:
void rgsr (RESGRP *gp, int nu, LOAD *ldp, CSLIST *mlist)
/*-----------------------------------------------------------------
Function to process resource group selection code 3, select
required number of member resources that have the least mean
utilizations (as a fraction of capacity).
NOTES:
* Ties are broken by selecting the first in the order listed
in the group.
* This function requires that resource statistics be enabled.
Any resource which does not have statistics enabled is
assumed to have a utilization of zero. Thus if all
resource statistics are disabled, this defaults to
rule 0.
* This function uses seaars, which includes must complete and
maxOT in its considerations, to determine the availability
of each member resource.
ARGS:
gp - pointer to resource group to select member from
nu - number of units required from selected member
ldp - pointer to load to which resource will be allocated
mlist - list to hold selected RESMEMB's
RETURNS: void
-----------------------------------------------------------------*/
{
int i, j, *avail;
double min, *util;
RESMEMB *minp, *rmp;
/* Allocate arrays for availability and utilization. */
avail = (int *) malloc(sizeof(int) * csszls(gp->rgrsls));
if ( avail == NULL )
{
seferr(0, "Out of Memory");
}
util = (double *) malloc(sizeof(double) * csszls(gp->rgrsls));
if ( util == NULL )
{
seferr(0, "Out of Memory");
}
/* Compute availability and utilization. */
for ( rmp = (RESMEMB *) csfsls(gp->rgrsls), j = 0;
rmp != NULL;
rmp = (RESMEMB *) csnxls((CSENTITY *) rmp), j++ )
{
avail[j] = seaars(rmp->rmres, ldp);
util[j] = seutrs(rmp->rmres);
}
/* For the required number of units */
for ( i = csszls(mlist); i < nu; i++ )
{
/* For each resource which is available. */
minp = NULL;
for ( rmp = (RESMEMB *) csfsls(gp->rgrsls), j = 0;
rmp != NULL;
rmp = (RESMEMB *) csnxls((CSENTITY *) rmp), j++ )
{
if ( (! rmp->rmres->rsselfg) && (avail[j] > 0) )
{
/* Save if min. */
if ( (minp == NULL) || (util[j] < min) )
{
minp = rmp;
min = util[j];
}
}
}
if ( minp == NULL )
{
break;
}
seadsl(mlist, minp);
}
free(avail);
free(util);
return;
}
Installing the Custom Function
To make your custom resource allocation function available to the Scheduler, you must "install" it from the ucini1 function by calling the function sedfgs. The function sedfgs has two arguments in the following order:
- The number of the resource allocation rule for which your function contains custom logic.
- The address of your resource allocation function.
For example, to install the above example rule "rgsr" in rule position 39:
sedfgs (39, rgsr);