Sous-routine LAPI_Util

Objectif

Sert de fonction d'encapsuleur pour les opérations de collecte / dispersion de données telles que l'enregistrement et la réservation, pour la mise à jour des informations de port UDP et pour l'obtention de pointeurs vers les fonctions de verrouillage et de signalisation associées à un verrou LAPI partagé.

Bibliothèque

Bibliothèque de disponibilité (liblapi_r.a)

Syntaxe C

#include <lapi.h>
 
int LAPI_Util(hndl, util_cmd)
lapi_handle_t hndl;
lapi_util_t *util_cmd;

Syntaxe FORTRAN

include 'lapif.h'
 
LAPI_UTIL(hndl, util_cmd, ierror)
INTEGER hndl
TYPE (LAPI_UTIL_T) :: util_cmd
INTEGER ierror

Descriptif

Type of call: Programme DGSP (Data gather / scatter program), informations de port UDP et utilitaires de partage de verrous

Ce sous-programme est utilisé pour plusieurs opérations différentes, qui sont indiquées par la valeur de type de commande au début de la structure de commande. La structure lapi_util_t est définie comme suit:
typedef union {
    lapi_util_type_t    Util_type;  
    lapi_reg_dgsp_t     RegDgsp;    
    lapi_dref_dgsp_t    DrefDgsp;   
    lapi_resv_dgsp_t    ResvDgsp;   
    lapi_reg_ddm_t      DdmFunc;    
    lapi_add_udp_port_t Udp;        
    lapi_pack_dgsp_t    PackDgsp;   
    lapi_unpack_dgsp_t  UnpackDgsp;
    lapi_thread_func_t  ThreadFunc;
} lapi_util_t;
Le type énuméré lapi_util_type_t possède les valeurs suivantes:
Tableau 1. types lapi_util_type_t
Valeur de Util_type Membre de l'Union tel qu'interprété par LAPI_Util
LAPI_REGISTER_DGSP lapi_reg_dgsp_t
LAPI_UNRESERVE_DGSP lapi_dref_dgsp_t
LAPI_RESERVE_DGSP lapi_resv_dgsp_t
LAPI_REG_DDM_FUNC lapi_reg_ddm_t
LAPI_ADD_UDP_DEST_PORT lapi_add_udp_port_t
LAPI_DGSP_PACK lapi_pack_dgsp_t
LAPI_DGSP_UNPACK lapi_unpack_dgsp_t
LAPI_GET_THREAD_FUNC lapi_thread_func_t
hndl n'est pas vérifié pour le type de commande LAPI_REGISTER_DGSP, LAPI_RESERVE_DGSPou LAPI_UNRESERVE_DGSP.

LAPI_REGISTER_DGSP

Vous pouvez utiliser cette opération pour enregistrer un DGSP LAPI que vous avez créé. Pour enregistrer un DGSP LAPI, lapi_dgsp_descr_t idgsp doit être transmis. LAPI renvoie un descripteur (lapi_dg_handle_t dgsp_handle) à utiliser pour tous les futurs appels LAPI. Le dgsp_handle renvoyé par une opération d'enregistrement est identifié comme un type lapi_dg_handle_t , qui est le type approprié pour les appels LAPI_Xfer et LAPI_Util qui prennent un DGSP. dgsp_handle est également défini comme pouvant être transtypé en un pointeur vers un lapi_dgsp_descr_t pour les situations où l'utilisateur LAPI a besoin d'un accès en lecture seule aux informations contenues dans le DGSP en cache. L'opération d'enregistrement fournit un DGSP à LAPI pour une utilisation ultérieure dans les opérations d'envoi, de réception, de conditionnement et de décompression de messages. LAPI crée sa propre copie du DGSP et la protège par le nombre de références. Toutes les opérations LAPI internes qui dépendent d'un DGSP mis en cache dans LAPI garantissent la conservation du DGSP en incrémentant le nombre de références lorsqu'elles commencent une dépendance sur le DGSP et en décrémentant le nombre à la fin de cette dépendance. Une fois enregistré, un DGSP peut être utilisé à partir de n'importe quelle instance LAPI. LAPI_Term ne rejette pas les DGSP.

