Escribir reglas de asignación de recursos personalizadas
Denominar la función
La función puede tener cualquier nombre que no sea un nombre de función estándar invocable por el usuario.
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. */
La función debe aceptar cuatro argumentos en el siguiente orden:
- Un indicador al grupo de recursos (Type: RESGRP*).
- Un entero para el número de recursos que se van a seleccionar de ese grupo para su asignación (Type: int).
- Un indicador a la carga que solicita asignarse a partir del grupo de recursos (Type: LOAD*).
- Una lista que se va a rellenar con RMTAGS de recursos seleccionados para su asignación a partir del grupo (Type: CSLIST*).
Añadir y eliminar miembros del grupo
Se pueden añadir y eliminar miembros de un grupo de la lista de recursos seleccionados (mlist) mediante las funciones de compatibilidad del sistema seadsl y sermsl, respectivamente. Para añadir miembros del grupo a la lista, utilice la función seadsl de la siguiente forma:
void seadsl(CSLIST *mlist, RESMEMB *rmp)
Para eliminar miembros del grupo de la lista, utilice la función sermsl de la siguiente forma:
void sermsl(CSLIST *mlist, RMTAG *rmt)
Valores de retorno
La función no debe devolver ningún valor (Type: anular).
A continuación presentamos un ejemplo de una regla para seleccionar miembros del grupo de recursos disponibles sobre la base de la utilización de promedio mínimo:
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;
}
Instalación de la función personalizada
Para poner la función de asignación de recursos personalizada a disponibilidad del programador, debe "instalarla" desde la función ucini1 invocando a la función sedfgs. La función sedfgs tiene dos argumentos en el siguiente orden:
- El número de la regla de asignación de recursos para la que la función contiene lógica personalizada.
- La dirección de la función de asignación de recursos.
Por ejemplo, para instalar la regla del ejemplo anterior "rgsr" en la posición de regla 39:
sedfgs (39, rgsr);