98 lines
4.1 KiB
C
98 lines
4.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <dlfcn.h>
|
|
#include <stdarg.h>
|
|
#include <errno.h>
|
|
#include <sys/types.h>
|
|
#include <sys/sem.h>
|
|
#include <sys/ipc.h>
|
|
#include <ver.h>
|
|
#include <node.h>
|
|
#include <datastr.h>
|
|
|
|
extern char * strdup ( const char * );
|
|
|
|
/* Compteur d'ouverture de la librairie */
|
|
|
|
unsigned int DS_Open_Counter = 0;
|
|
|
|
/* Tous les heaps créés via la librairie LIBDATASTR seront préfixés par le nom suivant */
|
|
|
|
#define DS_PREFIX "DATASTR"
|
|
|
|
/* Flux de sortie des messages d'erreur */
|
|
|
|
FILE * DS_stderr;
|
|
|
|
/*
|
|
Pour gérer les ouvertures, fermetures ou destructions d'une data structure, on
|
|
opère sur un sémaphore (OpenSemID) rattaché à la description de la structure
|
|
qui comptabilise les processus ayant ouvert la data structure.
|
|
*/
|
|
|
|
struct sembuf DS_SemOp_Open [1] = { {0, 1, SEM_UNDO|IPC_NOWAIT} };
|
|
struct sembuf DS_SemOp_Close [1] = { {0, -1, SEM_UNDO|IPC_NOWAIT} };
|
|
struct sembuf DS_SemOp_Destroy [2] = { {0, -1, SEM_UNDO|IPC_NOWAIT}, {0, 0, SEM_UNDO|IPC_NOWAIT} };
|
|
|
|
typedef union semun {
|
|
int val;
|
|
struct semid_ds * buf;
|
|
unsigned short int * array;
|
|
} semun;
|
|
|
|
/* Liste des data structure ouvertes par le processus courant */
|
|
|
|
NDT_Root * OpenedDS_List;
|
|
|
|
typedef struct {
|
|
NDT_Root * Root;
|
|
char * Name;
|
|
} DST_DataStruct;
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Fonctions privées de la librairie */
|
|
/*------------------------------------------------------------------------------*/
|
|
/*------------------------------------------------------------------------------*/
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Création d'un sémaphore pour gérer l'ouverture d'une data structure */
|
|
/*------------------------------------------------------------------------------*/
|
|
DST_Status DS_Semaphore_Create (NDT_Root * Root);
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Opération sur un sémaphore */
|
|
/*------------------------------------------------------------------------------*/
|
|
DST_Status DS_Semaphore_Operate (int, struct sembuf *, unsigned int);
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Fonction d'allocation attachée à une structure de données : */
|
|
/*------------------------------------------------------------------------------*/
|
|
DST_Status DS_DataStruct_Alloc ( size_t Size, void ** Ptr, void * Data );
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Fonction de désallocation attachée à une structure de données : */
|
|
/*------------------------------------------------------------------------------*/
|
|
DST_Status DS_DataStruct_Free ( void * Ptr, void * Data );
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Routine d'affichage d'un message d'erreur */
|
|
/*------------------------------------------------------------------------------*/
|
|
void DS_Error_Print ( void );
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Pour préfixer les noms de heap avec l'identifiant de la librairie */
|
|
/*------------------------------------------------------------------------------*/
|
|
static char * DS_Name_Prefix (const char * Name);
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Teste si une data structure a déjà été ouverte par le processus courant */
|
|
/*------------------------------------------------------------------------------*/
|
|
DST_Status DS_DataStruct_IsOpen (const char * DS_Name, NDT_Root ** Root);
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* Fonction manager de la liste des DS ouvertes */
|
|
/*------------------------------------------------------------------------------*/
|
|
NDT_Status DS_OpenedDS_List_Manager (va_list Args);
|