Vous pouvez enregistrer un DGSP, démarrer une ou plusieurs opérations LAPI à l'aide du DGSP, puis annuler la réservation sans vous soucier du moment où les opérations LAPI qui dépendent du DGSP seront effectuées à l'aide de ce dernier. Pour plus d'informations, voir LAPI_RESERVE_DGSP et LAPI_UNRESERVE_DGSP .

En général, le DGSP que vous créez et transmettez à l'appel LAPI_REGISTER_DGSP à l'aide du paramètre dgsp est supprimé une fois que LAPI a créé et mis en cache sa propre copie. Etant donné que la création de DGSP est complexe, des erreurs utilisateur peuvent se produire, mais une vérification étendue des erreurs lors du transfert de données risque de nuire aux performances. Lors du développement de code qui crée des DGSP, vous pouvez appeler une validation supplémentaire au point d'enregistrement en définissant la variable d'environnement LAPI_VERIFY_DGSP . LAPI_Util renvoie toutes les erreurs détectées. Les erreurs qui existent et qui ne sont pas détectées lors de l'enregistrement provoqueront des problèmes lors du transfert de données. Les erreurs détectées lors du transfert de données seront signalées par un gestionnaire d'erreurs asynchrone. Une erreur de segmentation est un symptôme courant d'un DGSP défaillant. Si plusieurs DGSP sont utilisés, le gestionnaire d'erreurs asynchrones ne pourra pas identifier le DGSP à l'origine de l'erreur. Pour plus d'informations sur le traitement des erreurs asynchrones, voir LAPI_Init.

LAPI_REGISTER_DGSP utilise la structure de commande lapi_reg_dgsp_t .
Tableau 2. Les zones lapi_reg_dgsp_t
lapi_reg_dgsp_t, zone type de zone lapi_reg_dgsp_t Utilisation de lapi_reg_dgsp_t
type_utilitaire lapi_util_type_t LAPI_REGISTER_DGSP
idgsp lapi_dgsp_descr_t IN-pointeur vers le programme DGSP
gdgsp_handle lapi_dg_handle_t OUT-descripteur d'un programme DGSP enregistré
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_RESERVE_DGSP

Vous pouvez utiliser cette opération pour réserver un DGSP. Cette opération est fournie car un client LAPI peut mettre en cache un descripteur LAPI DGSP pour une utilisation ultérieure. Le client doit s'assurer que le DGSP ne sera pas supprimé avant l'utilisation du descripteur mis en cache. Un descripteur DGSP, qui est défini comme un pointeur vers une description DGSP déjà mise en cache dans LAPI, est transmis à cette opération. Le descripteur DGSP est également défini comme un pointeur de structure, de sorte que les programmes client puissent accéder directement aux informations du DGSP. A moins que le client ne soit certain que le DGSP ne sera pas "non réservé" par une autre unité d'exécution lors de son accès, le client doit placer la fenêtre d'accès entre crochets avec sa propre opération de réservation / annulation de réservation. Le client ne doit pas modifier le DGSP en cache, mais LAPI n'a aucun moyen de l'appliquer. L'opération de réservation incrémente le nombre de références utilisateur, protégeant ainsi le DGSP jusqu'à ce qu'une opération de non-réservation ait lieu. Cela est nécessaire car l'unité d'exécution qui a placé la réservation s'attend à pouvoir utiliser ou examiner le DGSP mis en cache jusqu'à ce qu'elle effectue un appel de non-réservation (qui décrémente le nombre de références utilisateur), même si l'opération de non-réservation qui correspond à l'opération de registre d'origine se produit dans cette fenêtre sur une autre unité d'exécution.

LAPI_RESERVE_DGSP utilise la structure de commande lapi_resv_dgsp_t .
Tableau 3. Les zones lapi_resv_dgsp_t
lapi_resv_dgsp_t, zone type de zone lapi_resv_dgsp_t utilisation de lapi_resv_dgsp_t
type_utilitaire lapi_util_type_t LAPI_RESERVE_DGSP
gdgsp_handle lapi_dg_handle_t OUT-descripteur d'un programme DGSP enregistré
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_UNRESERVE_DGSP

