Première version
This commit is contained in:
		
						commit
						991dc2df52
					
				
							
								
								
									
										
											BIN
										
									
								
								doc/libshmem.doc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/libshmem.doc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										588
									
								
								doc/man3/libshmem.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								doc/man3/libshmem.3
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,588 @@
 | 
				
			|||||||
 | 
					'\" t
 | 
				
			||||||
 | 
					.\" @(#)LIBSM.3 99/10/27 SMA;
 | 
				
			||||||
 | 
					.TH LIBSM 3 "27 Oct 1999"
 | 
				
			||||||
 | 
					.SH NOM
 | 
				
			||||||
 | 
					LIBSM (librairie de memoires partagees)
 | 
				
			||||||
 | 
					.SH SYNOPSIS
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "cc [flag ...] file ... -lver -ldl -lnode -lshmem [library ...]"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "#include <shmem.h>"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Open ( int " Instance ", const char * " Context_Name ", SMT_Flags " Open_Mode " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Instance_Get ( int * " Instance " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Context_Set ( char * " Context_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Context_Get ( char ** " Context_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Close ( SMT_Flags " Close_Mode " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Stderr_Set ( FILE * " Out " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Exist ( char * " Heap_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Open ( char * " Heap_Name ", SMT_Heap ** " Heap ", size_t " Seg_Size " , SMT_Flags " Open_Flags ", int * " Locked " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Close ( SMT_Heap * " Heap " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_End ( char * " Heap_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Compress ( SMT_Heap * " Heap ", size_t * " Size " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Check ( SMT_Heap * " Heap ", int * " Nb_Detected " , int * " Nb_Corrected ", FILE * " Out " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Lock ( SMT_Heap * " Heap ", SMT_Flags " Lock_Flags ", int * " Locked " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Unlock ( SMT_Heap * " Heap " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Config ( SMT_Heap * " Heap ", SMT_Tag " Tag ", ... );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Chunk_Alloc ( SMT_Heap * " Heap ", void ** " Ptr ", size_t " Size " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Chunk_Free ( SMT_Heap * " Heap ", void * " Ptr " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.SH GENERALITES
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La librairie LIBSM permet de gerer des espaces de memoire partagee.
 | 
				
			||||||
 | 
					Ces espaces de memoire partagee (notion de 'heap') sont references dans une base geree par la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La librairie permet de gerer plusieurs instances, chacune ayant une base qui lui est propre.
 | 
				
			||||||
 | 
					Pour chaque instance, des contextes d'utilisation pourront etre definis.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Les heaps sont constitues de blocs memoire (notion de 'chunk') qui pourront etre alloues et desalloues par les programmes y accedant de maniere concurrente.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Chaque heap presente la particularite d'etre :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- identifie par un nom unique dans la base
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- securise : les acces concurrents sont geres par l'utilisation de semaphores
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La librairie propose des fonctions de gestion :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- de la base de la librairie (initialisation, ouverture, fermeture, destruction).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- des heaps (creation, ouverture, verrouillage, compression, deverrouillage, fermeture, destruction)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- des chunks (allocation, desallocation)
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "BASE DE HEAPS"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La base constitue l'espace commun a tous les utilisateurs d'une instance de la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Cette base est initialisee une premiere fois et reference la liste de tous les heaps de l'instance.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Cette base est protegee par un systeme de verrou permettant de gerer les acces concurrents aux differents heaps. 
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: la base contient un heap 'systeme' qui gere les ressources des autres heaps (dits heaps 'utilisateur').
 | 
				
			||||||
 | 
					Ce heap 'systeme' est un heap prive qui ne devra pas etre accede directement par les utilisateurs de la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "NOTION DE HEAP"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Un heap est un espace de memoire partagee reference dans la base.
 | 
				
			||||||
 | 
					Il y est identifie de maniere unique par son nom.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La notion de contexte d'utilisation permet de distinguer des heaps en prefixant leur nom par ce contexte.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Les acces concurrents aux ressources d'un heap sont geres par un systeme de verrou qui autorise :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- plusieurs acces en lecture simultanes (verrous partages)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- un seul acces en ecriture (verrou exclusif)
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: un verrouillage est opere en mode 'wait', ce qui signifie que les processus desirant verrouiller une ressource non disponible sera mis en attente jusqu'a sa mise en disponibilite.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "NOTION DE CHUNK"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Un chunk est un bloc d'allocation memoire au sein d'un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Un chunk appartient necessairement a une liste de chunks alloues au sein du heap (ACR) ou bien a celle de ses chunks libres (FCR).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.SH TYPES
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					La librairie met a la disposition des utilisateurs les types suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Flags
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Ce type d'indicateur permet de preciser le mode d'ouverture d'une instance/d'un heap de la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_OPEN
 | 
				
			||||||
 | 
					: pour ouvrir une instance/un heap existante/existant
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_CREAT
 | 
				
			||||||
 | 
					: pour creer l'instance/le heap si elle/il n'existe pas
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Pour l'ouverture de la librairie, il permet en outre de preciser le mode de debugging :
 | 
				
			||||||
 | 
					.LP 
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SM_DEBUG_NONE
 | 
				
			||||||
 | 
					: aucun message d'erreur n'est affiche
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SM_DEBUG
 | 
				
			||||||
 | 
					: les messages d'erreur generes par la librairie LIBSHMEM sont affiches sur la sortie standard d'erreur
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SM_DEBUG_ALL
 | 
				
			||||||
 | 
					: les messages d'erreur generes par toutes les librairies sous-jacentes a la LIBSHMEM sont affiches sur la sortie standard d'erreur
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Pour l'ouverture d'un heap, il permet de preciser son type de verrouillage :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_WRITE
 | 
				
			||||||
 | 
					: acces en ecriture (pose d'un verrou exclusif )
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_READ
 | 
				
			||||||
 | 
					: acces en lecture (pose d'un verrou partage)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_UNDEF
 | 
				
			||||||
 | 
					: aucun verrou.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Heap
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Ce type permet de designer un heap ouvert par le processus courant.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					C'est le seul type concernant les heaps qui sera manipule par les utilisateurs a travers les API de la librairie.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.SH FONCTIONS
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Open ( int " Instance ", const char * " Context_Name ", SMT_Flags " Open_Mode " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet d'acceder aux ressources partagees d'une instance de la librairie (base de heap, heap 'systeme').
 | 
				
			||||||
 | 
					Elle devra necessairement etre appelee par tout programme utilisant la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Cette fonction attend les parametres suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Instance
 | 
				
			||||||
 | 
					: numéro de l'instance a ouvrir.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: si cet argument vaut 0, alors c'est la variable d'environnement $INSTANCE qui definira le numéro de l'instance (1000 sinon).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Context
 | 
				
			||||||
 | 
					: nom du contexte a utiliser.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: si cet argument est NULL, alors c'est la variable d'environnement $CONTEXT qui definira le nom du contexte, ("CTX" sinon).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Open_Mode
 | 
				
			||||||
 | 
					: le mode d'ouverture de l'instance (
 | 
				
			||||||
 | 
					.B SMD_CREATE
 | 
				
			||||||
 | 
					pour la creation de l'instance, ou
 | 
				
			||||||
 | 
					.B SMD_OPEN
 | 
				
			||||||
 | 
					pour une ouverture simple)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: cette valeur pourra etre combinee avec un mode de debugging (
 | 
				
			||||||
 | 
					.B SMD_DEBUG_NONE
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					.B SMD_DEBUG
 | 
				
			||||||
 | 
					ou
 | 
				
			||||||
 | 
					.B SMD_DEBUG_ALL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					Outre l'acces aux ressources de l'instance, cette fonction provoque le verrouillage de la base en lecture.
 | 
				
			||||||
 | 
					L'utilisateur de la librairie est ainsi assure de l'existence de ces ressources tout au long de leur utilisation.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: le mode d'ouverture
 | 
				
			||||||
 | 
					.B SMD_CREATE
 | 
				
			||||||
 | 
					est reserve aux administrateurs.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Instance_Get ( int * " Instance " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de recuperer dans l'argument
 | 
				
			||||||
 | 
					.I Instance 
 | 
				
			||||||
 | 
					le numéro de l'instance utilisee.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Context_Set ( char * " Context_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de definir
 | 
				
			||||||
 | 
					.I Context_Name
 | 
				
			||||||
 | 
					comme etant le nom du nouveau contexte d'utilisation de l'instance de la librairie LIBSHMEM.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: specifier un contexte implique que tous les heaps manipules seront prefixes par le nom de ce contexte.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Context_Get ( char ** " Context_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de recuperer dans l'argument
 | 
				
			||||||
 | 
					.I Context_Name
 | 
				
			||||||
 | 
					le nom du contexte utilise.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Close ( SMT_Flags " Close_Flags " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de fermer l'instance de la librairie LIBSM.
 | 
				
			||||||
 | 
					Elle libere egalement le verrou en lecture qui avait ete pose sur la base lors de l'ouverture de l'instance.
 | 
				
			||||||
 | 
					Cette fonction doit donc etre systematiquement appelee a la fin de chaque programme utilisant la librairie.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					L'argument
 | 
				
			||||||
 | 
					.I Close_Flags
 | 
				
			||||||
 | 
					est le mode de fermeture de l'instance :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_CLOSE
 | 
				
			||||||
 | 
					pour fermer simplement l'instance
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					.B SMD_DESTROY
 | 
				
			||||||
 | 
					pour detruire en outre toutes les ressources de l'instance
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: le mode de fermeture 
 | 
				
			||||||
 | 
					.B SMD_DESTROY
 | 
				
			||||||
 | 
					est reserve aux administrateurs.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Bien entendu, la destruction des ressouces de l'instance ne sera pas possible tant qu'il existera d'autres processus utilisant la meme instance.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Library_Stderr_Set ( FILE * " Out " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de definir
 | 
				
			||||||
 | 
					.I Out
 | 
				
			||||||
 | 
					comme la sortie standard des messages d'erreur generes par la librarie.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Exist ( char * " Heap_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de tester si un heap existe deja dans la base.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					L'argument
 | 
				
			||||||
 | 
					.I Heap_Name
 | 
				
			||||||
 | 
					est le nom du heap a tester.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Open ( char * " Heap_Name ", SMT_Heap ** " Heap ", size_t " Seg_Size ", SMT_Flags " Open_Flags ", int * " Locked " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet d'ouvrir ou de creer un heap 'utilisateur' dans la base.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap_Name
 | 
				
			||||||
 | 
					: le nom du heap
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: l'adresse d'un pointeur sur le heap a ouvrir
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Seg_Size
 | 
				
			||||||
 | 
					: la taille des segments qui composeront le heap (une fois le heap cree, cette taille peut etre modifiee via la fonction SM_Heap_Config).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: si cet argument est nul, la taille sera par defaut de 102400 octets. 
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Open_Flags
 | 
				
			||||||
 | 
					: le mode d'acces qui determine d'une part l'ouverture ou la creation du heap et d'autre part son type de verrouillage.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: les deux valeurs
 | 
				
			||||||
 | 
					.B SMD_OPEN
 | 
				
			||||||
 | 
					et
 | 
				
			||||||
 | 
					.B SMD_CREATE
 | 
				
			||||||
 | 
					peuvent etre combinees.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Locked
 | 
				
			||||||
 | 
					: un pointeur sur un indicateur de verrouillage : il indique si le verrou a effectivement ete pose ou si le heap etait deja verrouille dans ce mode
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: le heap cree est constitue d'un seul segment de donnees et contient un unique chunk libre correspondant a ce premier segment de donnees.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Close ( SMT_Heap * " Heap ");"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de fermer un heap ouvert.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle permet non seulement de detacher les ressources du heap du processus appelant, mais elle permet aussi de liberer le verrou pose lors de l'ouverture du heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					L'argument
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					est un pointeur sur un heap ouvert.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_End ( char * " Heap_Name " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de detruire un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					L'argument
 | 
				
			||||||
 | 
					.I Heap_Name
 | 
				
			||||||
 | 
					designe le nom du heap a detruire.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Compress ( SMT_Heap * " Heap ", size_t * " Size " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de compresser un heap, ce qui consiste a fusionner les chunks libres dont les adresses se suivent.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur un heap ouvert
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Size
 | 
				
			||||||
 | 
					: un pointeur sur la taille gagnee par compression
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Check ( SMT_Heap * " Heap ", int * " Nb_Detected " , int * " Nb_Corrected ", FILE * " Out " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de corriger les structures qui constituent un heap dans le cas ou celles-ci contiendraient des incoherences.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Un rapport complet de toutes les erreurs detectees et corrigees sur chacune des structures du heap est affiche.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur un heap ouvert
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Nb_Detected
 | 
				
			||||||
 | 
					: un pointeur sur le nombre d'erreurs detectees
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Nb_Corrected
 | 
				
			||||||
 | 
					: un pointeur sur le nombre d'erreurs corrigees
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Out
 | 
				
			||||||
 | 
					: un pointeur sur le flux de sortie du rapport
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: cette fonction est automatiquement activee lors de l'ouverture d'un heap qui est dans un etat invalide (c.a.d un heap dont une mise a jour n'a pas ete a son terme).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Si toutes les erreurs detectees n'ont pas pu etre corrigees, le heap est declare corrompu et ne sera plus accessible par personne.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Lock ( SMT_Heap * " Heap ", SMT_Flags " Lock_Flags ", int * " Locked " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de poser un verrou sur un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur un heap ouvert
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Lock_Flags
 | 
				
			||||||
 | 
					: le mode de verrouillage
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Locked
 | 
				
			||||||
 | 
					: un pointeur sur un indicateur de verrouillage qui indique si le verrou a effectivement ete pose ou si le heap etait deja verrouille dans ce mode
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: si le heap est deja verrouille avec le mode demande, alors l'indicateur de verrouillage sera valorise a FALSE.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Si le heap est deja verrouille avec un autre type de verrou, alors la fonction retournera
 | 
				
			||||||
 | 
					.B SMS_KO
 | 
				
			||||||
 | 
					.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Unlock ( SMT_Heap * " Heap " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet d'oter le verrou qui a ete pose sur un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					L'argument
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					est un pointeur sur le heap a deverrouiller.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Heap_Config ( SMT_Heap * " Heap ", SMT_Tag " Tag ", ... );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de configurer certain aspects d'un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les aruments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur le heap a configurer.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Tag
 | 
				
			||||||
 | 
					: le type de configuration
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMD_SEGMENT_SIZE
 | 
				
			||||||
 | 
					: definition de la taille (en octets) des nouveaux segments de donnees qui composeront le heap (par defaut, les heaps sont composes de segments de 102 400 octets).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMD_HEAP_LIMIT
 | 
				
			||||||
 | 
					: limitation de la taille totale des segments de donnees qui composent le heap (par defaut, un heap n'est pas limite en taille).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMD_AUTO_COMPRESS
 | 
				
			||||||
 | 
					: nombre de chunks libres a partir duquel le heap est automatiquement compresse (la valeur SMD_NO_AUTO_COMPRESS permet de desactiver cette procedure automatique).
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					NB : cette limite est fixee par defaut a 1 000 chunks.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Chunk_Alloc ( SMT_Heap * " Heap ", void ** " Ptr ", size_t " Size " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de reserver de la memoire dans un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur un heap ouvert
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Size
 | 
				
			||||||
 | 
					: la taille du chunk (en octets)
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (Out)
 | 
				
			||||||
 | 
					.I Ptr
 | 
				
			||||||
 | 
					: l'adresse du pointeur de chunk
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.BI "SMT_Status SM_Chunk_Free ( SMT_Heap * " Heap ", void * " Ptr " );"
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Cette fonction permet de liberer de la memoire dans un heap.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Elle doit recevoir les arguments suivants :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Heap
 | 
				
			||||||
 | 
					: un pointeur sur un heap ouvert
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					* (In)
 | 
				
			||||||
 | 
					.I Ptr
 | 
				
			||||||
 | 
					: un pointeur de chunk
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.SH CODE RETOUR
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Toutes les fonctions constituant l'API de la librairie retourne une valeur de type 
 | 
				
			||||||
 | 
					.B SMT_Status
 | 
				
			||||||
 | 
					:
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_OK
 | 
				
			||||||
 | 
					: la fonction s'est correctement executee et a produit un resultat
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_KO
 | 
				
			||||||
 | 
					: la fonction s'est correctement executee mais n'a pas produit de resultat
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_ERRAPI
 | 
				
			||||||
 | 
					: la fonction a ete appelee avec des arguments de valeur incorrecte
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_ERRMEM
 | 
				
			||||||
 | 
					: la fonction ne s'est pas correctement executee pour un probleme d'allocation memoire
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_ERRSHM
 | 
				
			||||||
 | 
					: la fonction ne s'est pas correctement executee pour un probleme relatif a la memoire partagee
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_ERRSIG
 | 
				
			||||||
 | 
					: une operation sur semaphore a ete interrompue par un signal
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					.B SMS_ERRSEM
 | 
				
			||||||
 | 
					: la fonction ne s'est pas correctement executee pour un probleme relatif a l'utilisation des semaphores
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: la macro
 | 
				
			||||||
 | 
					.B SM_ERROR()
 | 
				
			||||||
 | 
					permet de tester si un code retour correspond a une erreur.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					En cas d'erreur, la variable
 | 
				
			||||||
 | 
					.B SM_Error_Msg
 | 
				
			||||||
 | 
					contient un message du type :
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.RS 3
 | 
				
			||||||
 | 
					Error <Nom fonction> : <message d'erreur>
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.I NB
 | 
				
			||||||
 | 
					: dans la mesure du possible, la librairie tente en cas de probleme de revenir a la situation precedant l'appel a la fonction.
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					Toutefois, pour les cas plus difficiles, la librairie propose une procedure de verification et de correction (
 | 
				
			||||||
 | 
					.B SM_Heap_Check
 | 
				
			||||||
 | 
					) qui permet de corriger des incoherences sur les structures de donnees constituant un heap.
 | 
				
			||||||
 | 
					.RS -3
 | 
				
			||||||
 | 
					.LP
 | 
				
			||||||
 | 
					.SH VOIR AUSSI
 | 
				
			||||||
 | 
					.B libnode
 | 
				
			||||||
 | 
					(3)
 | 
				
			||||||
							
								
								
									
										388
									
								
								include/shmem.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								include/shmem.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,388 @@
 | 
				
			|||||||
 | 
					#ifndef _LIBSM
 | 
				
			||||||
 | 
					#define _LIBSM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <node.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Code retour des fonctions constituant l'API */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef long SMT_Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMS_OK          NDS_OK      /* La fonction s'est correctement exécutée et a produit un résultat */
 | 
				
			||||||
 | 
					#define SMS_KO          NDS_KO      /* La fonction s'est correctement exécutée mais n'a pas produit de résultat */
 | 
				
			||||||
 | 
					#define SMS_NO_WAIT     2			/* Opération sur sémaphore en mode IPC_NOWAIT qui n'a pas pu aboutir */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMS_YES         SMS_OK      /* Résultat booléen positif */
 | 
				
			||||||
 | 
					#define SMS_NO          SMS_KO      /* Résultat booléen négatif */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMS_ERRMEM      NDS_ERRMEM  /* Problème d'allocation mémoire */
 | 
				
			||||||
 | 
					#define SMS_ERRAPI      NDS_ERRAPI  /* Utilisation incorrecte des API */
 | 
				
			||||||
 | 
					#define SMS_ERRSHM      -3          /* Problème relatif aux segments de mémoire partagée */
 | 
				
			||||||
 | 
					#define SMS_ERRSEM      -4          /* Problème relatif à l'utilisation des sémaphores */
 | 
				
			||||||
 | 
					#define SMS_ERRSIG      -5          /* Opération sur sémaphore interrompue par un signal */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SM_ERROR(s)     ((s) < 0)     /* Tous les codes retour négatifs correspondent à des erreurs */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int SMT_Flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_UNDEF       0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Flags d'ouverture d'un heap ou d'une instance de la librairie */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_CREATE      	0x01    /* Création */
 | 
				
			||||||
 | 
					#define SMD_OPEN        	0x02    /* Ouverture simple */
 | 
				
			||||||
 | 
					#define SMD_DESTROY     	0x04    /* Destruction */
 | 
				
			||||||
 | 
					#define SMD_CLOSE       	0x08    /* Fermeture simple */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* NB : pour l'ouverture de la librairie, les valeurs SMD_OPEN et SMD_CREATE sont mutuellement exclusives */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Flags de verrouillage */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_READ        	0x04    /* verrou partagé */
 | 
				
			||||||
 | 
					#define SMD_WRITE       	0x08    /* verrou exclusif */
 | 
				
			||||||
 | 
					#define SMD_NO_LOCK       	0x00    /* aucun verrou */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_LOCK_MSK(a)   	((a) & (SMD_READ|SMD_WRITE))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Mode de debug sur l'ouverture de la librairie */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_DEBUG_NONE  	0x00    /* pour n'afficher aucun message généré par les diverses librairies */
 | 
				
			||||||
 | 
					#define SMD_DEBUG       	0x10    /* pour afficher les messages générés par la librairie */
 | 
				
			||||||
 | 
					#define SMD_DEBUG_ALL   	0x20    /* pour afficher les messages générés par toutes les librairies sous-jacentes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_DEBUG_MSK(a)    ((a) & (SMD_DEBUG|SMD_DEBUG_ALL))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Différentes types de configuration d'un heap */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int SMT_Config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_SEGMENT_SIZE    	1	/* Définir la taille des segments */
 | 
				
			||||||
 | 
					#define SMD_HEAP_LIMIT      	2	/* Définir la taille maximale */
 | 
				
			||||||
 | 
					#define SMD_AUTO_COMPRESS      	3	/* Définir la taille d'un FCR à partir de laquelle
 | 
				
			||||||
 | 
														   la compression du heap est autmatiquement activée */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_DEFAULT_COMPRESS    1000  /* si + de 1000 chunks libres, alors compression du heap */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Différentes valeurs de configuration */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_UNLIMITED           0
 | 
				
			||||||
 | 
					#define SMD_NO_AUTO_COMPRESS    0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Nom du heap système */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define HEAP_SYSTEM  "system"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef FALSE
 | 
				
			||||||
 | 
					#define FALSE 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef TRUE
 | 
				
			||||||
 | 
					#define TRUE 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char SM_Error_Msg [512];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SM_MODE
 | 
				
			||||||
 | 
					#define SM_MODE 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if SM_MODE == 1 /* API sans vérification des arguments */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SM_Library_Open             SM_Library_Open_I
 | 
				
			||||||
 | 
					#define SM_Library_Instance_Get     SM_Library_Instance_Get_I
 | 
				
			||||||
 | 
					#define SM_Library_Context_Set      SM_Library_Context_Set_I
 | 
				
			||||||
 | 
					#define SM_Library_Context_Get      SM_Library_Context_Get_I
 | 
				
			||||||
 | 
					#define SM_Library_Close            SM_Library_Close_I
 | 
				
			||||||
 | 
					#define SM_Library_Dump             SM_Library_Dump_I
 | 
				
			||||||
 | 
					#define SM_Library_Unlock           SM_Library_Unlock_I
 | 
				
			||||||
 | 
					#define SM_Library_Stderr_Set       SM_Library_Stderr_Set_I
 | 
				
			||||||
 | 
					#define SM_Heap_Exist               SM_Heap_Exist_I
 | 
				
			||||||
 | 
					#define SM_Heap_Open                SM_Heap_Open_I
 | 
				
			||||||
 | 
					#define SM_Heap_IsOpen              SM_Heap_IsOpen_I
 | 
				
			||||||
 | 
					#define SM_Heap_Close               SM_Heap_Close_I
 | 
				
			||||||
 | 
					#define SM_Heap_End                 SM_Heap_End_I
 | 
				
			||||||
 | 
					#define SM_Heap_Compress            SM_Heap_Compress_I
 | 
				
			||||||
 | 
					#define SM_Heap_Config              SM_Heap_Config_I
 | 
				
			||||||
 | 
					#define SM_Heap_Check               SM_Heap_Check_I
 | 
				
			||||||
 | 
					#define SM_Heap_Lock                SM_Heap_Lock_I
 | 
				
			||||||
 | 
					#define SM_Heap_Unlock              SM_Heap_Unlock_I
 | 
				
			||||||
 | 
					#define SM_Chunk_Alloc              SM_Chunk_Alloc_I
 | 
				
			||||||
 | 
					#define SM_Chunk_Free               SM_Chunk_Free_I
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else /* API avec vérification des arguments */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SM_Library_Open             SM_Library_Open_C
 | 
				
			||||||
 | 
					#define SM_Library_Instance_Get     SM_Library_Instance_Get_C
 | 
				
			||||||
 | 
					#define SM_Library_Context_Set      SM_Library_Context_Set_C
 | 
				
			||||||
 | 
					#define SM_Library_Context_Get      SM_Library_Context_Get_C
 | 
				
			||||||
 | 
					#define SM_Library_Close            SM_Library_Close_C
 | 
				
			||||||
 | 
					#define SM_Library_Dump             SM_Library_Dump_C
 | 
				
			||||||
 | 
					#define SM_Library_Unlock           SM_Library_Unlock_C
 | 
				
			||||||
 | 
					#define SM_Library_Stderr_Set       SM_Library_Stderr_Set_C
 | 
				
			||||||
 | 
					#define SM_Heap_Exist               SM_Heap_Exist_C
 | 
				
			||||||
 | 
					#define SM_Heap_Open                SM_Heap_Open_C
 | 
				
			||||||
 | 
					#define SM_Heap_IsOpen              SM_Heap_IsOpen_C
 | 
				
			||||||
 | 
					#define SM_Heap_Close               SM_Heap_Close_C
 | 
				
			||||||
 | 
					#define SM_Heap_End                 SM_Heap_End_C
 | 
				
			||||||
 | 
					#define SM_Heap_Compress            SM_Heap_Compress_C
 | 
				
			||||||
 | 
					#define SM_Heap_Config              SM_Heap_Config_C
 | 
				
			||||||
 | 
					#define SM_Heap_Check               SM_Heap_Check_C
 | 
				
			||||||
 | 
					#define SM_Heap_Lock                SM_Heap_Lock_C
 | 
				
			||||||
 | 
					#define SM_Heap_Unlock              SM_Heap_Unlock_C
 | 
				
			||||||
 | 
					#define SM_Chunk_Alloc              SM_Chunk_Alloc_C
 | 
				
			||||||
 | 
					#define SM_Chunk_Free               SM_Chunk_Free_C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Structure de la base de heaps                                                */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    int         SysMemID;     /* ID de la 1ère zone de mémoire partagée de la base */
 | 
				
			||||||
 | 
					    int         DataMemID;    /* ID de la 2ème zone de mémoire partagée de la base */
 | 
				
			||||||
 | 
					    size_t      Size;         /* Taille de la zone de mémoire partagée */
 | 
				
			||||||
 | 
					    int         SemID;        /* ID du sémaphore pour la gestion des verrous */
 | 
				
			||||||
 | 
					    NDT_Root *  MHR;          /* Memory Heap Root : racine de la liste de heap */
 | 
				
			||||||
 | 
					    pid_t       Creator;      /* ID du processus créateur de la base */
 | 
				
			||||||
 | 
					    pid_t       Writer;       /* ID du dernier processus ayant accédé en écriture à la base */
 | 
				
			||||||
 | 
					    void *      Free;         /* Pointeur sur la première zone libre de la base */
 | 
				
			||||||
 | 
					    void *      Attach;       /* Adresse du dernier attachement */
 | 
				
			||||||
 | 
					    size_t      Segment_Size; /* Taille par défaut des segments qui composeront les heaps */
 | 
				
			||||||
 | 
					} SMT_Base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Référence sur la base de heaps */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SMT_Base * SM_Base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Structure d'un MHH (Memory Heap Header)                                      */
 | 
				
			||||||
 | 
					/* Rappel : un MHH est une valeur attachée à un MHN (Memory Heap Node)          */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    char        Name [256];     /* Nom du heap */
 | 
				
			||||||
 | 
					    int         SemID;          /* ID du sémaphore pour la gestion des verrous */
 | 
				
			||||||
 | 
					    NDT_Root *  DSR;            /* Data Segment Root */
 | 
				
			||||||
 | 
					    NDT_Root *  ACR;            /* Allocated Chunks Root */
 | 
				
			||||||
 | 
					    NDT_Root *  FCR;            /* Free Chunks Root */
 | 
				
			||||||
 | 
					    pid_t       Writer;         /* ID du processus ayant accédé en dernier au MHH en écriture */
 | 
				
			||||||
 | 
					    int         State;          /* Etat d'un heap (valide, non validé ou corrompu) */
 | 
				
			||||||
 | 
					    size_t      Segment_Size;   /* Taille des segments de mémoire composant le heap */
 | 
				
			||||||
 | 
					    size_t      Limit_Size;     /* Taille limite du heap (par défaut : pas de limite) */
 | 
				
			||||||
 | 
					    int         Auto_Compress;  /* Nombre de chunks libres à partir duquel le heap est automatiquement compressé */
 | 
				
			||||||
 | 
					} SMT_MHH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Heap ouvert */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    char    *   Name;
 | 
				
			||||||
 | 
					    SMT_MHH *   MHH;
 | 
				
			||||||
 | 
					    SMT_Flags   Lock_Mode;  /* Mode dans lequel le heap est verrouillé */
 | 
				
			||||||
 | 
					    int         Nb_Seg;     /* Nombre de segments du heap lors de son ouverture */
 | 
				
			||||||
 | 
					} SMT_Heap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Structure d'un DSH (Data Segment Header)                                     */
 | 
				
			||||||
 | 
					/* Rappel : un DSH est une valeur attachée à un DSN (noeud de DSR)              */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    int         MemID;      /* ID de la zone de mémoire partagée */
 | 
				
			||||||
 | 
					    size_t      Size;       /* Taille de la zone de mémoire partagée */
 | 
				
			||||||
 | 
					    void *      Start;      /* Adresse de début de la zone de mémoire partagée */
 | 
				
			||||||
 | 
					} SMT_DSH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Structure d'un chunk                                                         */
 | 
				
			||||||
 | 
					/* Rappel : un chunk est la valeur attachée à un noeud de ACR ou FCR            */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    size_t      Size;       /* Taille allouée au chunk */
 | 
				
			||||||
 | 
					    void *      Data;       /* Adresse de la zone de données du chunk */
 | 
				
			||||||
 | 
					} SMT_Chunk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Ouverture d'une instance de la librairie                                     */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Instance : numéro d'instance de la librairie                             */
 | 
				
			||||||
 | 
					/* (I) Context  : nom du nouveau contexte                                       */
 | 
				
			||||||
 | 
					/* (I) Flags    : indicateur création/ouverture + mode d'affichage des erreurs  */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Open_I ( int Instance, const char * Context, SMT_Flags Flags );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Open_C ( int Instance, const char * Context, SMT_Flags Flags );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Récupération du numéro de l'instance utilisée                                */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (O) Instance : adresse du numéro de l'instance utilisée                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Instance_Get_I ( int * Instance);
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Instance_Get_C ( int * Instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Changement de contexte d'utilisation de la librairie                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Context : nom du nouveau contexte                                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Context_Set_I ( const char * Context );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Context_Set_C ( const char * Context );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Récupération du nom du contexte utilisé                                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (O) Context : adresse du nom du contexte utilisé                             */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Context_Get_I ( char ** Context );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Context_Get_C ( char ** Context );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fermeture de l'instance de la librairie                                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Flags : mode de fermeture (destruction ou fermeture simple)              */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Close_I ( SMT_Flags Flags );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Close_C ( SMT_Flags Flags );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Affichage des informations de la base de mémoires partagées                 */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Out : pointeur sur le flux de sortie                                     */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Dump_I ( FILE * Out );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Dump_C ( FILE * Out );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Libération de tous les verrous (base, heap)                                 */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Unlock_I ( void );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Unlock_C ( void );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Définition de la sortie standard des messages d'erreur de la librairie       */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Stderr_Set_I ( FILE * Out );
 | 
				
			||||||
 | 
					SMT_Status SM_Library_Stderr_Set_C ( FILE * Out );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Test d'existence d'un heap                                                   */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap_Name    : nom du heap                                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Exist_I ( const char * Heap_Name );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Exist_C ( const char * Heap_Name );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Ouverture/création d'un heap                                                 */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap_Name : nom du heap                                                  */
 | 
				
			||||||
 | 
					/* (O) Heap      : pointeur sur le heap ouvert / créé                           */
 | 
				
			||||||
 | 
					/* (I) Seg_Size  : taille des segments du heap                                  */
 | 
				
			||||||
 | 
					/* (I) Flags     : mode d'ouverture du heap                                     */
 | 
				
			||||||
 | 
					/* (O) Locked    : verrou effectif (TRUE ou FALSE)                              */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Open_I ( const char * Heap_Name, SMT_Heap ** Heap, size_t Seg_Size, SMT_Flags Flags, int * Locked );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Open_C ( const char * Heap_Name, SMT_Heap ** Heap, size_t Seg_Size, SMT_Flags Flags, int * Locked );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Teste si un heap a déjà été ouvert par le processus courant                  */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap_Name : nom du heap                                                  */
 | 
				
			||||||
 | 
					/* (O) Heap      : adresse du pointeur sur le heap ouvert                       */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_IsOpen_I ( const char * Heap_Name, SMT_Heap ** Heap );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_IsOpen_C ( const char * Heap_Name, SMT_Heap ** Heap );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fermeture d'un heap                                                          */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap   : pointeur sur un heap ouvert                                     */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Close_I ( SMT_Heap * Heap );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Close_C ( SMT_Heap * Heap );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Destruction d'un heap                                                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap_Name    : nom du heap                                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_End_I ( const char * Heap_Name );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_End_C ( const char * Heap_Name );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Compression d'un heap                                                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap     : pointeur sur un heap ouvert                                   */
 | 
				
			||||||
 | 
					/* (O) Compress : pointeur sur la taille mémoire gagnée                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Compress_I ( SMT_Heap * Heap, size_t * Compress );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Compress_C ( SMT_Heap * Heap, size_t * Compress );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Configuration d'un heap                                                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap  : pointeur sur un heap ouvert                                      */
 | 
				
			||||||
 | 
					/* (I) Tag   : type de configuration                                            */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Config_I ( SMT_Heap * Heap, SMT_Config Tag, ... );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Config_C ( SMT_Heap * Heap, SMT_Config Tag, ... );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Vérification/correction des structures d'un heap :                           */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap         : pointeur sur un heap ouvert                               */
 | 
				
			||||||
 | 
					/* (O) Nb_Detected  : pointeur sur le nombre d'erreurs détectées                */
 | 
				
			||||||
 | 
					/* (O) Nb_Corrected : pointeur sur le nombre d'erreurs corrigées                */
 | 
				
			||||||
 | 
					/* (I) Out          : pointeur sur le flux de sortie du rapport                 */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Check_I ( SMT_Heap * Heap, int * Nb_Detected, int * Nb_Corrected, FILE * Out);
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Check_C ( SMT_Heap * Heap, int * Nb_Detected, int * Nb_Corrected, FILE * Out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Pose d'un verrou sur un heap                                                 */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap      : pointeur sur un heap ouvert                                  */
 | 
				
			||||||
 | 
					/* (I) Flags     : mode de verrouillage (SMD_READ ou SMD_WRITE)                 */
 | 
				
			||||||
 | 
					/* (O) Locked    : verrouillage effectué (TRUE ou FALSE)                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Lock_I ( SMT_Heap * Heap, SMT_Flags Flags, int * Locked );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Lock_C ( SMT_Heap * Heap, SMT_Flags Flags, int * Locked );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Libération d'un verrou sur un heap                                           */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap   : pointeur sur un heap ouvert                                     */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Unlock_I ( SMT_Heap * Heap );
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Unlock_C ( SMT_Heap * Heap );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Allocation d'un chunk dans un heap                                           */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap      : pointeur sur un heap ouvert                                  */
 | 
				
			||||||
 | 
					/* (I) Size      : taille du chunk                                              */
 | 
				
			||||||
 | 
					/* (O) Ptr       : pointeur sur la zone de données allouée                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr );
 | 
				
			||||||
 | 
					SMT_Status SM_Chunk_Alloc_C ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Désallocation d'un chunk                                                     */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* (I) Heap   : pointeur sur un heap ouvert                                     */
 | 
				
			||||||
 | 
					/* (I) Ptr    : adresse de la zone de données du chunk à désallouer             */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Chunk_Free_I ( SMT_Heap * Heap, void * Ptr );
 | 
				
			||||||
 | 
					SMT_Status SM_Chunk_Free_C ( SMT_Heap * Heap, void * Ptr );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										3847
									
								
								lib/libshmem.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3847
									
								
								lib/libshmem.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										263
									
								
								lib/libshmem.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								lib/libshmem.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,263 @@
 | 
				
			|||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					#include <sys/sem.h>
 | 
				
			||||||
 | 
					#include <sys/shm.h>
 | 
				
			||||||
 | 
					#include <sys/ipc.h>
 | 
				
			||||||
 | 
					#include <ver.h>
 | 
				
			||||||
 | 
					#include <shmem.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Compteur d'ouverture de la librairie */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int SM_Open_Counter = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Flux de sortie des messages d'erreur générés par la librairie */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FILE * SM_stderr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern char * strdup (const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define max(A,B)  ((A < B) ? B : A)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Limite supérieure d'adressage */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MEM_LIMIT 1000000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Taille d'un segment = 100 Ko par défaut */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define K 1024
 | 
				
			||||||
 | 
					#define NB_BLOCS 100
 | 
				
			||||||
 | 
					#define SEGMENT_DEFAULT_SIZE NB_BLOCS * K
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char Info_Msg [256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Etats possibles pour un heap */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMD_STATE_VALID         0
 | 
				
			||||||
 | 
					#define SMD_STATE_UNVALIDATED     1
 | 
				
			||||||
 | 
					#define SMD_STATE_CORRUPTED     2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Référence sur le heap système */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SMT_Heap * System_Heap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Liste des heaps ouverts par le processus courant */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NDT_Root * Opened_Heap_List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    Taille par défaut des chunks alloués dans le heap système :
 | 
				
			||||||
 | 
					    Cette taille est fixée à la taille maximale des chunks pouvant
 | 
				
			||||||
 | 
					    y être alloué (de type NDT_Node, NDT_Root, SMT_MHH ou SMT_DSH)
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEFAULT_CHUNK_SIZE max(max(sizeof(NDT_Root), sizeof(NDT_Node)), max(sizeof(SMT_MHH), sizeof(SMT_DSH)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    Nombre de chunk libre minimum avant extension du heap système par un
 | 
				
			||||||
 | 
					    nouveau segment de données (fixé à 3 car l'ajout d'un nouveau segment
 | 
				
			||||||
 | 
					    nécessite l'allocation de 2 chunks (un noeud et une entête de segment).
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FREE_CHUNK_LIMIT  3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SM_Instance;
 | 
				
			||||||
 | 
					char * SM_Context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Contexte et instance d'utilisation de la librairie */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEFAULT_INSTANCE        1000
 | 
				
			||||||
 | 
					#define INSTANCE_ENV_VAR        "INSTANCE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEFAULT_CONTEXT         "CTX"
 | 
				
			||||||
 | 
					#define CONTEXT_ENV_VAR         "CONTEXT"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    Variable globale permettant d'indiquer que l'on est en train
 | 
				
			||||||
 | 
					    d'étendre le heap système par ajout d'un nouveau segment.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int Adding_Segment = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SMT_Chunk * Tmp_Chunk;
 | 
				
			||||||
 | 
					SMT_MHH   * Tmp_MHH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    Définition des opérations de verouillage et de déverrouillage
 | 
				
			||||||
 | 
					    NB : la valeur 1 d'un sémaphore correspond à l'état non verrouillé
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Pose d'un verrou en lecture : 2 opérations : ( -1 puis +2 ) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sembuf SM_SemOp_SSL [2] = { {0, -1, SEM_UNDO}, {0, 2, SEM_UNDO} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Libération d'un verrou en lecture : 2 opérations ( -2 puis +1 ) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sembuf SM_SemOp_RSL [2] = { {0, -2, SEM_UNDO|IPC_NOWAIT}, {0, 1, SEM_UNDO|IPC_NOWAIT} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Pose d'un verrou en écriture : 2 opérations ( -1 puis 0 ) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sembuf SM_SemOp_SEL [2] = { {0, -1, SEM_UNDO}, {0, 0, SEM_UNDO} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Libération d'un verrou en écriture : 2 opérations ( 0 puis +1 ) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sembuf  SM_SemOp_REL [2] = { {0, 0, SEM_UNDO|IPC_NOWAIT}, {0, 1, SEM_UNDO|IPC_NOWAIT} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transformation d'un verrou en écriture en un verrou en lecture : 2 opérations ( 0 puis +2 ) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sembuf  SM_SemOp_TSL [2] = { {0, 0, SEM_UNDO|IPC_NOWAIT}, {0, 2, SEM_UNDO|IPC_NOWAIT} };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef union semun
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int                     val;
 | 
				
			||||||
 | 
					    struct semid_ds *       buf;
 | 
				
			||||||
 | 
					    unsigned short int *    array;
 | 
				
			||||||
 | 
					} semun;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Allocation de mémoire dans la base                                          */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Alloc (size_t, void **, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Désallocation de mémoire dans la base                                       */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Free (void *, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Allocation de mémoire dans le heap système                                  */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_System_Alloc (size_t, void **, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Désallocation de mémoire dans le heap système                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_System_Free (void *, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Initialisation de la base                                                   */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Init (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Terminaison de la base                                                      */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_End (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Ouverture de la base                                                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Open (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Fermeture de la base                                                        */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Close (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Pose d'un verrou sur la base :                                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Lock (SMT_Flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Libération d'un verrou sur la base :                                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Base_Unlock (SMT_Flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fonction manager de la liste des heaps ouverts                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					NDT_Status SM_Opened_Heap_List_Manager (va_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fonction manager du MHR (Memory Heap Root)                                   */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					NDT_Status MHR_Manager (va_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Destruction d'un MHH (Memory Heap Header)                                    */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_MHH_End (SMT_MHH *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fonction manager pour un DSR (Data Segment Root)                             */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					NDT_Status SM_DSR_Manager (va_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Initialisation d'un nouveau segment de données (noeud du DSR)               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_DSH *SM_DataSegment_Init (SMT_MHH *, size_t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Terminaison d'un segment de données                                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_DataSegment_End (NDT_Root *, SMT_DSH *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Ouverture d'un segment de données                                           */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_DataSegment_Open (SMT_DSH *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/*  Fermeture d'un segment de données                                           */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_DataSegment_Close (SMT_DSH *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Compression d'un segment de données                                          */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					size_t SM_DataSegment_Compress (SMT_DSH *, NDT_Root *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fonction manager pour un ACR (Allocated Chunk Root)                          */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					NDT_Status SM_ACR_Manager (va_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Fonction manager pour un FCR (Free Chunk Root)                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					NDT_Status SM_FCR_Manager(va_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Pose d'un verrou sur un heap :                                               */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Lock_Set (SMT_MHH *, SMT_Flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Changement d'un verrou sur un heap :                                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Lock_Change (SMT_MHH *, SMT_Flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Libération d'un verrou sur un heap :                                         */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Heap_Lock_Release (SMT_MHH *, SMT_Flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Opération sur un sémaphore                                                   */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					SMT_Status SM_Semaphore_Operate (int, struct sembuf *, unsigned int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Récupère sous forme explicite l'état d'un verrou                             */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					char * SM_Lock_Status_Get (const char *, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Récupère sous forme explicite la description d'une racine de structure       */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					char * SM_Root_Description_Get (const char *, NDT_Root *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Routine d'affichage d'un message d'erreur                                    */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					void SM_Error_Print (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					/* Pour préfixer un nom de heap avec le nom de l'instance utilisée              */
 | 
				
			||||||
 | 
					/*------------------------------------------------------------------------------*/
 | 
				
			||||||
 | 
					static char * SM_Name_Prefix (const char *);
 | 
				
			||||||
							
								
								
									
										341
									
								
								util/smadmin.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								util/smadmin.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,341 @@
 | 
				
			|||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					#include <node.h>
 | 
				
			||||||
 | 
					#define SM_MODE 0 /* Utilisation des API sécurisés */
 | 
				
			||||||
 | 
					#include <shmem.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VER_INFO_EXPORT (smadmin, "$Revision: 1.1 $", "$Name:  $", __FILE__, "$Author: smas $")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define USAGE "Usage : %s [ --help | --version [-v] | --create | --destroy ]\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define QUIT           0
 | 
				
			||||||
 | 
					#define BASE_INIT      1
 | 
				
			||||||
 | 
					#define BASE_OPEN      2
 | 
				
			||||||
 | 
					#define BASE_INFO      3
 | 
				
			||||||
 | 
					#define BASE_CLOSE     4
 | 
				
			||||||
 | 
					#define BASE_END       5
 | 
				
			||||||
 | 
					#define MHH_INIT       6
 | 
				
			||||||
 | 
					#define MHH_OPEN       7
 | 
				
			||||||
 | 
					#define MHH_CHECK      8 
 | 
				
			||||||
 | 
					#define MHH_COMPRESS   9
 | 
				
			||||||
 | 
					#define MHH_CLOSE      10 
 | 
				
			||||||
 | 
					#define MHH_END        11
 | 
				
			||||||
 | 
					#define ALLOC_CHUNK    12
 | 
				
			||||||
 | 
					#define WRITE_CHUNK    13
 | 
				
			||||||
 | 
					#define READ_CHUNK     14
 | 
				
			||||||
 | 
					#define FREE_CHUNK     15
 | 
				
			||||||
 | 
					#define DSR_DUMP       16
 | 
				
			||||||
 | 
					#define ACR_DUMP       17
 | 
				
			||||||
 | 
					#define FCR_DUMP       18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char menu [1000];
 | 
				
			||||||
 | 
					char tmp [100];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void init_menu (void);
 | 
				
			||||||
 | 
					int print_menu (void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main (int argc, char ** argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int choice;
 | 
				
			||||||
 | 
					  char name [100];
 | 
				
			||||||
 | 
					  int Mode, Locked;
 | 
				
			||||||
 | 
					  void * ptr;
 | 
				
			||||||
 | 
					  char answer [10];
 | 
				
			||||||
 | 
					  SMT_Heap * Heap;
 | 
				
			||||||
 | 
					  int Nb_Detected, Nb_Corrected;
 | 
				
			||||||
 | 
					  size_t size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Lancement de commande d'administration */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (argc >= 2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (!strcmp (argv[1], "--help"))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      fprintf (stderr, USAGE, argv[0]);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (!strcmp (argv[1], "--version"))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (argc >= 3 && !strcmp (argv[2], "-v"))
 | 
				
			||||||
 | 
					        return VER_Object_Print (stdout, VERD_VERBOSE);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        return VER_Object_Print (stdout, VERD_MINIMAL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (!strcmp (argv[1], "--create"))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (SM_Library_Open (0, NULL, SMD_CREATE | SMD_DEBUG_ALL) != SMS_OK)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        fprintf (stderr, "=> Impossible de créer l'instance de la librairie LIBSHMEM\n");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (!strcmp (argv[1], "--destroy"))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (SM_Library_Open (0, NULL, SMD_OPEN | SMD_DEBUG_ALL) != SMS_OK || SM_Library_Close (SMD_DESTROY) != SMS_OK)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        fprintf (stderr, "=> Impossible de détruire l'instance de la librairie LIBSHMEM\n");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      fprintf (stderr, USAGE, argv[0]);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Lancement du menu intercatif */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  init_menu ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  choice = print_menu ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (choice != QUIT)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    strcpy (answer, "yes");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (choice)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case BASE_INIT:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                 SM_Library_Open (0, NULL, SMD_CREATE | SMD_DEBUG_ALL) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case BASE_OPEN:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                SM_Library_Open (0, NULL, SMD_OPEN | SMD_DEBUG_ALL) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case BASE_END:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                SM_Library_Close (SMD_DESTROY) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case BASE_CLOSE:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                SM_Library_Close (SMD_CLOSE) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case BASE_INFO:
 | 
				
			||||||
 | 
					        SM_Library_Dump (stderr);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_INIT:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nNew heap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap segment size ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        size = atoi (tmp);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                SM_Heap_Open (name, &Heap, size, \
 | 
				
			||||||
 | 
					                SMD_CREATE, &Locked) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_OPEN:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name to open ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nOpening mode (read=1  write=2) ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        if (tmp[0] == '1') Mode = SMD_READ;
 | 
				
			||||||
 | 
					        else Mode = SMD_WRITE;
 | 
				
			||||||
 | 
					        if (!strcmp (name, HEAP_SYSTEM))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fprintf (stdout, \
 | 
				
			||||||
 | 
					            "\n*** Warning : you can not make this operation on the system heap ***\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", SM_Heap_Open (name, \
 | 
				
			||||||
 | 
					                &Heap, 0, SMD_OPEN | Mode, &Locked) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_COMPRESS:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name à compresser ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_WRITE, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          size_t Compress;
 | 
				
			||||||
 | 
					          SM_Heap_Compress (Heap, &Compress);
 | 
				
			||||||
 | 
					          fprintf (stdout, "\nCompression size = %d byte(s)\n", (int)Compress);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_END:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name to remove ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (!strcmp (name, HEAP_SYSTEM))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fprintf (stdout, \
 | 
				
			||||||
 | 
					           "\n*** Warning : you can not make this operation on the system heap ***\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                SM_Heap_End (name) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_CLOSE:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name to close ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (!strcmp (name, HEAP_SYSTEM))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fprintf (stdout, \
 | 
				
			||||||
 | 
					            "\n*** Warning : you can not make this operation on the system heap ***\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (SM_Heap_IsOpen (name, &Heap) == SMS_OK)
 | 
				
			||||||
 | 
					          fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                  SM_Heap_Close (Heap) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          fprintf (stdout, "\nHeap %s is not opened\n", name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case MHH_CHECK:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name to check/recover ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_WRITE, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Nb_Detected = Nb_Corrected = 0;
 | 
				
			||||||
 | 
					          SM_Heap_Check (Heap, &Nb_Detected, &Nb_Corrected, stderr);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case ALLOC_CHUNK:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nAllocation size ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        size = atoi (tmp);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_WRITE, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          SM_Chunk_Alloc (Heap, size, &ptr);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nAddress = 0x%p (%d)\n", ptr, (unsigned int)ptr);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case WRITE_CHUNK:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nAddress ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        ptr = (void *)atoi (tmp);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nString to put in ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        strcpy ( (char *)ptr, tmp);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nOK\n");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case READ_CHUNK:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nAddress ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        ptr = (void *)atoi (tmp);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nValeur du pointeur = %s\n", (char *)ptr);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case FREE_CHUNK:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nAddress ? ");
 | 
				
			||||||
 | 
					        gets (tmp);
 | 
				
			||||||
 | 
					        ptr = (void *)atoi (tmp);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_WRITE, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          fprintf (stdout, "\nReturn code = %s\n", \
 | 
				
			||||||
 | 
					                  SM_Chunk_Free (Heap, ptr) == SMS_OK ? "OK" : "NOK" );
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case DSR_DUMP:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          ND_DataStruct_Info_Print (Heap->MHH->DSR, stdout);
 | 
				
			||||||
 | 
					          ND_DataStruct_Print (Heap->MHH->DSR, stdout);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case ACR_DUMP:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          ND_DataStruct_Info_Print (Heap->MHH->ACR, stdout);
 | 
				
			||||||
 | 
					          ND_DataStruct_Print (Heap->MHH->ACR, stdout);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case FCR_DUMP:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nHeap name ? ");
 | 
				
			||||||
 | 
					        gets (name);
 | 
				
			||||||
 | 
					        if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          ND_DataStruct_Info_Print (Heap->MHH->FCR, stdout);
 | 
				
			||||||
 | 
					          ND_DataStruct_Print (Heap->MHH->FCR, stdout);
 | 
				
			||||||
 | 
					          if (Locked == TRUE) SM_Heap_Unlock (Heap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case QUIT:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nExiting program ...\n");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        fprintf (stdout, "\nUndefined choice %d\n", choice);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    choice = print_menu ();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void init_menu (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  sprintf (menu, "Menu :\n");
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", QUIT, "Quit"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", BASE_INIT, "Init library"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", BASE_OPEN, "Open library"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", BASE_INFO, "Info library"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", BASE_CLOSE, "Close library"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", BASE_END, "End library"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", MHH_INIT, "Init heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", MHH_OPEN, "Open heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", MHH_CHECK, "Check/recover heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", MHH_COMPRESS, "Compress heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", MHH_CLOSE, "Close heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", MHH_END, "End heap"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", ALLOC_CHUNK, "Allocate chunk"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", WRITE_CHUNK, "Write chunk"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", READ_CHUNK, "Read chunk"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", FREE_CHUNK, "Free chunk"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", DSR_DUMP, "Dump DSR"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s", ACR_DUMP, "Dump ACR"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					  sprintf (tmp, "  - %2d) %-18s\n", FCR_DUMP, "Dump FCR"); strcat (menu, tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int print_menu (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  fprintf (stdout, "------------------------------------------------------\n%s", menu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tmp[0] = '\0';
 | 
				
			||||||
 | 
					  while (tmp[0] == '\0')
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    printf ("\nChoice ? ");
 | 
				
			||||||
 | 
					    gets (tmp);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return atoi (tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user