#include #include #include #include #include #include #include #include #include #include #include #include #include extern char * strdup (const char *); int MSG_Signal_Received; /* Tous les heaps créés via la librairie LIBMSG seront préfixés par le nom suivant */ #define MSG_PREFIX "MSG" /* Nom du fichier à charger pour accéder aux fonctions manager d'une data structure créée par la LIBMSG */ #define MSG_FILE_MANAGER "libmsg.so" /* Heap dans lequel sera stockée la base de la librairie LIBMSG : Ce heap ne contient que la structure MSGT_Base qui permet de référencer la liste des ports de messages. Ce heap ne sera constitué que d'une unique segment très petit. */ #define MSG_BASE_HEAP_NAME "BASE" #define MSG_BASE_HEAP_SEGMENT_SIZE 100 /* Heap dans lequel sera stockée la liste des ports de messages : Ce heap ne contient que la structure MSGT_Base qui permet de référencer la liste des ports de messages. Ce heap n'a pas besoin besoin d'être très grand. */ #define MSG_PORT_LIST_NAME "PORT_REF" #define MSG_PORT_LIST_SEGMENT_SIZE 10240 /* Heap sous-jacent à un port de messages : Un port de messages est une data structure qui ne contient que sa racine, les noeuds étant stockés par ailleurs. On peut donc se contenter d'un petit segment. */ #define MSG_PORT_SEGMENT_SIZE 1024 /* Heap dans lequel seront alloués les messages : Ce heap étant amené à grandir rapidemment, il vaut mieux choisir une taille importante par segment afin de limiter le nombre de segments. */ #define MSG_MESSAGE_HEAP_NAME "MSG_REF" #define MSG_MESSAGE_HEAP_SEGMENT_SIZE 1024000 /* Utilisation des sémaphores pour l'écoute des ports de messages ou des liste de ports */ struct sembuf MSG_SemOp_Listen [2] = { {0, -1, 0}, {0, 1, 0} }; /* Opération d'écoute */ struct sembuf MSG_SemOp_Receive [1] = { {0, -1, IPC_NOWAIT} }; /* Opération de retrait de message */ struct sembuf MSG_SemOp_Add [1] = { {0, 1, IPC_NOWAIT} }; /* Opération d'ajout de message */ /* Utilisation des sémaphores pour verrouiller les ports de messages */ struct sembuf MSG_SemOp_SSL [2] = { {0, -1, SEM_UNDO}, {0, 2, SEM_UNDO} }; struct sembuf MSG_SemOp_RSL [2] = { {0, -2, SEM_UNDO|IPC_NOWAIT}, {0, 1, SEM_UNDO|IPC_NOWAIT} }; struct sembuf MSG_SemOp_SEL [2] = { {0, -1, SEM_UNDO}, {0, 0, SEM_UNDO} }; struct sembuf MSG_SemOp_REL [2] = { {0, 0, SEM_UNDO|IPC_NOWAIT}, {0, 1, SEM_UNDO|IPC_NOWAIT} }; /* Compteur d'ouverture de la librairie */ unsigned int MSG_Open_Counter = 0; /* Flux de sortie des messages d'erreur générés par la librairie */ FILE * MSG_stderr; typedef union semun { int val; struct semid_ds * buf; unsigned short int * array; } semun; NDT_Status MSG_Base_Port_List_Manager (va_list); NDT_Status MSG_Semaphore_List_Manager (va_list args_ptr); NDT_Status MSG_PortList_Manager (va_list args_ptr); NDT_Status MSG_MessageQueue_Manager (va_list); MSGT_Status MSG_ShareLock_Set (int); MSGT_Status MSG_ShareLock_Release (int); MSGT_Status MSG_ExclusiveLock_Set (int); MSGT_Status MSG_ExclusiveLock_Release (int); MSGT_Status MSG_Semaphore_Operate (int, struct sembuf *, unsigned int); void MSG_Error_Print ( void ); static char * MSG_Name_Prefix (const char * Name); char * MSG_LockStatus_Get (int SemID);