Vous pouvez utiliser cette opération pour désenregistrer ou annuler la réservation d'un DGSP. Cette opération décrémente le nombre de références utilisateur. Si le nombre de références externes et internes est égal à zéro, cette opération permet à LAPI de libérer le DGSP. Toutes les opérations qui décrément un nombre de références font que LAPI vérifie si les deux nombres sont devenus 0 et si tel est le cas, élimine le DGSP. Plusieurs activités LAPI internes incrémentent et décrément un second comptage de référence. Le DGSP mis en cache n'est disponible que lorsque toutes les activités (internes et externes) qui en dépendent et qui utilisent le comptage des références pour le conserver ont déchargé leur référence. Le descripteur DGSP est transmis à LAPI en tant que paramètre de valeur et LAPI n'annule pas le descripteur de l'appelant. Il est de votre responsabilité de ne pas utiliser à nouveau ce descripteur car, lors d'une opération de déréservation, vous avez indiqué que vous ne comptez plus sur le descripteur restant valide.

LAPI_UNRESERVE_DGSP utilise la structure de commande lapi_dref_dgsp_t .
Tableau 4. Les zones lapi_dref_dgsp_t
zone lapi_dref_dgsp_t type de zone lapi_dref_dgsp_t utilisation de lapi_dref_dgsp_t
type_utilitaire lapi_util_type_t LAPI_UNRESERVE_DGSP
gdgsp_handle lapi_dg_handle_t OUT-descripteur d'un programme DGSP enregistré
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_REG_DDM_FUNC

Vous pouvez utiliser cette opération pour enregistrer les fonctions du gestionnaire de distribution des données (DDM). Il fonctionne en conjonction avec l'instruction de la DGSM CONTROL. Il est principalement utilisé pour MPI_Accumulate, mais les clients LAPI peuvent fournir n'importe quelle fonction DDM. Il est également utilisé pour établir une fonction de rappel pour le traitement des données qui sont dispersées dans une mémoire tampon utilisateur côté destination.

L'utilisateur LAPI natif peut installer un rappel sans affecter celui que MPI a enregistré pour MPI_Accumulate. Le prototype de la fonction de rappel est:
typedef long ddm_func_t (        /* return number of bytes processed */
        void      *in,           /* pointer to inbound data          */
        void      *inout,        /* pointer to destination space     */
        long      bytes,         /* number of bytes inbound          */
        int       operand,       /* CONTROL operand value            */
        int       operation      /* CONTROL operation value          */
);

Une fonction DDM intervient entre l'arrivée des données de message et la mémoire tampon cible. L'utilisation la plus courante consiste à combiner des données entrantes avec des données qui se trouvent déjà dans la mémoire tampon cible. Par exemple, si la mémoire tampon cible est un tableau d'entiers et que le message entrant se compose d'entiers, la fonction DDM peut être écrite pour ajouter chaque entier entrant à la valeur qui se trouve déjà dans la mémoire tampon. Les zones opérande et opération de la fonction DDM permettent à une fonction DDM de prendre en charge une série d'opérations avec l'instruction CONTROL en fournissant les valeurs appropriées pour ces zones.

Pour plus d'informations sur la programmation DGSP, voir RSCT for AIX 5L: LAPI Programming Guide .

LAPI_REG_DDM_FUNC utilise la structure de commande lapi_reg_ddm_t . Chaque appel remplace le pointeur de fonction précédent, le cas échéant.
Tableau 5. Les zones lapi_reg_ddm_t
lapi_reg_ddm_t, zone type de zone lapi_reg_ddm_t utilisation de lapi_reg_ddm_t
type_utilitaire lapi_util_type_t LAPI_REG_DDM_FUNC
fonction_ddm ddm_func_t * Pointeur de fonction IN-DDM
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_DG_PACK

