diff --git a/doc/rapport/arbo.tex b/doc/rapport/arbo.tex index 9af022c..6b0c8ff 100644 --- a/doc/rapport/arbo.tex +++ b/doc/rapport/arbo.tex @@ -8,19 +8,18 @@ Libnazgul/ |-- Makefile // Règles de compilation |-- doc/ | |-- ennonce // Enoncé du projet en format postscript -| |-- rapport/ // Rapport Latex +| `-- rapport/ // Rapport Latex | |-- Makefile // Règles de compilation -| |-- ... +| `-- ... | |--test | |-- Makefile // Règles de compilation -| |-- create_delete // Le main de la fonction -| |-- put_get_mono // Test avec un seul processus -| |-- put_get_multi // Test avec plusieurs processus +| |-- create_delete // Le main de la fonction +| `-- *.c // Programmes de test | -| -|-- src/ // Sources de la bibliothèque +`-- src/ // Sources de la bibliothèque |-- Makefile // Règles de compilation - |-- ... + |-- *.h // En-têtes pour l'utilisation de Libnazgul + `-- *.c // Sources de Libnazgul \end{verbatim} diff --git a/doc/rapport/avenir.tex b/doc/rapport/avenir.tex index 1c3095c..8be2ca9 100644 --- a/doc/rapport/avenir.tex +++ b/doc/rapport/avenir.tex @@ -1,12 +1,16 @@ -\chapter{A venir} +\chapter{Conclusion} -\par Bien que nous ayons fini le projet, il se peut qu'il ne soit pas -sans défauts. C'est pourquoi dans l'avenir, il faudrai corriger les -bogues éventuels que tous nos tests n'auraient pas fait appara{\^i}tre. -Mais il n'y a pas que cela; le ``code'' pourrai {\^e}tre amélioré et -allégé. Nous pourrions également faire plus ``subtil'' par endroits. -Nous devrions aussi vérifier tous les codes d'erreurs renvoyés par les -fonctions après leur appel. Il serai également possible de faire en sorte -d'utiliser moins de mémoire en réduisant le nombre de {\em shm}; pour -cela il faudrai changer de structure de donnée. Nous aimerions également -finir l'outil d'analyse {\em msgSpaceState} des {\em msgSpace}. +\par Nous avons fini le projet, mais il n'est certainement pas exempt +de bugs et d'autres défauts. +C'est pourquoi dans l'avenir, il faudrai corriger les bogues éventuels que +tous nos tests n'auraient pas fait appara{\^i}tre. Le ``code'' lui-même pourrait {\^e}tre grandement amélioré et allégé car des choses plus ``subtiles'' auraient pu être écrite à certains endroits (nécessitant malheureusement un peu plus de temps). + +\par De même la gestion des codes d'erreurs renvoyés par les fonctions pourrait être améliorée et la facilité de débuggage augmentée. + +\par Il serait également possible de faire en sorte d'utiliser moins de +mémoire en réduisant le nombre de segment de mémoire partagée, mais pour +cela il faudrai changer de structures de données. + +\par De plus nous aimerions (d'ici la soutenance) rendre les outils de test et d'analyse des espaces de messages plus complet. + +\par Enfin nous tenons à remercier M. Rifflet pour le cours (et son livre) ainsi que M. Bertier pour leurs nombreuses explications (si précieuses) qu'ils nous tout deux apportés. diff --git a/doc/rapport/devel.tex b/doc/rapport/devel.tex index 3dff4d9..b2743a2 100644 --- a/doc/rapport/devel.tex +++ b/doc/rapport/devel.tex @@ -5,7 +5,9 @@ \subsection{Travail collaboratif} \par Nous avons travaillé ensemble gr{\^a}ce à CVS (Concurrent Versions System). Notre projet est hébergé chez Sourceforge\footnote{\url{http://www.sourceforge.net}}. -Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs personnes. Les modifications et les mises à jour de chacun des membres du projet sont diffusées instantanément, avec un risque minimisé de conflits lors des modifications du m{\^e}me code. +Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs +personnes. Les modifications et les mises à jour de chacun des membres du projet peuvent +ainsi être diffusées instantanément, avec un risque minimisé de conflits lors des modifications du m{\^e}me code. \subsection{Moyens techniques} @@ -13,10 +15,8 @@ Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs \par Chacun selon nos préférences, nous avons utilisés des machines sous GNU/Linux ou Microsoft Windows et codé avec Vim. La personne sous Microsoft Windows avait une session graphique sur un serveur GNU/Linux, appartenant a un autre membre du projet, gr{\^a}ce à l'utilisation de VNC\footnote{\url{http://www.realvnc.com}} (Virtual Network Computing). -Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir -tester la bibliothèque dans les meilleures conditions, car sous -Microsoft Windows l'utilisateur n'est pas prévenu des -{\em segmentation fault} et autres erreurs système. +Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir compiler et tester +la bibliothèque dans de meilleurs conditions que sous son système initial\ldots \section{Programmation} @@ -28,48 +28,63 @@ utilis des fonctions dans le fichier \\``\verb+/src/proto.h+'', avec en commentaire le fichier d'où il est issu. Par contre pour les fonctions qui génèrent les {\em ids}, leur prototype est dans le fichier ``\verb+/src/ids.h+'', généré par ``\verb+/src/ids.c+''. -Le fichier ``\verb+/src/proto.h+'' est connu des logiciels qui utilisent + +\par Le fichier ``\verb+/src/proto.h+'' est connu des logiciels qui utilisent notre bibliothèque, tandis que ``\verb+/src/ids.h+'' non. Nous allons donc vous décrire nos différentes fonctions en les classant par famille. \newline + \par Nous avons quatre grandes {\em familles} de fonctions. \begin{description} -\item{\sc msgBuffer*} Ce sont toutes les fonctions qui concernent les -buffers : comment on les créés, les ``attachent'' aux processus. -\item{\sc msgPool*} Ce sont les fonctions qui permettent de créer ou de +\item[msgBuffer*]{Ce sont toutes les fonctions qui concernent les +buffers : création, attachement aux processus\ldots} + +\item[msgPool*]{Ce sont les fonctions qui permettent de créer ou de détruire une {\em pool}, de l'ouvrir ou encore de poser un ``verrou''. \begin{description} -\item{\sc msgPool*} Fonctions servant à gérer une {\em pool}, qui -correspond à un ensemble de {\em buffers}. -\item{\sc msgPoolDataTab*} Fonctions utiles pour la gestion des + +\item[msgPool*]{Fonctions servant à gérer une {\em pool}, qui +correspond à un ensemble de {\em buffers}.} + +\item[msgPoolDataTab*]{Fonctions utiles pour la gestion des informations d'une {\em pool} telles que la taille des {\em buffers}, -leur nombre\dots +leur nombre\dots} \end{description} -\item{\sc msgQueue*} Toutes les fonctions gérant les ``queues'', {\em - files de maessages}. On y -trouve celle qui en créé une, celles qui vérifient si elle est -disponible ou pas, celles qui ajoutent un élément ou au contraire en -enlève un. +} + +\item[msgQueue*]{Toutes les fonctions gérant les ``queues'', {\em + files de messages}. On y trouve celle qui en créé une, celles i + qui vérifient si elle est disponible ou pas, celles qui ajoutent + un élément ou au contraire en enlève un. \begin{description} -\item{\sc msgQueue*} Rassemble toutes les fonctions servant à la gestion -des files de messages. -\item{\sc msgQueueElem*} Les fonctions utiles pour gérer un élément -d'une file de messages. -\item{\sc msgQueue(Prot/Read)*} Fonctions servant à protéger une file. +\item[msgQueue*]{ Rassemble toutes les fonctions servant à la gestion +des files de messages.} + +\item[msgQueueElem*]{ Les fonctions utiles pour gérer un élément +d'une file de messages.} + +\item[msgQueue(Prot|Read)*]{Fonctions servant à protéger une file +({\em read} indique la disponibilité d'une ressource en lecture, +{\em Prot} la protection contre les modification).} \end{description} -\item{\sc msgSpace*} Ensemble de fonctions qui gèrent les espaces de +} +\item[msgSpace*]{Ensemble de fonctions qui gèrent les espaces de messages : création, ouverture, listes\ldots \begin{description} -\item{\sc msgSpace*} Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages. -\item{\sc msgSpaceList*} Ce sont toutes les fonctions utiles pour la -gestion de la liste cha{\^i}née des {\em msgSpace} existants. -\item{\sc msgSpaceListElem*} Fonctions correspondant à la gestion d'un -élément de la {\em msgSpaceList}. +\item[msgSpace*]{Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages.} + +\item[msgSpaceList*]{Ce sont toutes les fonctions utiles pour la +gestion de la liste cha{\^i}née des {\em msgSpace} existants.} + +\item[msgSpaceListElem*]{ Fonctions correspondant à la gestion d'un +élément de la {\em msgSpaceList}.} \end{description} +} \end{description} + \subsection{Détails sur certaines fonctions} \par Nous détaillerons ici quelques fonctions qui peuvent ne pas @@ -110,43 +125,45 @@ espace de messages {\em msgSpace *}, un num l'adresse d'un buffer {\em void *}. Elle insère le buffer dans le numéro de file de messages de l'espace de messages. Lorsque l'on appelle cette fonction, à la fin, on ``délocke'' le sémaphore sur la {\em queue}. -\item{\sc msgSpaceState(\dots)} Cette fonction prend en argument, un -``id'' d'espace de message, {\em msgSpaceId}, et permet de conna{\^i}tre -l'état de l'espace de message dont l'``id'' est donnée en argument. \end{itemize} \newpage \section{Difficultés rencontrées} -\par Nous n'avons pas eu de grosses difficultés à proprement parlé. +\subsection{Restrictions} +\par Nous n'avons pas eu de grosses difficultés à proprement parler. Nous avions juste quelques restrictions, comme le fait de ne pas pouvoir utiliser de pointeurs absolus, car l'espace d'adressage entre les différents processus n'est pas forcément le m{\^e}me. Ils ont -seulement un segment de mémoire partagée en commun. Il a donc -fallu utiliser les différentes {\em id} des espaces de messages {\em msgSpace}, ou -encore des {\em pools} pour pouvoir faire en sorte que les processus peuvent -bien accéder aux {\em buffers} situés dans la mémoire partagée. +seulement un segment de mémoire partagée en commun. +\par Il a donc fallu utiliser les différentes {\em id} (c'est à dire les identifiants POSIX) des espaces de messages {\em msgSpace}, des {\em pools} +et autres types de données stockées en mémoire partagée pour pouvoir permettre a tous les processus d'accéder correctement aux données. + +\subsection{Libertés d'implémentations de POSIX\ldots} \par Le choix des identifiants ne fut pas simple non plus, car il -fallait en changer en fonction des différentes implémentations. Par -exemple nous pouvions avoir des identifiants du type ``\verb+/tmp/identifiant+'', -qui ne marchaient que sur un type de machines. Sur les autres il -fallait en avoir un du type ``\verb+/identifiant+''. Cela nous a amener -à faire une distinction de cas et générer un identifiant différent -selon que l'on soit sur une machine de type {\em HP-UX}, {\em SunOS} -ou {\em Linux}. +fallait en changer en fonction des différentes implémentations de POSIX. +En effet la norme POSIX précise que l'identifiant doit commencer par un ``\verb+/+'' et si possible ne pas en comporter d'autres. +\par Si cela est vrai sur certains systèmes (comme GNU/Linux) d'autres +systemes (HP-UX, SunOS) requièrent que cet identifiant corresponde +au chemin absolu (dans l'arborescence UNIX) d'un fichier sur lequel +on possède des droits\ldots + +\par Nous avons donc choisi les identifiants du type +``\verb+/tmp/identifiant+'', qui pour les systèmes avec la restrictions précédente et ``\verb+/identifiant+'' sur les autres. i +Cela nous a également conduit à faire une distinction dans le \verb+Makefile+ +entre les options de compilation pour {\em HP-UX}, {\em SunOS} ou {\em Linux}. \par Malheureusement le fait de travailler sur plusieurs types de machines n'était pas seulement g{\^e}nant pour les identifiants, mais également pour créer la bibliothèque. En effet, il faut ajouter plus ou moins d'options à la compilation: soit il faut ajouter \verb+-lrt+, dans un cas ou \verb+-lrt -lpthread+ dans l'autre. Ceci afin d'inclure les bonnes librairies pour que notre bibliothèque puisse -fonctionner convenablement. -\par Ces distinctions se font dans les {\em Makefile}, \verb+/src/Makefile+ et \verb+/test/Makefile+. -\par Encore une autre difficulté d{\^u}e à Posix, est la -projection de fichier ou {\em mapping} avec {\em mmap}. L'offset -peut {\^e}tre aligné sur les pages mémoires sur -certains systèmes. Or ceci est emb{\^e}tant lorsque l'on veut -accéder à un fichier qui commence n'importe où dans le bloc mémoire. -Pour remédier à cela, nous {\em mappons} jusqu'à ``juste derrière le -buffer''. Nous autorisons le buffer en lecture/écriture et nous déplaçons -l'adresse obtenue au début du buffer. +compiler et fonctionner convenablement. + +\par La seconde difficulté liée à POSIX, est la projection de fichier +ou {\em mapping} avec {\em mmap}. Selon l'implémentation, l'offset (décalage par rapport au début de l'addresse mémoire du fichier) peut éventuellement {\^e}tre aligné sur la taille des pages mémoires\ldots +\par Ceci est assez génant lorsque l'on veut accéder à bloc de donnée +qui peut commencer n'importe où dans la zone de mémoire partagée. +Pour remédier à cela, nous {\em mappons} du début de la zone mémoire partagée jusqu'à ``juste derrière'' le bloc de donnée qui nous intéresse. +\par Puis nous changeons les droits d'acces (\verb+mprotect+) pour nous autoriser la modifiction uniquement sur le bloc de données qui nous intéresse. +\par Enfin nous opérons le décalage d'addresse ``à la main'' et renvoyons l'addresse qui correspond au début du bloc de données demandé. diff --git a/doc/rapport/intro.tex b/doc/rapport/intro.tex index 5529cbd..4670192 100644 --- a/doc/rapport/intro.tex +++ b/doc/rapport/intro.tex @@ -1,6 +1,6 @@ \chapter{À propos du projet} -\section{Condition d'utilisiation} +\section{Conditions d'utilisation} \par Ce programme est un logiciel libre; vous pouvez le redistribuer et/ou le modifier conformément aux dispositions de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation; version 2 de la licence, ou encore toute version ultérieure. @@ -13,10 +13,11 @@ telle que publi \section{Les objectifs} \par L'objectif de ce projet est de réaliser une bibliothèque permettant -à plusieurs processus d'un m{\^e}me sytème de communiquer entre eux via des messages, sans -faire la recopie de ces messages dans l'espace d'adressage du noyau. +à plusieurs processus d'un m{\^e}me sytème de communiquer entre eux via des files de messages, sans faire la recopie de ces messages dans l'espace +d'adressage du noyau. \par Nous devions donc mettre en oeuvre les techniques de la programmation -système ainsi que la création d'une bibliothèque de fonctions. Nous avons utilisés les mécanismes de mémoire partagée et de synchronisation version Posix. +système ainsi que la création d'une bibliothèque de fonctions. +Pour ce faire, nous avons utilisés les mécanismes de mémoire partagée et de synchronisation à la norme POSIX. \section{Obtenir l'archive du projet} @@ -38,6 +39,6 @@ et son adresse est : \newline {\url{http://www.sourceforge.net/projects/libnazgul/}}. \par Ce site vous permettra de télécharger le projet, d'en avoir -une description et également d'y contribuer. +une description et éventuellement d'y contribuer. \newpage diff --git a/doc/rapport/manuel.tex b/doc/rapport/manuel.tex index 97c5d60..08c8905 100644 --- a/doc/rapport/manuel.tex +++ b/doc/rapport/manuel.tex @@ -1,17 +1,30 @@ \chapter{Manuel d'utilisation} -\section{Que faire de nos sources? \ldots les compiler} +\section{Que faire de nos sources?} %\subsection{Les compiler} \par Pour pouvoir utiliser notre bibliotèque, il faut commencer par la -créer. Pour cela placez-vous dans le répertoire de l'archive (noté ici - \verb+/+) ou dans le sous-répertoire \verb+src/+ et tapez ``\verb+make+''. +compiler. Pour cela placez-vous dans le répertoire racine de l'archive (noté ici + \verb+/+) ou dans son sous-répertoire \verb+src/+ + +et tapez ``\verb+make+''. Cela compilera la bibliothèque +(fichier \verb+libnazgul.a+) ainsi que les divers programmes de test dans +l'archive. -\section{Que faire ensuite? \ldots inclure notre bibliothèque} -%\subsection{Inclure notre bibliothèque dans un programme} +\section{Comment utiliser Libnazgul ?} -\par Dans votre programme, si vous voulez utiliser notre bibliothèque -il vous suffit de l'inclure. Au début de votre programme tapez ``\verb+#include ''libnazgul.h``+''. -\par Une fois notre bibliothèque incluse, vous pourrez sans problèmes -appeler les fonctions contenues à l'intérieur : {\it msgSpaceCreate(\ldots), msgPut(\ldots), msgFree(\ldots) etc\dots} +\par Une fois le projet compilé (voir ci-dessus), vous il vous est possible +d'utiliser {\sc Libnazgul}. +Il vous faudra pendant l'écriture de vos programmes C/C++, +mettre \verb+#include libnazgul.h+ au début des fichiers utilisant la bibliothèque. +\par De même il faudra prendre bien soin, à la compilation de vos programme de : +\begin{itemize} +\item{spécifier (option \verb+-I+) le répertoire où se trouvent les +en-têtes (fichiers *.h) de la bibliothèque {\sc Libnazgul},} +\item{indiquer (option \verb+-L+) le chemin vers le fichier \verb+libnazgul.a+,} +\item{renseigner le compilateur (option \verb+-l+) sur les bibliotheques nécessaires pour utiliser les fonctions de {\sc Libnazgul} : nazgul, rt, et pthreads.} +\end{itemize} +\par Vous pourrez ainsi sans problèmes appeler toutes les fonctions fournis +par {\sc Libnazgul} : {\it msgSpaceCreate(\ldots), msgPut(\ldots), msgFree(\ldots), +etc\dots} diff --git a/doc/rapport/rapport.tex b/doc/rapport/rapport.tex index 7403e16..318788f 100644 --- a/doc/rapport/rapport.tex +++ b/doc/rapport/rapport.tex @@ -17,7 +17,7 @@ %-------------------------------------------------------------- \pagestyle{fancy} -\rhead[\sc{LIBNAZGUL is Not Another Zero G User Library}]{\sc{LIBNAZGUL is Not Another Zero G User Library}} +\rhead[{\small\sc{LIBnazgul is Not Another Zero-share Great or Ultimate Library}}]{{\small \sc{LIBnazgul is Not Another Zero-share Great or Ultimate Library}}} \lhead[\it{}]{\it{}} %\rhead[\it{Projet de Système.}]{\it{Projet de Système.}} diff --git a/src/Makefile b/src/Makefile index c3410ed..864e4c5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -33,10 +33,11 @@ CFILES := $(shell ls *.c) OFILES := $(patsubst %.c,%.o,$(CFILES)) DESTFILE=libnazgul.a +INCLUDES=-I /usr/lib/ -I /usr/local/lib/ DEFINES:= ifeq "SunOS" "${OS}" -DEFINES:=-D_NZG_REALFILEID +DEFINES:=-D_NZG_REALFILEID -D_NZG_SUNOS endif ifeq "HP-UX" "${OS}" diff --git a/src/allocate.c b/src/allocate.c index 5fdb8b9..f74a8fb 100644 --- a/src/allocate.c +++ b/src/allocate.c @@ -15,6 +15,7 @@ void * msgAllocate(msgSpace *space, int option ){ void * resultAddr=NULL; + int bufferFreeSize; int i; msgPoolId resultPoolId; /* tableau des valeurs des semPoolCoef/pool pour identifier le pool @@ -183,7 +184,6 @@ if (mSPoolDataTabAddr==NULL){ /* mapper le buffer libre dans l'esp addr du proc */ strcpy(resultPoolId,mSPoolDataTabAddr[selectedPoolIndex].poolId); - int bufferFreeSize; bufferFreeSize=mSPoolDataTabAddr[selectedPoolIndex].bufferSize; printf("BufferSize : %d\n", bufferFreeSize); diff --git a/src/bufferGetProcAttach.c b/src/bufferGetProcAttach.c index a95de11..0919f1f 100644 --- a/src/bufferGetProcAttach.c +++ b/src/bufferGetProcAttach.c @@ -14,6 +14,7 @@ int msgBufferGetProcAttach( bool found=false; int pIdx=0; + int bIdx; while ((!found) && (pIdx < poolNb)){ /* Pour chaque pool */ //récuperer l'ID du BufferInfoTab; @@ -29,7 +30,7 @@ int msgBufferGetProcAttach( PROT_READ,MAP_SHARED,bufferInfoTabFd,(off_t)0); /* on cherche dans chacun des buffers */ - int bIdx=0; + bIdx=0; while((!found) && bIdxpoolDataTabSemId); @@ -20,7 +24,6 @@ int msgFree(msgSpace * space, void * addr){ poolDataTabAddr = msgPoolDataTabOpen(space); // TODO: verouiller semaphore DataInfo ?? - int err; poolIndex=-1; bufferIndex=-1; err=msgBufferGetProcAttach( @@ -36,17 +39,17 @@ int msgFree(msgSpace * space, void * addr){ msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr); /* unmapper le buffer */ - void * realAddr=addr; - int bufferSize=poolDataTabAddr[poolIndex].bufferSize; - int bufferNb=poolDataTabAddr[poolIndex].bufferNb; + realAddr=addr; + bufferSize=poolDataTabAddr[poolIndex].bufferSize; + bufferNb=poolDataTabAddr[poolIndex].bufferNb; realAddr=realAddr-poolIndex*bufferSize; munmap(realAddr,bufferSize*bufferNb); - + msgPoolDataTabClose(space,poolDataTabAddr); // deverouiller semaphore DataInfo -msgPoolDataTabUnlock(space); - + msgPoolDataTabUnlock(space); + // deverouiller semaphore ressource. msgPoolSemIdIntern(ressourceSemId,space->externId,poolIndex); ressourceSemFd = sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0); diff --git a/src/get.c b/src/get.c index 0ecdec7..0fd0306 100644 --- a/src/get.c +++ b/src/get.c @@ -8,6 +8,7 @@ void * msgGet(msgSpace * space,int queueIndex,int option){ msgQueue * queue; msgQueueElemId oldElemId; msgQueueElem * oldElem; + msgPoolData * poolDataTab; // on teste la possibilité de lecture sur la liste... if (option == NONBLOCK){ if (msgQueueReadTryLock(space->externId,queueIndex) <0){ @@ -39,7 +40,6 @@ void * msgGet(msgSpace * space,int queueIndex,int option){ goto ERROR; } /* on récupere la taille des buffer dans la pool du buffer */ - msgPoolData * poolDataTab; poolDataTab=msgPoolDataTabOpen(space); // mapper le buffer dans l'espace mémoire du processus resultAddr=msgBufferMap(poolDataTab,oldElem->poolIndex,oldElem->bufferIndex); diff --git a/src/global.h b/src/global.h index ad6fe15..7843fa7 100644 --- a/src/global.h +++ b/src/global.h @@ -26,6 +26,11 @@ #endif +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + + #ifdef _NZG_REALFILEID #define DEFAULT_MSGSPACELISTID "/tmp/nzgSpaceList" #else diff --git a/src/poolDataTabLock.c b/src/poolDataTabLock.c index a8790cd..fc4b633 100644 --- a/src/poolDataTabLock.c +++ b/src/poolDataTabLock.c @@ -4,10 +4,12 @@ #define DEBUG 0 int msgPoolDataTabLock(msgSpace * space){ + int semval; sem_t * poolDataTabSemFd; -if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);} + semval=0; + if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);} - poolDataTabSemFd=sem_open( + poolDataTabSemFd=sem_open( space->poolDataTabSemId ,O_CREAT, SEM_DEFAULT_MODE, @@ -21,9 +23,9 @@ if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);} NZG_ERROR("sem_wait",space->poolDataTabSemId); goto ERROR; } - int semval=0; - sem_getvalue(poolDataTabSemFd,&semval); - if (DEBUG) { printf("(AfternValue:%d)\n",semval);} + + sem_getvalue(poolDataTabSemFd,&semval); + if (DEBUG) { printf("(AfternValue:%d)\n",semval);} sem_close(poolDataTabSemFd); diff --git a/src/poolDataTabUnlock.c b/src/poolDataTabUnlock.c index 4c9afdc..e976f4e 100644 --- a/src/poolDataTabUnlock.c +++ b/src/poolDataTabUnlock.c @@ -4,6 +4,7 @@ #define DEBUG 0 int msgPoolDataTabUnlock(msgSpace * space){ + int semval; sem_t * poolDataTabSemFd; if (DEBUG) { printf("Unlocking %s\n",space->poolDataTabSemId); } poolDataTabSemFd=sem_open( @@ -20,7 +21,8 @@ int msgPoolDataTabUnlock(msgSpace * space){ NZG_ERROR("sem_post",space->poolDataTabSemId); goto ERROR; } - int semval=0; + + semval=0; sem_getvalue(poolDataTabSemFd,&semval); if (DEBUG) { printf("(AfternValue:%d)\n",semval); } diff --git a/src/put.c b/src/put.c index f92a0a2..b3ee344 100644 --- a/src/put.c +++ b/src/put.c @@ -6,8 +6,10 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){ int poolIndex; int bufferIndex; int err; - msgQueueElemId newElemId; + msgQueueElemId newElemId; msgQueueElem * queueElem; + msgQueueId queueId; + msgQueue * queue; msgPoolDataTabLock(space); poolDataTabAddr=msgPoolDataTabOpen(space); @@ -24,15 +26,13 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){ ); // ouvrir la queue avec le bon index - msgQueueId queueId; - msgQueue * queue; msgQueueIdIntern(queueId,space->externId,queueIndex); - + msgQueueProtLock(space->externId,queueIndex); queue = msgQueueOpen(queueId); // creer un element vide - + msgQueueElemCreate(newElemId,queueId,queue->elemCounter); // ouvrir l'element queueElem=msgQueueElemOpen(newElemId); @@ -40,7 +40,7 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){ // modifier les index pour retrouver le buffer queueElem->poolIndex=poolIndex; queueElem->bufferIndex=bufferIndex; - + // fermer l'element if (msgQueueElemClose(queueElem) <0 ){ NZG_ERROR("msgQueueElemClose",""); diff --git a/src/queueDelete.c b/src/queueDelete.c index b6ff4d3..eddcc86 100644 --- a/src/queueDelete.c +++ b/src/queueDelete.c @@ -3,6 +3,8 @@ int msgQueueDelete(msgQueueId externId,int queueIdx){ msgQueue * queue; msgQueueId queueId; + msgQueueSemId queueProtLockSemId; + msgQueueSemId queueReadLockSemId; msgQueueIdIntern(queueId,externId,queueIdx); queue = msgQueueOpen(queueId); @@ -15,8 +17,6 @@ int msgQueueDelete(msgQueueId externId,int queueIdx){ } } - msgQueueSemId queueProtLockSemId; - msgQueueSemId queueReadLockSemId; msgQueueProtSemIdIntern(queueProtLockSemId,externId,queueIdx); msgQueueReadSemIdIntern(queueReadLockSemId,externId,queueIdx); sem_unlink(queueProtLockSemId); diff --git a/src/queueElemCreate.c b/src/queueElemCreate.c index 62769d9..b127d1f 100644 --- a/src/queueElemCreate.c +++ b/src/queueElemCreate.c @@ -6,11 +6,11 @@ int msgQueueElemCreate( msgQueueId queueId, int counter){ msgQueueElemId queueElemId; + int queueElemFd; msgQueueElemIdIntern(queueElemId,queueId,counter); strcpy(finalQueueElemId,queueElemId); - int queueElemFd; queueElemFd=shm_open(queueElemId, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, SHM_DEFAULT_MODE); diff --git a/src/queueProtLock.c b/src/queueProtLock.c index 476f5ab..7ff7a18 100644 --- a/src/queueProtLock.c +++ b/src/queueProtLock.c @@ -3,6 +3,7 @@ #define DEBUG 0 int msgQueueProtLock(msgSpaceId externId,int queueIdx){ + int semval; sem_t * queueSemFd; msgQueueSemId queueSemId; @@ -18,13 +19,11 @@ int msgQueueProtLock(msgSpaceId externId,int queueIdx){ NZG_ERROR("sem_wait",queueSemId); goto ERROR; } - int semval=0; + semval=0; sem_getvalue(queueSemFd,&semval); if (DEBUG) { printf("(AfterValue:%d)\n",semval); } sem_close(queueSemFd); - - sem_close(queueSemFd); return 0; diff --git a/src/queueProtUnlock.c b/src/queueProtUnlock.c index 1e6d8d9..89673cb 100644 --- a/src/queueProtUnlock.c +++ b/src/queueProtUnlock.c @@ -4,6 +4,7 @@ #define DEBUG 0 int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){ + int semval; sem_t * queueSemFd; msgQueueSemId queueSemId; @@ -20,7 +21,7 @@ int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){ NZG_ERROR("sem_post",queueSemId); goto ERROR; } - int semval=0; + semval=0; sem_getvalue(queueSemFd,&semval); if (DEBUG) { printf("(AfterValue:%d)\n",semval); } diff --git a/src/queueReadLock.c b/src/queueReadLock.c index b694749..16e1653 100644 --- a/src/queueReadLock.c +++ b/src/queueReadLock.c @@ -4,6 +4,7 @@ #define DEBUG 0 int msgQueueReadLock(msgSpaceId externId,int queueIdx){ + int semval; sem_t * queueSemFd; msgQueueSemId queueSemId; @@ -19,7 +20,7 @@ int msgQueueReadLock(msgSpaceId externId,int queueIdx){ NZG_ERROR("sem_wait",queueSemId); goto ERROR; } - int semval=0; + semval=0; sem_getvalue(queueSemFd,&semval); if (DEBUG) { printf("(AfterValue:%d)\n",semval); } diff --git a/src/queueReadTryLock.c b/src/queueReadTryLock.c index 3c33646..f2dc629 100644 --- a/src/queueReadTryLock.c +++ b/src/queueReadTryLock.c @@ -4,6 +4,7 @@ #define DEBUG 0 int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){ + int semval; sem_t * queueSemFd; msgQueueSemId queueSemId; @@ -19,9 +20,9 @@ int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){ goto ERROR; } if (DEBUG) { printf("Locking %s\n",queueSemId); } - int semval=0; - sem_getvalue(queueSemFd,&semval); - if (DEBUG) { printf("(AfterValue:%d)\n",semval); } + semval=0; + sem_getvalue(queueSemFd,&semval); + if (DEBUG) { printf("(AfterValue:%d)\n",semval); } sem_close(queueSemFd); diff --git a/src/queueReadUnlock.c b/src/queueReadUnlock.c index d6afbb6..5e4fb32 100644 --- a/src/queueReadUnlock.c +++ b/src/queueReadUnlock.c @@ -4,12 +4,13 @@ #define DEBUG 0 int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){ - sem_t * queueSemFd; + int semval; + sem_t * queueSemFd; msgQueueSemId queueSemId; msgQueueReadSemIdIntern(queueSemId,externId,queueIdx); if (DEBUG) { printf("Unlocking %s\n",queueSemId); } - queueSemFd=sem_open(queueSemId,O_CREAT,SEM_DEFAULT_MODE,1); + queueSemFd=sem_open(queueSemId,O_CREAT,SEM_DEFAULT_MODE,1); if(queueSemFd==SEM_FAILED){ NZG_ERROR("sem_open",queueSemId); goto ERROR; @@ -19,9 +20,9 @@ int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){ NZG_ERROR("sem_post",queueSemId); goto ERROR; } - int semval=0; - sem_getvalue(queueSemFd,&semval); - if (DEBUG) { printf("(AfterValue:%d)\n",semval); } + semval=0; + sem_getvalue(queueSemFd,&semval); + if (DEBUG) { printf("(AfterValue:%d)\n",semval); } sem_close(queueSemFd); diff --git a/src/spaceCreate.c b/src/spaceCreate.c index 2c2349c..1b08b88 100644 --- a/src/spaceCreate.c +++ b/src/spaceCreate.c @@ -22,8 +22,10 @@ msgSpace * msgSpaceCreate( /* msgSpaceList mSList; */ int mSFd; // shm file descriptor int i; + int err; static int mSIdNum=-1; msgSpace * space; + msgSpaceListElemId listElemId; msgPoolDataTabId poolDataTabId; msgPoolData * poolDataTabAddr; @@ -50,7 +52,6 @@ msgSpace * msgSpaceCreate( NZG_ERROR("msgSpaceListLock",""); goto ERROR; } - int err; if ((err=msgSpaceListFindId(externId)) < 1){ if (err==0){ // soit le msgSpace existe deja @@ -173,7 +174,6 @@ msgSpace * msgSpaceCreate( } msgPoolDataTabClose(space,poolDataTabAddr); /* on ajoute spaceId a la liste des msgSpace connus */ - msgSpaceListElemId listElemId; printf("spaceListInit...\n"); printf("ok\n"); diff --git a/src/spaceDelete.c b/src/spaceDelete.c index 16acfce..5a40cae 100644 --- a/src/spaceDelete.c +++ b/src/spaceDelete.c @@ -8,11 +8,11 @@ int msgPoolDataTabSemIdIntern( msgPoolSemId destSemId,const msgSpaceId externId); int msgSpaceDelete(msgSpaceId externId){ - fprintf(stderr,"Deleting msgSpace with id : %s\n",externId); //int shmId; msgSpaceId nzgId; msgSpace * space; int i; + fprintf(stderr,"Deleting msgSpace with id : %s\n",externId); if (msgSpaceIdIntern(nzgId,externId) == -1){ NZG_ERROR("msgSpaceIdIntern",externId); goto ERROR; diff --git a/src/spaceListElemCreate.c b/src/spaceListElemCreate.c index 8ba9e00..fa726ac 100644 --- a/src/spaceListElemCreate.c +++ b/src/spaceListElemCreate.c @@ -7,8 +7,9 @@ int msgSpaceListElemCreate( msgSpace * space) { - msgSpaceListElemIdIntern(listElemId,space->externId); int listElemFd; + msgSpaceListElem * listElem; + msgSpaceListElemIdIntern(listElemId,space->externId); listElemFd=shm_open(listElemId, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, @@ -25,7 +26,6 @@ int msgSpaceListElemCreate( } close(listElemFd); - msgSpaceListElem * listElem; listElem=msgSpaceListElemOpen(listElemId); if (listElem ==NULL){ NZG_ERROR("msgSpaceListElemOpen",listElemId); diff --git a/src/spaceListFindId.c b/src/spaceListFindId.c index 1d9435c..312530c 100644 --- a/src/spaceListFindId.c +++ b/src/spaceListFindId.c @@ -5,11 +5,11 @@ int msgSpaceListFindId(msgSpaceId externId){ msgSpaceList * list; msgSpaceId spaceId; - - msgSpaceIdIntern(spaceId,externId); msgSpaceListElemId listHeadElemId; msgSpaceListElemId listTailElemId; msgSpaceListId listId; + + msgSpaceIdIntern(spaceId,externId); list=msgSpaceListOpen(); if (list==NULL){ NZG_ERROR("msgSpaceListOpen",""); diff --git a/src/spaceListInit.c b/src/spaceListInit.c index b1e052b..eadf0f9 100644 --- a/src/spaceListInit.c +++ b/src/spaceListInit.c @@ -4,9 +4,11 @@ int msgSpaceListInit(){ int spaceListFd; sem_t * spaceListSemFd; + msgSpaceList *list; msgSpaceListSemId spaceListSemId; msgSpaceListId spaceListId; + strcpy(spaceListSemId,DEFAULT_MSGSPACELISTSEMID); strcpy(spaceListId,DEFAULT_MSGSPACELISTID); @@ -42,7 +44,6 @@ int msgSpaceListInit(){ } close(spaceListFd); - msgSpaceList *list; list=msgSpaceListOpen(); if (list == NULL){ NZG_ERROR("msgSpaceListOpen",""); @@ -65,7 +66,7 @@ int msgSpaceListInit(){ ERROR: return -1; EXISTING: - if (msgSpaceListUnlock() < 0){ + if (msgSpaceListUnlock() < 0){ NZG_ERROR("msgSpaceListUnlock",""); goto ERROR; } diff --git a/test/Makefile b/test/Makefile index f5fb8ac..5feea65 100644 --- a/test/Makefile +++ b/test/Makefile @@ -24,21 +24,26 @@ CC=gcc CFLAGS=-Wall -O2 -ggdb #-O2 -ggdb -INCLUDES=-I /usr/include -I ../src/ +INCLUDES=-I /usr/include/ -I ../src/ LIBINC=-L /usr/lib -L ../src BASELIBS=-lnazgul LIBS=$(BASELIBS) +DEFS= + ifeq "HP-UX" "${OS}" + DEFS=-D_NZG_HPUX LIBS=$(BASELIBS) -lpthread -lrt endif ifeq "SunOS" "${OS}" + DEFS=-D_NZG_SUNOS LIBS=$(BASELIBS) -lrt endif ifeq "Linux" "${OS}" + DEFS=-D_NZG_LINUX LIBS=$(BASELIBS) -lrt -lpthread endif @@ -61,5 +66,5 @@ clean: @rm -f $(FILES) % : %.c - $(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS) + $(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS) $(DEFS) diff --git a/test/create_delete.c b/test/create_delete.c index 33b3aa2..431102d 100644 --- a/test/create_delete.c +++ b/test/create_delete.c @@ -1,9 +1,15 @@ +#ifdef _NZG_HPUX +#include +#else #include +#endif + #include "libnazgul.h" int main(void) { // msgSpace mS=0; + pid_t pid; msgSpaceId testId; msgSpace * mSPAC; msgPool poolInfos[3]; @@ -20,14 +26,14 @@ int main(void) { sprintf(testId,"test%d",(int)getuid()); printf("RequestedId: %s\n",testId); - printf("Void size: %d\n",sizeof(void)); + printf("Void size: %d\n",(int)sizeof(void)); mSPAC=msgSpaceCreate(testId,0,3,poolInfos); if (mSPAC ==NULL) { NZG_ERROR("msgSpaceCreate",testId); exit(0); } - pid_t pid=fork(); + pid=fork(); diff --git a/test/msgSpaceState.c b/test/msgSpaceState.c index 14a62ab..68ca16d 100644 --- a/test/msgSpaceState.c +++ b/test/msgSpaceState.c @@ -1,4 +1,9 @@ +#ifdef _NZG_HPUX +#include +#else #include +#endif + #include "libnazgul.h" void usage(char * myname){ diff --git a/test/put_get_mono.c b/test/put_get_mono.c index d450df4..e10715c 100644 --- a/test/put_get_mono.c +++ b/test/put_get_mono.c @@ -1,4 +1,9 @@ +#ifdef _NZG_HPUX +#include +#else #include +#endif + #include "libnazgul.h" int main(void) { @@ -17,7 +22,7 @@ int main(void) { sprintf(testId,"test%d",(int)getuid()); printf("RequestedId: %s\n",testId); - printf("Void size: %d\n",sizeof(void)); + printf("Void size: %d\n",(int)sizeof(void)); //creation de l'espace de messages mSPAC=msgSpaceCreate(testId,1,2,poolInfos); if (mSPAC ==NULL) { diff --git a/test/put_get_multi.c b/test/put_get_multi.c index f23a5eb..d541214 100644 --- a/test/put_get_multi.c +++ b/test/put_get_multi.c @@ -1,4 +1,9 @@ +#ifdef _NZG_HPUX +#include +#else #include +#endif + #include "libnazgul.h" int main(void) { @@ -17,7 +22,7 @@ int main(void) { sprintf(testId,"test%d",(int)getuid()); printf("RequestedId: %s\n",testId); - printf("Void size: %d\n",sizeof(void)); + printf("Void size: %d\n",(int)sizeof(void)); //creation de l'espace de messages mSPAC=msgSpaceCreate(testId,1,2,poolInfos); if (mSPAC ==NULL) {