libmsg/lib/libmsg.h
2000-07-28 15:34:22 +00:00

119 lines
3.5 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <ver.h>
#include <node.h>
#include <datastr.h>
#include <msg.h>
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);