Vous pouvez utiliser cette opération pour collecter des données dans une mémoire tampon de pack à partir d'une mémoire tampon utilisateur sous le contrôle d'un DGSP. Une mémoire tampon unique peut être condensée par une série d'appels. L'appelant fournit une valeur position qui est initialisée sur le décalage de début dans la mémoire tampon. Chaque opération de conditionnement ajuste position, de sorte que l'opération de conditionnement suivante puisse commencer là où l'opération de conditionnement précédente s'est terminée. En général, une série d'opérations de pack commence par position initialisée sur 0, mais tout décalage est valide. Il n'y a pas d'état transporté d'une opération de conditionnement à l'autre. Chaque opération de conditionnement démarre au début du DGSP qu'elle est transmise.

LAPI_DGSP_PACK utilise la structure de commande lapi_pack_dgsp_t .
Tableau 6. Les zones lapi_pack_dgsp_t
lapi_pack_dgsp_t, zone type de zone lapi_pack_dgsp_t utilisation de lapi_pack_dgsp_t
type_utilitaire lapi_util_type_t LAPI_DGSP_PACK
gdgsp_handle lapi_dg_handle_t OUT-descripteur d'un programme DGSP enregistré
dans_buf void * Mémoire tampon source IN à compresser
octets ulong IN-nombre d'octets à emballer
bu_sortie void * OUT-tampon de sortie pour le pack
taille_sortie ulong Taille de la mémoire tampon d'entrée-sortie en octets
position ulong IN/OUT-décalage de la mémoire tampon en cours
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_DG_UNPACK

Vous pouvez utiliser cette opération pour disperser des données d'une mémoire tampon condensée vers une mémoire tampon utilisateur sous le contrôle d'un DGSP. Une seule mémoire tampon peut être décompressée par une série d'appels. L'appelant fournit une valeur position qui est initialisée sur le décalage de début dans la mémoire tampon condensée. Chaque opération de déballage ajuste position, de sorte que l'opération de déballage suivante puisse commencer là où s'est terminée l'opération de déballage précédente. En règle générale, une série d'opérations de décompression commence par l'initialisation de position sur 0, mais tout décalage est valide. Aucun état n'est passé d'une opération de déballage à l'autre. Chaque opération de décompression démarre au début du DGSP qu'elle est transmise.

LAPI_DGSP_UNPACK utilise la structure de commande lapi_unpack_dgsp_t .
Tableau 7. Les zones lapi_unpack_dgsp_t
lapi_unpack_dgsp_t, zone type de zone lapi_unpack_dgsp_t utilisation de lapi_unpack_dgsp_t
type_utilitaire lapi_util_type_t LAPI_DGSP_UNPACK
gdgsp_handle lapi_dg_handle_t OUT-descripteur d'un programme DGSP enregistré
buf void * Mémoire tampon source IN pour le déballage
taille_exécution ulong Taille de la mémoire tampon source en octets
bu_sortie void * OUT-Mémoire tampon de sortie pour décompression
octets ulong Nombre d'octets entrants à décompresser
taille_sortie ulong Taille de la mémoire tampon d'entrée-sortie en octets
position ulong IN/OUT-décalage de la mémoire tampon en cours
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_ADD_UDP_DEST_PORT

Vous pouvez utiliser cette opération pour mettre à jour les informations de port UDP relatives à la tâche de destination. Cette opération peut être utilisée lorsque vous avez écrit votre propre gestionnaire UDP (udp_h???) et que vous devez prendre en charge la reprise des tâches ayant échoué. Vous ne pouvez pas utiliser cette opération dans l'environnement d'exécution POE.

LAPI_ADD_UDP_DEST_PORT utilise la structure de commande lapi_add_udp_port_t .
Tableau 8. Les zones lapi_add_udp_port_t
lapi_add_udp_port_t, zone type de zone lapi_add_udp_port_t utilisation de lapi_add_udp_port_t
type_utilitaire lapi_util_type_t LAPI_ADD_UDP_DEST_PORT
tgt uint ID tâche de destination en entrée
port_udp_u lapi_udp_t * Informations de port IN-UDP pour la cible
instance_no uint Numéro d'instance du protocole UDP
un_usr_func lapi_usr_fcall_t Pour le débogage uniquement
statut lapi_status_t OUT-support futur

