#include #include #include #include #include #include #include #include #include #include #include #include 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);