#ifndef _LIBMSG #define _LIBMSG #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include /* Code retour des fonctions constituant l'API */ typedef long MSGT_Status; #define MSGS_OK DSS_OK /* La fonction s'est correctement exécutée et a produit un résultat */ #define MSGS_KO DSS_KO /* La fonction s'est correctement exécutée mais n'a pas produit de résultat */ #define MSGS_YES MSGS_OK /* Résultat booléen positif */ #define MSGS_NO MSGS_KO /* Résultat booléen négatif */ #define MSGS_ERRMEM DSS_ERRMEM /* Problème d'allocation mémoire */ #define MSGS_ERRAPI DSS_ERRAPI /* Utilisation incorrecte des API */ #define MSGS_ERRSHM DSS_ERRSHM /* Problème relatif aux segments de mémoire partagée */ #define MSGS_ERRSEM DSS_ERRSEM /* Problème relatif à l'utilisation des sémaphores */ #define MSGS_ERRSIG DSS_ERRSIG /* Opération sur sémaphore interrompue par un signal */ #define MSGS_ERRDLL DSS_ERRDLL /* Problème de chargement dynamique de librairie */ #define MSGS_ERRNOWAIT -7 /* Opération sur sémaphore impossible et le mode d'opération est sans attente */ #define MSG_ERROR(s) ((s) < 0) /* Tous les codes retour négatifs correspondent à des erreurs */ /* Codes retour spécifiques pour la réception de messages */ #define MSGS_NO_MSG 5 #define MSGS_BAD_TYPE 6 /* Indicateurs */ typedef int MSGT_Flags; /* Flags de debug sur l'ouverture de la librairie */ #define MSGD_DEBUG_NONE SMD_DEBUG_NONE /* pour n'afficher aucun message généré par les diverses librairies */ #define MSGD_DEBUG SMD_DEBUG /* pour afficher les messages générés par la librairie */ #define MSGD_DEBUG_ALL SMD_DEBUG_ALL /* pour afficher les messages générés par toutes les librairies sous-jacentes */ #define MSGD_DEBUG_MSK (MSGD_DEBUG & MSGD_DEBUG_ALL) /* Flags d'ouverture et de fermeture des différentes ressources de la librairie */ #define MSGD_OPEN SMD_OPEN #define MSGD_CREATE SMD_CREATE #define MSGD_MSK_OPEN(a) (MSGD_OPEN & (a)) #define MSGD_MSK_CREATE(a) (MSGD_CREATE & (a)) #define MSGD_CLOSE SMD_CLOSE #define MSGD_DESTROY SMD_DESTROY /* Flags de réception de message */ #define MSGD_NO_WAIT 1 /* Réception sans attente si aucun message */ #define MSGD_WAIT 2 /* Réception avec attente */ /* Flags de verrouillage d'un port de messages */ #define MSGD_READ 1 /* verrou partagé */ #define MSGD_WRITE 2 /* verrou exclusif */ #define MSGD_MSK_READ(a) (MSGD_READ & (a)) #define MSGD_MSK_WRITE(a) (MSGD_WRITE & (a)) #define MSGD_UNLIMITED 0 /* Notion de port de messages */ typedef struct { char Name [50]; /* Nom du port de messages */ size_t Size; /* Taille limite du port en nombre de messages */ int ListenSemID; /* sémaphore permettant l'écoute du port */ int LockSemID; /* sémaphore permettant le verrouillage du port */ NDT_Root * SemList; /* Liste des sémaphores des listes de ports qui sont à l'écoute du port */ NDT_Root * MsgQueue; /* File d'attente des messages */ } MSGT_Port; /* Quelques ports de message prédéfinis */ #define MSGD_DEFAULT_PORT_NAME "DEFAULT_PORT" #define MSGD_SYSTEM_PORT_NAME "SYSTEM_PORT" #define MSGD_SUPERVISOR_PORT_NAME "SUPERVISOR_PORT" /* Notion de liste de ports de messages */ typedef struct { NDT_Root * Root; /* Liste de ports de messages */ int ListenSemID; /* Identifiant du sémaphore pour l'écoute de la liste de ports */ } MSGT_PortList; /* Notion de messages */ typedef struct { char From [50]; /* Nom du port d'écoute de l'initiateur du message */ char Via [50]; /* Nom du port d'écoute du dernier envoyeur du message */ char To [50]; /* Nom du port du dernier envoi du message */ unsigned int Type; /* Type du message */ int Priority; /* Priorité du message */ size_t Size; /* Taille des données du message */ void * Data; /* Données du message */ char * Swap; /* Nom du fichier de swap dans lequel est stocké le message */ } MSGT_Message; #define MSGD_NO_TYPE 0 /* Types de message : Les types de message vont de 1 à 255 et sont partagés en 2 plages : - messages systèmes prédéfinis de 1 à 32 - messages utilisateur de 33 à 255 */ #define MSGD_NO_TYPE 0 #define MSGD_NB_SYSTEM_MESSAGE 32 #define MSGD_IS_SYSTEM(t) ((t) != MSGD_NO_TYPE && (t) < MSGD_NB_SYSTEM_MESSAGE) #define MSGD_IS_SYSTEM_REQUEST(t) ((t) != MSGD_NO_TYPE && (t) < MSGD_NB_SYSTEM_MESSAGE && (t) % 2 == 1) #define MSGD_IS_SYSTEM_REPLY(t) ((t) != MSGD_NO_TYPE && (t) < MSGD_NB_SYSTEM_MESSAGE && (t) % 2 == 0) #define MSGD_SYSTEM_PING_REQUEST 1 #define MSGD_SYSTEM_PING_REPLY 2 #define MSGD_SYSTEM_STOP_REQUEST 3 #define MSGD_SYSTEM_STOP_REPLY 4 #define MSGD_SYSTEM_CONTINUE_REQUEST 5 #define MSGD_SYSTEM_CONT_REPLY 6 #define MSGD_SYSTEM_RESTART_REQUEST 7 #define MSGD_SYSTEM_RESTART_REPLY 8 #define MSGD_SYSTEM_SHUTDOWN_REQUEST 9 #define MSGD_SYSTEM_SHUTDOWN_REPLY 10 #define MSGD_SYSTEM_STATUS_REQUEST 11 #define MSGD_SYSTEM_STATUS_REPLY 12 #define MSGD_SYSTEM_INFO_REQUEST 13 #define MSGD_SYSTEM_INFO_REPLY 14 #define MSGD_SYSTEM_TRACEON_REQUEST 15 #define MSGD_SYSTEM_TRACEON_REPLY 16 #define MSGD_SYSTEM_TRACEOFF_REQUEST 17 #define MSGD_SYSTEM_TRACEOFF_REPLY 18 /* Type de message système générique (utile pour ne réceptionner que les messages système) */ #define MSGD_SYSTEM_GENERIC MSGD_NB_SYSTEM_MESSAGE /* Quelques types de messages utilisateur prédéfinis */ #define MSGD_USER_TYPE1 MSGD_NB_SYSTEM_MESSAGE + 1 #define MSGD_USER_TYPE2 MSGD_NB_SYSTEM_MESSAGE + 2 #define MSGD_DEFAULT_TYPE MSGD_USER_TYPE1 /* Priorités des messages : Les priorités vont de -128 (la plus elevée) à 127 (plus basse) divisées en 2 plages : - Priorités des messages système : [-128, -65] U [+65, +127] - Priorités des messages utilisateur : [-64, +64] */ #define MSGD_SYSTEM_HIGH_PRIORITY -128 #define MSGD_SYSTEM_LOW_PRIORITY 127 #define MSGD_USER_HIGH_PRIORITY -64 #define MSGD_USER_NORMAL_PRIORITY 0 #define MSGD_USER_LOW_PRIORITY 64 #define MSGD_DEFAULT_PRIORITY MSGD_USER_NORMAL_PRIORITY /* Types de configuration */ typedef int MSGT_Config; #define MSGD_CONFIG_SIZE 1 /* Configuration de la taille d'un port de messages */ #define MSGD_CONFIG_MSGQUEUE 2 /* Choix du type de structure pour la queue de message d'un port de messages */ #define MSGD_CONFIG_TYPE 3 /* Configuration du type d'un message */ #define MSGD_CONFIG_PRIORITY 4 /* Configuration de la priorité d'un message */ char MSG_Error_Msg [512]; /* Base de la librairie LIBMSG */ SMT_Heap * MSG_Base_Heap; SMT_Heap * MSG_Message_Heap; typedef struct { NDT_Root * Port_List; /* Liste de tous les ports de messages */ } MSGT_Base; MSGT_Base * MSG_Base; /* Contenu d'un message de type PING_REPLY */ typedef struct { struct timeval Snd1; struct timeval Rcv1; struct timeval Snd2; struct timeval Rcv2; } MSGT_PingData; /* Définition des alias de l'API */ #ifndef MSG_MODE #define MSG_MODE 0 #endif #if MSG_MODE == 1 /* Utilisation des API sans vérification des arguments */ # define MSG_Library_Open MSG_Library_Open_I # define MSG_Library_Signal MSG_Library_Signal_I # define MSG_Library_IsOpen MSG_Library_IsOpen_I # define MSG_Library_Context_Set MSG_Library_Context_Set_I # define MSG_Library_Context_Get MSG_Library_Context_Get_I # define MSG_Library_Close MSG_Library_Close_I # define MSG_Library_Stderr_Set MSG_Library_Stderr_Set_I # define MSG_Library_Dump MSG_Library_Dump_I # define MSG_Port_Exist MSG_Port_Exist_I # define MSG_Port_Open MSG_Port_Open_I # define MSG_Port_Config MSG_Port_Config_I # define MSG_Port_Lock MSG_Port_Lock_I # define MSG_Port_Unlock MSG_Port_Unlock_I # define MSG_Port_Close MSG_Port_Close_I # define MSG_PortList_Open MSG_PortList_Open_I # define MSG_PortList_Port_Add MSG_PortList_Port_Add_I # define MSG_PortList_Port_Remove MSG_PortList_Port_Remove_I # define MSG_PortList_Close MSG_PortList_Close_I # define MSG_PortList_Listen MSG_PortList_Listen_I # define MSG_Message_Alloc MSG_Message_Alloc_I # define MSG_Message_Config MSG_Message_Config_I # define MSG_Message_Free MSG_Message_Free_I # define MSG_Message_Send MSG_Message_Send_I # define MSG_Message_Receive MSG_Message_Receive_I # define MSG_Message_Reply MSG_Message_Reply_I # define MSG_Message_Return MSG_Message_Return_I #else /* Utilisation avec vérification des arguments */ # define MSG_Library_Open MSG_Library_Open_C # define MSG_Library_IsOpen MSG_Library_IsOpen_C # define MSG_Library_Signal MSG_Library_Signal_C # define MSG_Library_Context_Set MSG_Library_Context_Set_C # define MSG_Library_Context_Get MSG_Library_Context_Get_C # define MSG_Library_Close MSG_Library_Close_C # define MSG_Library_Stderr_Set MSG_Library_Stderr_Set_C # define MSG_Library_Dump MSG_Library_Dump_C # define MSG_Port_Exist MSG_Port_Exist_C # define MSG_Port_Open MSG_Port_Open_C # define MSG_Port_Config MSG_Port_Config_C # define MSG_Port_Lock MSG_Port_Lock_C # define MSG_Port_Unlock MSG_Port_Unlock_C # define MSG_Port_Close MSG_Port_Close_C # define MSG_PortList_Open MSG_PortList_Open_C # define MSG_PortList_Port_Add MSG_PortList_Port_Add_C # define MSG_PortList_Port_Remove MSG_PortList_Port_Remove_C # define MSG_PortList_Close MSG_PortList_Close_C # define MSG_PortList_Listen MSG_PortList_Listen_C # define MSG_Message_Alloc MSG_Message_Alloc_C # define MSG_Message_Config MSG_Message_Config_C # define MSG_Message_Free MSG_Message_Free_C # define MSG_Message_Send MSG_Message_Send_C # define MSG_Message_Receive MSG_Message_Receive_C # define MSG_Message_Reply MSG_Message_Reply_C # define MSG_Message_Return MSG_Message_Return_C #endif /*------------------------------------------------------------------------------*/ /* Permet d'indiquer à la librairie qu'un signal a été reçu. */ /* */ /* NB : cette fonction sera appelée par l'utilisateur pour éviter que le */ /* processus se bloque sur une attente de message malgré la réception de signal */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Signal_I ( void ); MSGT_Status MSG_Library_Signal_C ( void ); /*------------------------------------------------------------------------------*/ /* Ouverture de la librairie */ /*------------------------------------------------------------------------------*/ /* (I) Instance : numéro de l'instance de la librairie */ /* (I) Context : contexte d'utilisation de la librairie */ /* (I) Open_Mode : mode d'ouverture de la librairie */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Open_I ( int Instance, const char * Context, MSGT_Flags Open_Mode ); MSGT_Status MSG_Library_Open_C ( int Instance, const char * Context, MSGT_Flags Open_Mode ); /*------------------------------------------------------------------------------*/ /* Teste si la librairie a été ouverte */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_IsOpen_I ( void ); MSGT_Status MSG_Library_IsOpen_C ( void ); /*------------------------------------------------------------------------------*/ /* Changement de contexte d'utilisation de la librairie */ /*------------------------------------------------------------------------------*/ /* (I) Context : nom du nouveau contexte */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Context_Set_I (const char * Context); MSGT_Status MSG_Library_Context_Set_C (const char * Context); /*------------------------------------------------------------------------------*/ /* Récupération du nom du contexte utilisée */ /*------------------------------------------------------------------------------*/ /* (O) Context : adresse du nom du contexte utilisé */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Context_Get_I (char ** Context); MSGT_Status MSG_Library_Context_Get_C (char ** Context); /*------------------------------------------------------------------------------*/ /* Fermeture de la librairie */ /*------------------------------------------------------------------------------*/ /* (I) Close_Mode : mode de fermeture de la librairie */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Close_I ( MSGT_Flags Close_Mode ); MSGT_Status MSG_Library_Close_C ( MSGT_Flags Close_Mode ); /*------------------------------------------------------------------------------*/ /* Définition de la sortie standard des messages d'erreur de la librairie */ /*------------------------------------------------------------------------------*/ /* (I) Out : flux de sortie des messages d'erreur */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Stderr_Set_I ( FILE * Out ); MSGT_Status MSG_Library_Stderr_Set_C ( FILE * Out ); /*------------------------------------------------------------------------------*/ /* Affichage des ressources de la librairie */ /*------------------------------------------------------------------------------*/ /* (I) Out : Flux de sortie de l'affichage */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Library_Dump_I ( FILE * Out ); MSGT_Status MSG_Library_Dump_C ( FILE * Out ); /*------------------------------------------------------------------------------*/ /* Teste l'existence d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Name : nom du port de messages */ /* (O) Port : adresse d'un pointeur sur le port de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Exist_I ( const char *, MSGT_Port ** ); MSGT_Status MSG_Port_Exist_C ( const char *, MSGT_Port ** ); /*------------------------------------------------------------------------------*/ /* Création/ouverture d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Name : nom du port de messages */ /* (O) Port : adresse d'un pointeur sur le port de messages */ /* (I) Open_Mode : mode d'ouverture du port de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Open_I ( const char * Name, MSGT_Port ** Port, MSGT_Flags Open_Mode ); MSGT_Status MSG_Port_Open_C ( const char * Name, MSGT_Port ** Port, MSGT_Flags Open_Mode ); /*------------------------------------------------------------------------------*/ /* Configuration d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Port : pointeur sur le port de messages */ /* (I) Tag : type de configuration */ /* (I) ... : données de configuration */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Config_I ( MSGT_Port * Port, MSGT_Config Tag, ... ); MSGT_Status MSG_Port_Config_C ( MSGT_Port * Port, MSGT_Config Tag, ... ); /*------------------------------------------------------------------------------*/ /* Verrouillage d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Port : pointeur sur le port de messages */ /* (I) Mode : type de verrouillage */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Lock_I ( MSGT_Port * Port, MSGT_Flags Mode ); MSGT_Status MSG_Port_Lock_C ( MSGT_Port * Port, MSGT_Flags Mode ); /*------------------------------------------------------------------------------*/ /* Déverrouillage d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Port : pointeur sur le port de messages */ /* (I) Mode : type de verrou à enlever */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Unlock_I ( MSGT_Port * Port, MSGT_Flags Mode ); MSGT_Status MSG_Port_Unlock_C ( MSGT_Port * Port, MSGT_Flags Mode ); /*------------------------------------------------------------------------------*/ /* Fermeture d'un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Port : pointeur sur le port de messages */ /* (I) Close_Mode : mode de fermeture du port de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Port_Close_I ( MSGT_Port * Port, MSGT_Flags Close_Mode ); MSGT_Status MSG_Port_Close_C ( MSGT_Port * Port, MSGT_Flags Close_Mode ); /*------------------------------------------------------------------------------*/ /* Création/ouverture d'une liste de ports de messages */ /*------------------------------------------------------------------------------*/ /* (O) PortList : adresse d'un pointeur sur la liste de ports de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_PortList_Open_I ( MSGT_PortList ** PortList ); MSGT_Status MSG_PortList_Open_C ( MSGT_PortList ** PortList ); /*------------------------------------------------------------------------------*/ /* Ajout d'un port de messages à une liste de ports */ /*------------------------------------------------------------------------------*/ /* (I) PortList : pointeur sur la liste de ports de messages */ /* (I) Port : pointeur sur un port de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_PortList_Port_Add_I ( MSGT_PortList * PortList, MSGT_Port * Port ); MSGT_Status MSG_PortList_Port_Add_C ( MSGT_PortList * PortList, MSGT_Port * Port ); /*------------------------------------------------------------------------------*/ /* Retrait d'un port de messages d'une liste de ports */ /*------------------------------------------------------------------------------*/ /* (I) PortList : pointeur sur la liste de ports de messages */ /* (I) Port : pointeur sur un port de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_PortList_Port_Remove_I ( MSGT_PortList * PortList, MSGT_Port * Port ); MSGT_Status MSG_PortList_Port_Remove_C ( MSGT_PortList * PortList, MSGT_Port * Port ); /*------------------------------------------------------------------------------*/ /* Suppressin d'une liste de ports de messages */ /*------------------------------------------------------------------------------*/ /* (I) PortList : pointeur sur la liste de ports de messages */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_PortList_Close_I ( MSGT_PortList * PortList ); MSGT_Status MSG_PortList_Close_C ( MSGT_PortList * PortList ); /*------------------------------------------------------------------------------*/ /* Ecoute d'une liste de ports de messages */ /*------------------------------------------------------------------------------*/ /* (I) PortList : pointeur sur une liste de ports de messages */ /* (I) Type : type du message à récupérer */ /* (O) Msg : adresse d'un pointeur sur le message à recevoir */ /* (I) Flags : paramètres de réception */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_PortList_Listen_I ( MSGT_PortList * PortList, unsigned int Type, MSGT_Message ** Msg, MSGT_Flags Flags); MSGT_Status MSG_PortList_Listen_C ( MSGT_PortList * PortList, unsigned int Type, MSGT_Message ** Msg, MSGT_Flags Flags); /*------------------------------------------------------------------------------*/ /* Création d'un message */ /*------------------------------------------------------------------------------*/ /* (O) Msg : adresse d'un pointeur sur le message */ /* (I) Size : taille en octets des données du message */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Alloc_I ( MSGT_Message ** Msg, size_t Size ); MSGT_Status MSG_Message_Alloc_C ( MSGT_Message ** Msg, size_t Size ); /*------------------------------------------------------------------------------*/ /* Configuration d'un message */ /*------------------------------------------------------------------------------*/ /* (I) Msg : pointeur sur un message */ /* (I) Tag : type de configuration */ /* (I) ... : données de configuration */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Config_I ( MSGT_Message * Msg, MSGT_Config Tag, ... ); MSGT_Status MSG_Message_Config_C ( MSGT_Message * Msg, MSGT_Config Tag, ... ); /*------------------------------------------------------------------------------*/ /* Destruction d'un message */ /*------------------------------------------------------------------------------*/ /* (I) Msg : pointeur sur le message */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Free_I ( MSGT_Message * Msg ); MSGT_Status MSG_Message_Free_C ( MSGT_Message * Msg ); /*------------------------------------------------------------------------------*/ /* Envoi d'un message dans un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) From : nom du port de messages de l'envoyeur */ /* (I) To : pointeur sur le port de messages destinataire */ /* (I) Msg : pointeur sur le message */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Send_I ( const char * From, MSGT_Port * To, MSGT_Message * Msg ); MSGT_Status MSG_Message_Send_C ( const char * From, MSGT_Port * To, MSGT_Message * Msg ); /*------------------------------------------------------------------------------*/ /* Réception d'un message dans un port de messages */ /*------------------------------------------------------------------------------*/ /* (I) Port : pointeur sur le port de messages */ /* (I) Type : type du message à récupérer */ /* (O) Msg : adresse d'un pointeur sur le message à recevoir */ /* (I) Flags : paramètres de réception */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Receive_I ( MSGT_Port * Port, unsigned int Type, MSGT_Message ** Msg, MSGT_Flags Flags ); MSGT_Status MSG_Message_Receive_C ( MSGT_Port * Port, unsigned int Type, MSGT_Message ** Msg, MSGT_Flags Flags ); /*------------------------------------------------------------------------------*/ /* Retour à l'envoyeur d'un message */ /*------------------------------------------------------------------------------*/ /* (I) Msg : pointeur sur le message */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Reply_I ( MSGT_Message * Msg ); MSGT_Status MSG_Message_Reply_C ( MSGT_Message * Msg ); /*------------------------------------------------------------------------------*/ /* Retour à l'initiateur d'un message */ /*------------------------------------------------------------------------------*/ /* (I) Msg : pointeur sur le message */ /*------------------------------------------------------------------------------*/ MSGT_Status MSG_Message_Return_I ( MSGT_Message * Msg ); MSGT_Status MSG_Message_Return_C ( MSGT_Message * Msg ); #ifdef __cplusplus } #endif #endif