LAPI_GET_THREAD_FUNC

Vous pouvez utiliser cette opération pour extraire diverses fonctions de verrouillage et de signalisation partagées . L'extraction de ces fonctions est valide uniquement après l'initialisation de LAPI et avant l'arrêt de LAPI. Vous ne devez appeler aucune de ces fonctions après l'arrêt de LAPI.

LAPI_GET_THREAD_FUNC utilise la structure de commande lapi_thread_func_t .
Tableau 9. Les zones lapi_thread_func_t
lapi_thread_func_t, zone type de zone lapi_thread_func_t utilisation de lapi_thread_func_t
type_utilitaire lapi_util_type_t LAPI_GET_THREAD_FUNC
verrouillage_mutex lapi_mutex_lock_t OUT-mutex lock pointeur de fonction
déverrouillage mutex lapi_mutex_unlock_t OUT-mutex unlock pointeur de fonction
verrouille_try_mutex lapi_mutex_trylock_t OUT-mutex try lock pointeur de fonction
propriétaire-get_mutex lapi_mutex_getowner_t OUT-mutex get owner pointeur de fonction
attente-cond_attente lapi_cond_wait_t OUT- condition wait pointeur de fonction
temps_cond_attente lapi_cond_timedwait_t OUT- condition attente temporisée pointeur de fonction
signal cond_signal lapi_cond_signal_t OUT- condition signal pointeur de fonction
initial_cond_init lapi_cond_init_t OUT-Initialiser la condition pointeur de fonction
détruisir_cond_destruction lapi_cond_destroy_t Condition OUT-destroy pointeur de fonction

LAPI utilise la bibliothèque pthread pour la gestion des ID d'unité d'exécution. Vous pouvez donc utiliser pthread_self() pour obtenir l'ID d'unité d'exécution en cours d'exécution et lapi_mutex_getowner_t pour obtenir l'ID d'unité d'exécution qui possède le verrou partagé. Ensuite, vous pouvez utiliser pthread_equal() pour voir si les deux sont identiques.

Fonctions d'unité d'exécution de processus mutex

LAPI_GET_THREAD_FUNC inclut les fonctions d'unité d'exécution de mutex suivantes: verrou de mutex, déverrouillage de mutex, verrou d'essai de mutex et propriétaire d'obtention de mutex.

Mutex lock function pointer
int (*lapi_mutex_lock_t)(lapi_handle_t hndl);
Cette fonction acquiert le verrou associé au descripteur LAPI spécifié. L'appel se bloque si le verrou est déjà détenu par une autre unité d'exécution. Un interblocage peut se produire si l'unité d'exécution appelante détient déjà le verrou. Vous êtes responsable de la prévention et de la détection des interblocages.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
Return values
0
Indique que le verrou a été acquis avec succès.
EINVAL
Est renvoyé si le verrou n'est pas valide en raison d'une valeur hndl incorrecte.
Mutex unlock function pointer
int (*lapi_mutex_unlock_t)(lapi_handle_t hndl);
Cette fonction libère le verrou associé au descripteur LAPI spécifié. Une unité d'exécution ne doit déverrouiller que ses propres verrous.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
Return values
0
Indique que le verrouillage a été libéré.
EINVAL
Est renvoyé si le verrou n'est pas valide en raison d'une valeur hndl incorrecte.
Mutex try lock function pointer
int (*lapi_mutex_trylock_t)(lapi_handle_t hndl);
Cette fonction tente d'acquérir le verrou associé au descripteur LAPI spécifié, mais renvoie immédiatement si le verrou est déjà détenu.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
Return values
0
Indique que le verrou a été acquis avec succès.
EBUSY
Indique que le verrou est en cours de maintien.
EINVAL
Est renvoyé si le verrou n'est pas valide en raison d'une valeur hndl incorrecte.
Mutex get owner function pointer
int (*lapi_mutex_getowner_t)(lapi_handle_t hndl, pthread_t *tid);
Cette fonction extrait l'ID pthread de l'unité d'exécution qui détient actuellement le verrou associé au descripteur LAPI spécifié. LAPI_NULL_THREAD_ID indique que le verrou n'est pas maintenu au moment où la fonction est appelée.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
Sortie
ID tid
Est un pointeur destiné à contenir l'ID pthread à extraire.
Return values
0
Indique que le propriétaire du verrou a été extrait avec succès.
EINVAL
Est renvoyé si le verrou n'est pas valide en raison d'une valeur hndl incorrecte.

Fonctions de condition

LAPI_GET_THREAD_FUNC inclut les fonctions condition suivantes: condition attente, condition attente temporisée, condition signal, condition d'initialisation et condition de destruction.

Condition wait function pointer
int (*lapi_cond_wait_t)(lapi_handle_t hndl, lapi_cond_t *cond);
Cette fonction attend sur une variable de condition (cond). L'utilisateur doit conserver le verrou associé au descripteur LAPI (hndl) avant d'effectuer l'appel. Lors du retour de l'appel, LAPI garantit que le verrou est toujours détenu. Le même descripteur LAPI doit être fourni aux opérations lapi_cond_wait_t simultanées sur la même variable de condition.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
ID de connexion
Est un pointeur vers la variable de condition à attendre.
Return values
0
Indique que la variable de condition a été signalée.
EINVAL
Indique que la valeur spécifiée par hndl ou cond n'est pas valide.
Condition timed wait function pointer
int (*lapi_cond_timedwait_t)(lapi_handle_t hndl, 
                             lapi_cond_t *cond, 
                             struct timespec *timeout);
Cette fonction attend sur une variable de condition (cond). L'utilisateur doit conserver le verrou associé au descripteur LAPI (hndl) avant d'effectuer l'appel. Lors du retour de l'appel, LAPI garantit que le verrou est toujours détenu. Le même descripteur LAPI doit être fourni aux opérations lapi_cond_timedwait_t simultanées sur la même variable de condition.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
ID de connexion
Est un pointeur vers la variable de condition à attendre.
délai d'attente
Est un pointeur vers la structure temporelle absolue spécifiant le délai d'attente.
Return values
0
Indique que la variable de condition a été signalée.
ETIMEDOUT
Indique que le temps spécifié par délai d'attente est écoulé.
EINVAL
Indique que la valeur spécifiée par hndl, cond, ou timeout n'est pas valide.
Condition signal function pointer
int (*lapi_cond_wait_t)(lapi_handle_t hndl, lapi_cond_t *cond);
typedef int (*lapi_cond_signal_t)(lapi_handle_t hndl, lapi_cond_t *cond);
Cette fonction signale une variable de condition (cond) pour réveiller une unité d'exécution bloquée sur la condition. S'il y a plusieurs unités d'exécution en attente de la variable de condition, l'unité d'exécution à réveiller est décidée de manière aléatoire.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
ID de connexion
Est un pointeur vers la variable de condition à signaler.
Return values
0
Indique que la variable de condition a été signalée.
EINVAL
Indique que la valeur spécifiée par hndl ou cond n'est pas valide.
Initialize condition function pointer
int (*lapi_cond_init_t)(lapi_handle_t hndl, lapi_cond_t *cond);
Cette fonction initialise une variable de condition.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
ID de connexion
Désigne un pointeur vers la variable de condition à initialiser.
Return values
0
Indique que la variable de condition a été initialisée avec succès.
FEAGA
Indique que le système ne dispose pas des ressources nécessaires (autres que la mémoire) pour initialiser une autre variable de condition.
ENOMEM
Indique que la mémoire est insuffisante pour initialiser la variable de condition.
EINVAL
Est renvoyé si la valeur hndl n'est pas valide.
Destroy condition function pointer
int (*lapi_cond_destroy_t)(lapi_handle_t hndl, lapi_cond_t *cond);
Cette fonction détruit une variable de condition.
Parameters
ENTREE
hndl
Indique le descripteur LAPI.
ID de connexion
Pointeur vers la variable de condition à détruire.
Return values
0
Indique que la destruction de la variable de condition a abouti.
EBUSY
Indique que l'implémentation a détecté une tentative de destruction de l'objet référencé par cond alors qu'il est référencé (lors de son utilisation dans un lapi_cond_wait_t ou lapi_cond_timedwait_t par une autre unité d'exécution, par exemple).
EINVAL
Indique que la valeur spécifiée par hndl ou cond n'est pas valide.

Paramètres

ENTREE
hndl
Indique le descripteur LAPI.
Entrée-sortie
cmd util_cmd
Indique le type de commande de la fonction d'utilitaire.
Sortie
erreur ierror
Indique un code retour FORTRAN. Il s'agit toujours du dernier paramètre.

Valeurs renvoyées

SUCCÈS_LAPIEU
Indique que l'appel de fonction a abouti.
ERREUR_LAPI_DGSP
Indique que le DGSP transmis est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN) ou n'est pas un DGSP enregistré.
ATOME_ERREUR_LAPI_ERR_DGSP_ATOM
Indique que le DGSP a une atom_size inférieure à 0 ou supérieure à MAX_ATOM_SIZE.
BRANCH_ERR_LAPI_ERR_DGSP_BRANCHE
Indique que le DGSP a tenté une branche qui se trouve en dehors du tableau de codes. Cette valeur est renvoyée uniquement en mode de validation.
LAPI_ERR_DG_COPY_SZ
Est renvoyé avec la validation DGSP activée lorsque le bloc MCOPY < 0 ou l'instruction COPY avec les octets < 0. Cette valeur est renvoyée uniquement en mode de validation.
LAPI_ERR_DG_LIBRE
Indique que LAPI a tenté de libérer un DGSP qui n'est pas valide ou qui n'est plus enregistré. Il doit y avoir une opération LAPI_UNRESERVE_DGSP pour fermer l'opération LAPI_REGISTER_DGSP et une opération LAPI_UNRESERVE_DGSP pour chaque opération LAPI_RESERVE_DGSP .
LAPI_ERR_DG_OPC
Indique que le DGSP opcode n'est pas valide. Cette valeur est renvoyée uniquement en mode de validation.
CHEMIN_ERREUR_LAPI_DGSP_STACK
Indique que la profondeur GOSUB du DGSP est supérieure à celle prise en charge par la pile allouée. L'allocation de pile est spécifiée par le membre dgsp->depth. Cette valeur est renvoyée uniquement en mode de validation.
LAPI_ERR_HNDL_INVALID
Indique que le hndl transmis n'est pas valide (non initialisé ou à l'état arrêté).
LAPI_ERR_MEMORY_ÉPUISÉE
Indique que LAPI ne peut pas obtenir de mémoire du système.
LAPI_ERR_UDP_PORT_INFO
Indique que le pointeur d'information udp_port est NULL (en C) ou que la valeur de udp_port est LAPI_ADDR_NULL (en FORTRAN).
ERREUR_UTIL_LAPI_CMD
Indique que le type de commande n'est pas valide.

Exemples C

  1. Pour créer et enregistrer un DGSP:
    
    {
          /*
          ** DGSP code array.  DGSP instructions are stored
          ** as ints (with constants defined in lapi.h for
          ** the number of integers needed to store each
          ** instruction).  We will have one COPY and one ITERATE
          ** instruction in our DGSP.  We use LAPI's constants
          ** to allocate the appropriate storage.
          */
          int code[LAPI_DGSM_COPY_SIZE+LAPI_DGSM_ITERATE_SIZE];
    
          /* DGSP description */
          lapi_dgsp_descr_t dgsp_d;
    
          /*
          ** Data structure for the xfer call.
          */
          lapi_xfer_t   xfer_struct;
    
       
          /* DGSP data structures */
          lapi_dgsm_copy_t     *copy_p;   /* copy instruction    */
          lapi_dgsm_iterate_t  *iter_p;   /* iterate instruction */
          int                  *code_ptr; /* code pointer        */
    
          /* constant for holding code array info */
          int                   code_less_iterate_size;
    
          /* used for DGSP registration */
          lapi_reg_dgsp_t     reg_util;
    
    
          /*
          ** Set up dgsp description
          */
    
          /* set pointer to code array */
          dgsp_d.code = &code[0];
    
          /* set size of code array */
          dgsp_d.code_size = LAPI_DGSM_COPY_SIZE + LAPI_DGSM_ITERATE_SIZE;
    
          /* not using DGSP gosub instruction */
          dgsp_d.depth = 1;
    
          /*
          ** set density to show internal gaps in the
          ** DGSP data layout
          */
          dgsp_d.density = LAPI_DGSM_SPARSE;
    
          /* transfer 4 bytes at a time */
          dgsp_d.size = 4;
    
          /* advance the template by 8 for each iteration */
          dgsp_d.extent = 8;
    
          /*
          ** ext specifies the memory 'footprint' of
          ** data to be transferred. The lext specifies
          ** the offset from the base address to begin
          ** viewing the data.  The rext specifies the
          ** length from the base address to use.
          */
          dgsp_d.lext = 0;
          dgsp_d.rext = 4;
          /* atom size of 0 lets LAPI choose the packet size */
          dgsp_d.atom_size = 0;
    
          /*
          ** set up the copy instruction
          */
          copy_p = (lapi_dgsm_copy_t *)(dgsp_d.code);
          copy_p->opcode = LAPI_DGSM_COPY;
    
          /* copy 4 bytes at a time */
          copy_p->bytes = (long) 4;
    
          /* start at offset 0 */
          copy_p->offset = (long) 0;
    
          /* set code pointer to address of iterate instruction */
          code_less_iterate_size =  dgsp_d.code_size - LAPI_DGSM_ITERATE_SIZE;
          code_ptr = ((int *)(code))+code_less_iterate_size;
    
          /*
          ** Set up iterate instruction
          */
          iter_p = (lapi_dgsm_iterate_t *) code_ptr;
          iter_p->opcode = LAPI_DGSM_ITERATE;
          iter_p->iter_loc = (-code_less_iterate_size);
    
          /* Set up and do DGSP registration */
          reg_util.Util_type = LAPI_REGISTER_DGSP;
          reg_util.idgsp = &dgsp_d;
          LAPI_Util(hndl, (lapi_util_t *)&reg_util);
    
          /* 
          ** LAPI returns a usable DGSP handle in 
          ** reg_util.dgsp_handle
          ** Use this handle for subsequent reserve/unreserve
          ** and Xfer calls.  On the receive side, this
          ** handle can be returned by the header handler using the 
          ** return_info_t mechanism.  The DGSP will then be used for
          ** scattering data.
          */
          
    }
    
  2. Pour réserver un descripteur DGSP:
    
    {
    	
          reg_util.dgsp_handle = dgsp_handle;
    
          /* 
          ** dgsp_handle has already been created and
          ** registered as in the above example
          */
    
          reg_util.Util_type = LAPI_RESERVE_DGSP;
          LAPI_Util(hndl, (lapi_util_t *)&reg_util);
    
          /*
          ** LAPI's internal reference count to dgsp_handle
          ** will be incremented.  DGSP will
          ** remain available until an unreserve is
          ** done for each reserve, plus one more for
          ** the original registration.
          */
    
    }
    
  3. Pour annuler la réservation d'un descripteur DGSP:
    
    {
    	
          reg_util.dgsp_handle = dgsp_handle;
    
          /* 
          ** dgsp_handle has already created and
          ** registered as in the above example, and
          ** this thread no longer needs it.
          */
    
          reg_util.Util_type = LAPI_UNRESERVE_DGSP;
          LAPI_Util(hndl, (lapi_util_t *)&reg_util);
    
          /*
          ** An unreserve is required for each reserve,
          ** plus one more for the original registration.
          */
    
    }
    

Emplacement

/usr/lib/liblapi_r.a

Informations connexes

Sous-routines: LAPI_Init, LAPI_Xfer