Compare commits

..

No commits in common. "0d538f209428f35bbfee4ff9ccd98ee693afe76b" and "3e4c8e432c942c8d3795a3a0e277e5fddc31cd3a" have entirely different histories.

28 changed files with 122 additions and 187 deletions

View file

@ -1,16 +1,12 @@
\chapter{Conclusion} \chapter{A venir}
\par Nous avons fini le projet, mais il n'est certainement pas exempt \par Bien que nous ayons fini le projet, il se peut qu'il ne soit pas
de bugs et d'autres défauts. sans défauts. C'est pourquoi dans l'avenir, il faudrai corriger les
C'est pourquoi dans l'avenir, il faudrai corriger les bogues éventuels que bogues éventuels que tous nos tests n'auraient pas fait appara{\^i}tre.
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). 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.
\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. 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
\par Il serait également possible de faire en sorte d'utiliser moins de d'utiliser moins de mémoire en réduisant le nombre de {\em shm}; pour
mémoire en réduisant le nombre de segment de mémoire partagée, mais pour cela il faudrai changer de structure de donnée. Nous aimerions également
cela il faudrai changer de structures de données. finir l'outil d'analyse {\em msgSpaceState} des {\em msgSpace}.
\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.

View file

@ -5,9 +5,7 @@
\subsection{Travail collaboratif} \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}}. \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 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.
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} \subsection{Moyens techniques}
@ -15,8 +13,10 @@ ainsi
\par Chacun selon nos préférences, nous avons utilisés des machines sous GNU/Linux ou Microsoft Windows et codé avec Vim. \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, 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). 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 compiler et tester Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir
la bibliothèque dans de meilleurs conditions que sous son système initial\ldots 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.
\section{Programmation} \section{Programmation}
@ -28,63 +28,48 @@ utilis
des fonctions dans le fichier \\``\verb+/src/proto.h+'', avec en des fonctions dans le fichier \\``\verb+/src/proto.h+'', avec en
commentaire le fichier d'où il est issu. Par contre pour les fonctions 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+''. 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. notre bibliothèque, tandis que ``\verb+/src/ids.h+'' non.
Nous allons donc vous décrire nos différentes fonctions en les classant Nous allons donc vous décrire nos différentes fonctions en les classant
par famille. par famille.
\newline \newline
\par Nous avons quatre grandes {\em familles} de fonctions. \par Nous avons quatre grandes {\em familles} de fonctions.
\begin{description} \begin{description}
\item[msgBuffer*]{Ce sont toutes les fonctions qui concernent les \item{\sc msgBuffer*} Ce sont toutes les fonctions qui concernent les
buffers : création, attachement aux processus\ldots} 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[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''. détruire une {\em pool}, de l'ouvrir ou encore de poser un ``verrou''.
\begin{description} \begin{description}
\item{\sc msgPool*} Fonctions servant à gérer une {\em pool}, qui
\item[msgPool*]{Fonctions servant à gérer une {\em pool}, qui correspond à un ensemble de {\em buffers}.
correspond à un ensemble de {\em buffers}.} \item{\sc msgPoolDataTab*} Fonctions utiles pour la gestion des
\item[msgPoolDataTab*]{Fonctions utiles pour la gestion des
informations d'une {\em pool} telles que la taille des {\em buffers}, informations d'une {\em pool} telles que la taille des {\em buffers},
leur nombre\dots} leur nombre\dots
\end{description} \end{description}
} \item{\sc msgQueue*} Toutes les fonctions gérant les ``queues'', {\em
files de maessages}. On y
\item[msgQueue*]{Toutes les fonctions gérant les ``queues'', {\em trouve celle qui en créé une, celles qui vérifient si elle est
files de messages}. On y trouve celle qui en créé une, celles i disponible ou pas, celles qui ajoutent un élément ou au contraire en
qui vérifient si elle est disponible ou pas, celles qui ajoutent enlève un.
un élément ou au contraire en enlève un.
\begin{description} \begin{description}
\item[msgQueue*]{ Rassemble toutes les fonctions servant à la gestion \item{\sc msgQueue*} Rassemble toutes les fonctions servant à la gestion
des files de messages.} des files de messages.
\item{\sc msgQueueElem*} Les fonctions utiles pour gérer un élément
\item[msgQueueElem*]{ Les fonctions utiles pour gérer un élément d'une file de messages.
d'une file de messages.} \item{\sc msgQueue(Prot/Read)*} Fonctions servant à protéger une file.
\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} \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 messages : création, ouverture, listes\ldots
\begin{description} \begin{description}
\item[msgSpace*]{Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages.} \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
\item[msgSpaceList*]{Ce sont toutes les fonctions utiles pour la gestion de la liste cha{\^i}née des {\em msgSpace} existants.
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[msgSpaceListElem*]{ Fonctions correspondant à la gestion d'un
élément de la {\em msgSpaceList}.}
\end{description} \end{description}
}
\end{description} \end{description}
\subsection{Détails sur certaines fonctions} \subsection{Détails sur certaines fonctions}
\par Nous détaillerons ici quelques fonctions qui peuvent ne pas \par Nous détaillerons ici quelques fonctions qui peuvent ne pas
@ -125,45 +110,43 @@ espace de messages {\em msgSpace *}, un num
l'adresse d'un buffer {\em void *}. Elle insère le buffer dans le numéro 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 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}. 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} \end{itemize}
\newpage \newpage
\section{Difficultés rencontrées} \section{Difficultés rencontrées}
\subsection{Restrictions} \par Nous n'avons pas eu de grosses difficultés à proprement parlé.
\par Nous n'avons pas eu de grosses difficultés à proprement parler.
Nous avions juste quelques restrictions, comme le fait de ne pas Nous avions juste quelques restrictions, comme le fait de ne pas
pouvoir utiliser de pointeurs absolus, car l'espace d'adressage entre 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 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. seulement un segment de mémoire partagée en commun. Il a donc
\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} fallu utiliser les différentes {\em id} des espaces de messages {\em msgSpace}, ou
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. 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.
\subsection{Libertés d'implémentations de POSIX\ldots}
\par Le choix des identifiants ne fut pas simple non plus, car il \par Le choix des identifiants ne fut pas simple non plus, car il
fallait en changer en fonction des différentes implémentations de POSIX. fallait en changer en fonction des différentes implémentations. Par
En effet la norme POSIX précise que l'identifiant doit commencer par un ``\verb+/+'' et si possible ne pas en comporter d'autres. exemple nous pouvions avoir des identifiants du type ``\verb+/tmp/identifiant+'',
\par Si cela est vrai sur certains systèmes (comme GNU/Linux) d'autres qui ne marchaient que sur un type de machines. Sur les autres il
systemes (HP-UX, SunOS) requièrent que cet identifiant corresponde fallait en avoir un du type ``\verb+/identifiant+''. Cela nous a amener
au chemin absolu (dans l'arborescence UNIX) d'un fichier sur lequel à faire une distinction de cas et générer un identifiant différent
on possède des droits\ldots selon que l'on soit sur une machine de type {\em HP-UX}, {\em SunOS}
ou {\em Linux}.
\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 \par Malheureusement le fait de travailler sur plusieurs types de
machines n'était pas seulement g{\^e}nant pour les identifiants, machines n'était pas seulement g{\^e}nant pour les identifiants,
mais également pour créer la bibliothèque. En effet, il faut ajouter 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 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 d'inclure les bonnes librairies pour que notre bibliothèque puisse
compiler et fonctionner convenablement. fonctionner convenablement.
\par Ces distinctions se font dans les {\em Makefile}, \verb+/src/Makefile+ et \verb+/test/Makefile+.
\par La seconde difficulté liée à POSIX, est la projection de fichier \par Encore une autre difficulté d{\^u}e à Posix, est la
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 projection de fichier ou {\em mapping} avec {\em mmap}. L'offset
\par Ceci est assez génant lorsque l'on veut accéder à bloc de donnée peut {\^e}tre aligné sur les pages mémoires sur
qui peut commencer n'importe où dans la zone de mémoire partagée. certains systèmes. Or ceci est emb{\^e}tant lorsque l'on veut
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. accéder à un fichier qui commence n'importe où dans le bloc mémoire.
\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. Pour remédier à cela, nous {\em mappons} jusqu'à ``juste derrière le
\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é. buffer''. Nous autorisons le buffer en lecture/écriture et nous déplaçons
l'adresse obtenue au début du buffer.

View file

@ -33,11 +33,10 @@ CFILES := $(shell ls *.c)
OFILES := $(patsubst %.c,%.o,$(CFILES)) OFILES := $(patsubst %.c,%.o,$(CFILES))
DESTFILE=libnazgul.a DESTFILE=libnazgul.a
INCLUDES=-I /usr/lib/ -I /usr/local/lib/
DEFINES:= DEFINES:=
ifeq "SunOS" "${OS}" ifeq "SunOS" "${OS}"
DEFINES:=-D_NZG_REALFILEID -D_NZG_SUNOS DEFINES:=-D_NZG_REALFILEID
endif endif
ifeq "HP-UX" "${OS}" ifeq "HP-UX" "${OS}"

View file

@ -15,7 +15,6 @@ void * msgAllocate(msgSpace *space,
int option int option
){ ){
void * resultAddr=NULL; void * resultAddr=NULL;
int bufferFreeSize;
int i; int i;
msgPoolId resultPoolId; msgPoolId resultPoolId;
/* tableau des valeurs des semPoolCoef/pool pour identifier le pool /* tableau des valeurs des semPoolCoef/pool pour identifier le pool
@ -184,6 +183,7 @@ if (mSPoolDataTabAddr==NULL){
/* mapper le buffer libre dans l'esp addr du proc */ /* mapper le buffer libre dans l'esp addr du proc */
strcpy(resultPoolId,mSPoolDataTabAddr[selectedPoolIndex].poolId); strcpy(resultPoolId,mSPoolDataTabAddr[selectedPoolIndex].poolId);
int bufferFreeSize;
bufferFreeSize=mSPoolDataTabAddr[selectedPoolIndex].bufferSize; bufferFreeSize=mSPoolDataTabAddr[selectedPoolIndex].bufferSize;
printf("BufferSize : %d\n", bufferFreeSize); printf("BufferSize : %d\n", bufferFreeSize);

View file

@ -14,7 +14,6 @@ int msgBufferGetProcAttach(
bool found=false; bool found=false;
int pIdx=0; int pIdx=0;
int bIdx;
while ((!found) && (pIdx < poolNb)){ while ((!found) && (pIdx < poolNb)){
/* Pour chaque pool */ /* Pour chaque pool */
//récuperer l'ID du BufferInfoTab; //récuperer l'ID du BufferInfoTab;
@ -30,7 +29,7 @@ int msgBufferGetProcAttach(
PROT_READ,MAP_SHARED,bufferInfoTabFd,(off_t)0); PROT_READ,MAP_SHARED,bufferInfoTabFd,(off_t)0);
/* on cherche dans chacun des buffers */ /* on cherche dans chacun des buffers */
bIdx=0; int bIdx=0;
while((!found) && bIdx<bufferInfoNb){ while((!found) && bIdx<bufferInfoNb){
if (bufferInfoTabAddr[bIdx].addr == addr){ if (bufferInfoTabAddr[bIdx].addr == addr){
found=true; found=true;

View file

@ -1,17 +1,13 @@
#include "libnazgul.h" #include "libnazgul.h"
int msgFree(msgSpace * space, void * addr){ int msgFree(msgSpace * space, void * addr){
printf("[ FREE 0x%08x ]\n",(int)addr);
int poolIndex; int poolIndex;
int bufferIndex; int bufferIndex;
msgPoolData * poolDataTabAddr; msgPoolData * poolDataTabAddr;
sem_t * ressourceSemFd; sem_t * ressourceSemFd;
msgPoolDataTabSemId ressourceSemId; msgPoolDataTabSemId ressourceSemId;
int err;
int bufferNb;
int bufferSize;
void * realAddr;
printf("[ FREE 0x%08x ]\n",(int)addr);
/* on acquiert le droit de modifier les infos sur la ressource */ /* on acquiert le droit de modifier les infos sur la ressource */
/* on protege le tableau des associations */ /* on protege le tableau des associations */
if (msgPoolDataTabLock(space) <0){ if (msgPoolDataTabLock(space) <0){
@ -24,6 +20,7 @@ int msgFree(msgSpace * space, void * addr){
poolDataTabAddr = msgPoolDataTabOpen(space); poolDataTabAddr = msgPoolDataTabOpen(space);
// TODO: verouiller semaphore DataInfo ?? // TODO: verouiller semaphore DataInfo ??
int err;
poolIndex=-1; bufferIndex=-1; poolIndex=-1; bufferIndex=-1;
err=msgBufferGetProcAttach( err=msgBufferGetProcAttach(
@ -39,16 +36,16 @@ int msgFree(msgSpace * space, void * addr){
msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr); msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr);
/* unmapper le buffer */ /* unmapper le buffer */
realAddr=addr; void * realAddr=addr;
bufferSize=poolDataTabAddr[poolIndex].bufferSize; int bufferSize=poolDataTabAddr[poolIndex].bufferSize;
bufferNb=poolDataTabAddr[poolIndex].bufferNb; int bufferNb=poolDataTabAddr[poolIndex].bufferNb;
realAddr=realAddr-poolIndex*bufferSize; realAddr=realAddr-poolIndex*bufferSize;
munmap(realAddr,bufferSize*bufferNb); munmap(realAddr,bufferSize*bufferNb);
msgPoolDataTabClose(space,poolDataTabAddr); msgPoolDataTabClose(space,poolDataTabAddr);
// deverouiller semaphore DataInfo // deverouiller semaphore DataInfo
msgPoolDataTabUnlock(space); msgPoolDataTabUnlock(space);
// deverouiller semaphore ressource. // deverouiller semaphore ressource.
msgPoolSemIdIntern(ressourceSemId,space->externId,poolIndex); msgPoolSemIdIntern(ressourceSemId,space->externId,poolIndex);

View file

@ -8,7 +8,6 @@ void * msgGet(msgSpace * space,int queueIndex,int option){
msgQueue * queue; msgQueue * queue;
msgQueueElemId oldElemId; msgQueueElemId oldElemId;
msgQueueElem * oldElem; msgQueueElem * oldElem;
msgPoolData * poolDataTab;
// on teste la possibilité de lecture sur la liste... // on teste la possibilité de lecture sur la liste...
if (option == NONBLOCK){ if (option == NONBLOCK){
if (msgQueueReadTryLock(space->externId,queueIndex) <0){ if (msgQueueReadTryLock(space->externId,queueIndex) <0){
@ -40,6 +39,7 @@ void * msgGet(msgSpace * space,int queueIndex,int option){
goto ERROR; goto ERROR;
} }
/* on récupere la taille des buffer dans la pool du buffer */ /* on récupere la taille des buffer dans la pool du buffer */
msgPoolData * poolDataTab;
poolDataTab=msgPoolDataTabOpen(space); poolDataTab=msgPoolDataTabOpen(space);
// mapper le buffer dans l'espace mémoire du processus // mapper le buffer dans l'espace mémoire du processus
resultAddr=msgBufferMap(poolDataTab,oldElem->poolIndex,oldElem->bufferIndex); resultAddr=msgBufferMap(poolDataTab,oldElem->poolIndex,oldElem->bufferIndex);

View file

@ -26,11 +26,6 @@
#endif #endif
#ifndef MAP_FAILED
#define MAP_FAILED ((void *)-1)
#endif
#ifdef _NZG_REALFILEID #ifdef _NZG_REALFILEID
#define DEFAULT_MSGSPACELISTID "/tmp/nzgSpaceList" #define DEFAULT_MSGSPACELISTID "/tmp/nzgSpaceList"
#else #else

View file

@ -4,10 +4,8 @@
#define DEBUG 0 #define DEBUG 0
int msgPoolDataTabLock(msgSpace * space){ int msgPoolDataTabLock(msgSpace * space){
int semval;
sem_t * poolDataTabSemFd; sem_t * poolDataTabSemFd;
semval=0; if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);}
if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);}
poolDataTabSemFd=sem_open( poolDataTabSemFd=sem_open(
space->poolDataTabSemId space->poolDataTabSemId
@ -23,7 +21,7 @@ int msgPoolDataTabLock(msgSpace * space){
NZG_ERROR("sem_wait",space->poolDataTabSemId); NZG_ERROR("sem_wait",space->poolDataTabSemId);
goto ERROR; goto ERROR;
} }
int semval=0;
sem_getvalue(poolDataTabSemFd,&semval); sem_getvalue(poolDataTabSemFd,&semval);
if (DEBUG) { printf("(AfternValue:%d)\n",semval);} if (DEBUG) { printf("(AfternValue:%d)\n",semval);}

View file

@ -4,7 +4,6 @@
#define DEBUG 0 #define DEBUG 0
int msgPoolDataTabUnlock(msgSpace * space){ int msgPoolDataTabUnlock(msgSpace * space){
int semval;
sem_t * poolDataTabSemFd; sem_t * poolDataTabSemFd;
if (DEBUG) { printf("Unlocking %s\n",space->poolDataTabSemId); } if (DEBUG) { printf("Unlocking %s\n",space->poolDataTabSemId); }
poolDataTabSemFd=sem_open( poolDataTabSemFd=sem_open(
@ -21,8 +20,7 @@ int msgPoolDataTabUnlock(msgSpace * space){
NZG_ERROR("sem_post",space->poolDataTabSemId); NZG_ERROR("sem_post",space->poolDataTabSemId);
goto ERROR; goto ERROR;
} }
int semval=0;
semval=0;
sem_getvalue(poolDataTabSemFd,&semval); sem_getvalue(poolDataTabSemFd,&semval);
if (DEBUG) { printf("(AfternValue:%d)\n",semval); } if (DEBUG) { printf("(AfternValue:%d)\n",semval); }

View file

@ -8,8 +8,6 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){
int err; int err;
msgQueueElemId newElemId; msgQueueElemId newElemId;
msgQueueElem * queueElem; msgQueueElem * queueElem;
msgQueueId queueId;
msgQueue * queue;
msgPoolDataTabLock(space); msgPoolDataTabLock(space);
poolDataTabAddr=msgPoolDataTabOpen(space); poolDataTabAddr=msgPoolDataTabOpen(space);
@ -26,6 +24,8 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){
); );
// ouvrir la queue avec le bon index // ouvrir la queue avec le bon index
msgQueueId queueId;
msgQueue * queue;
msgQueueIdIntern(queueId,space->externId,queueIndex); msgQueueIdIntern(queueId,space->externId,queueIndex);
msgQueueProtLock(space->externId,queueIndex); msgQueueProtLock(space->externId,queueIndex);

View file

@ -3,8 +3,6 @@
int msgQueueDelete(msgQueueId externId,int queueIdx){ int msgQueueDelete(msgQueueId externId,int queueIdx){
msgQueue * queue; msgQueue * queue;
msgQueueId queueId; msgQueueId queueId;
msgQueueSemId queueProtLockSemId;
msgQueueSemId queueReadLockSemId;
msgQueueIdIntern(queueId,externId,queueIdx); msgQueueIdIntern(queueId,externId,queueIdx);
queue = msgQueueOpen(queueId); queue = msgQueueOpen(queueId);
@ -17,6 +15,8 @@ int msgQueueDelete(msgQueueId externId,int queueIdx){
} }
} }
msgQueueSemId queueProtLockSemId;
msgQueueSemId queueReadLockSemId;
msgQueueProtSemIdIntern(queueProtLockSemId,externId,queueIdx); msgQueueProtSemIdIntern(queueProtLockSemId,externId,queueIdx);
msgQueueReadSemIdIntern(queueReadLockSemId,externId,queueIdx); msgQueueReadSemIdIntern(queueReadLockSemId,externId,queueIdx);
sem_unlink(queueProtLockSemId); sem_unlink(queueProtLockSemId);

View file

@ -6,11 +6,11 @@ int msgQueueElemCreate(
msgQueueId queueId, msgQueueId queueId,
int counter){ int counter){
msgQueueElemId queueElemId; msgQueueElemId queueElemId;
int queueElemFd;
msgQueueElemIdIntern(queueElemId,queueId,counter); msgQueueElemIdIntern(queueElemId,queueId,counter);
strcpy(finalQueueElemId,queueElemId); strcpy(finalQueueElemId,queueElemId);
int queueElemFd;
queueElemFd=shm_open(queueElemId, queueElemFd=shm_open(queueElemId,
O_RDWR|O_CREAT|O_EXCL|O_TRUNC, O_RDWR|O_CREAT|O_EXCL|O_TRUNC,
SHM_DEFAULT_MODE); SHM_DEFAULT_MODE);

View file

@ -3,7 +3,6 @@
#define DEBUG 0 #define DEBUG 0
int msgQueueProtLock(msgSpaceId externId,int queueIdx){ int msgQueueProtLock(msgSpaceId externId,int queueIdx){
int semval;
sem_t * queueSemFd; sem_t * queueSemFd;
msgQueueSemId queueSemId; msgQueueSemId queueSemId;
@ -19,11 +18,13 @@ int msgQueueProtLock(msgSpaceId externId,int queueIdx){
NZG_ERROR("sem_wait",queueSemId); NZG_ERROR("sem_wait",queueSemId);
goto ERROR; goto ERROR;
} }
semval=0; int semval=0;
sem_getvalue(queueSemFd,&semval); sem_getvalue(queueSemFd,&semval);
if (DEBUG) { printf("(AfterValue:%d)\n",semval); } if (DEBUG) { printf("(AfterValue:%d)\n",semval); }
sem_close(queueSemFd); sem_close(queueSemFd);
sem_close(queueSemFd); sem_close(queueSemFd);
return 0; return 0;

View file

@ -4,7 +4,6 @@
#define DEBUG 0 #define DEBUG 0
int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){ int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){
int semval;
sem_t * queueSemFd; sem_t * queueSemFd;
msgQueueSemId queueSemId; msgQueueSemId queueSemId;
@ -21,7 +20,7 @@ int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){
NZG_ERROR("sem_post",queueSemId); NZG_ERROR("sem_post",queueSemId);
goto ERROR; goto ERROR;
} }
semval=0; int semval=0;
sem_getvalue(queueSemFd,&semval); sem_getvalue(queueSemFd,&semval);
if (DEBUG) { printf("(AfterValue:%d)\n",semval); } if (DEBUG) { printf("(AfterValue:%d)\n",semval); }

View file

@ -4,7 +4,6 @@
#define DEBUG 0 #define DEBUG 0
int msgQueueReadLock(msgSpaceId externId,int queueIdx){ int msgQueueReadLock(msgSpaceId externId,int queueIdx){
int semval;
sem_t * queueSemFd; sem_t * queueSemFd;
msgQueueSemId queueSemId; msgQueueSemId queueSemId;
@ -20,7 +19,7 @@ int msgQueueReadLock(msgSpaceId externId,int queueIdx){
NZG_ERROR("sem_wait",queueSemId); NZG_ERROR("sem_wait",queueSemId);
goto ERROR; goto ERROR;
} }
semval=0; int semval=0;
sem_getvalue(queueSemFd,&semval); sem_getvalue(queueSemFd,&semval);
if (DEBUG) { printf("(AfterValue:%d)\n",semval); } if (DEBUG) { printf("(AfterValue:%d)\n",semval); }

View file

@ -4,7 +4,6 @@
#define DEBUG 0 #define DEBUG 0
int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){ int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){
int semval;
sem_t * queueSemFd; sem_t * queueSemFd;
msgQueueSemId queueSemId; msgQueueSemId queueSemId;
@ -20,7 +19,7 @@ int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){
goto ERROR; goto ERROR;
} }
if (DEBUG) { printf("Locking %s\n",queueSemId); } if (DEBUG) { printf("Locking %s\n",queueSemId); }
semval=0; int semval=0;
sem_getvalue(queueSemFd,&semval); sem_getvalue(queueSemFd,&semval);
if (DEBUG) { printf("(AfterValue:%d)\n",semval); } if (DEBUG) { printf("(AfterValue:%d)\n",semval); }

View file

@ -4,7 +4,6 @@
#define DEBUG 0 #define DEBUG 0
int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){ int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){
int semval;
sem_t * queueSemFd; sem_t * queueSemFd;
msgQueueSemId queueSemId; msgQueueSemId queueSemId;
@ -20,7 +19,7 @@ int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){
NZG_ERROR("sem_post",queueSemId); NZG_ERROR("sem_post",queueSemId);
goto ERROR; goto ERROR;
} }
semval=0; int semval=0;
sem_getvalue(queueSemFd,&semval); sem_getvalue(queueSemFd,&semval);
if (DEBUG) { printf("(AfterValue:%d)\n",semval); } if (DEBUG) { printf("(AfterValue:%d)\n",semval); }

View file

@ -22,10 +22,8 @@ msgSpace * msgSpaceCreate(
/* msgSpaceList mSList; */ /* msgSpaceList mSList; */
int mSFd; // shm file descriptor int mSFd; // shm file descriptor
int i; int i;
int err;
static int mSIdNum=-1; static int mSIdNum=-1;
msgSpace * space; msgSpace * space;
msgSpaceListElemId listElemId;
msgPoolDataTabId poolDataTabId; msgPoolDataTabId poolDataTabId;
msgPoolData * poolDataTabAddr; msgPoolData * poolDataTabAddr;
@ -52,6 +50,7 @@ msgSpace * msgSpaceCreate(
NZG_ERROR("msgSpaceListLock",""); NZG_ERROR("msgSpaceListLock","");
goto ERROR; goto ERROR;
} }
int err;
if ((err=msgSpaceListFindId(externId)) < 1){ if ((err=msgSpaceListFindId(externId)) < 1){
if (err==0){ if (err==0){
// soit le msgSpace existe deja // soit le msgSpace existe deja
@ -174,6 +173,7 @@ msgSpace * msgSpaceCreate(
} }
msgPoolDataTabClose(space,poolDataTabAddr); msgPoolDataTabClose(space,poolDataTabAddr);
/* on ajoute spaceId a la liste des msgSpace connus */ /* on ajoute spaceId a la liste des msgSpace connus */
msgSpaceListElemId listElemId;
printf("spaceListInit...\n"); printf("spaceListInit...\n");
printf("ok\n"); printf("ok\n");

View file

@ -8,11 +8,11 @@ int msgPoolDataTabSemIdIntern(
msgPoolSemId destSemId,const msgSpaceId externId); msgPoolSemId destSemId,const msgSpaceId externId);
int msgSpaceDelete(msgSpaceId externId){ int msgSpaceDelete(msgSpaceId externId){
fprintf(stderr,"Deleting msgSpace with id : %s\n",externId);
//int shmId; //int shmId;
msgSpaceId nzgId; msgSpaceId nzgId;
msgSpace * space; msgSpace * space;
int i; int i;
fprintf(stderr,"Deleting msgSpace with id : %s\n",externId);
if (msgSpaceIdIntern(nzgId,externId) == -1){ if (msgSpaceIdIntern(nzgId,externId) == -1){
NZG_ERROR("msgSpaceIdIntern",externId); NZG_ERROR("msgSpaceIdIntern",externId);
goto ERROR; goto ERROR;

View file

@ -7,9 +7,8 @@ int msgSpaceListElemCreate(
msgSpace * space) msgSpace * space)
{ {
int listElemFd;
msgSpaceListElem * listElem;
msgSpaceListElemIdIntern(listElemId,space->externId); msgSpaceListElemIdIntern(listElemId,space->externId);
int listElemFd;
listElemFd=shm_open(listElemId, listElemFd=shm_open(listElemId,
O_RDWR|O_CREAT|O_EXCL|O_TRUNC, O_RDWR|O_CREAT|O_EXCL|O_TRUNC,
@ -26,6 +25,7 @@ int msgSpaceListElemCreate(
} }
close(listElemFd); close(listElemFd);
msgSpaceListElem * listElem;
listElem=msgSpaceListElemOpen(listElemId); listElem=msgSpaceListElemOpen(listElemId);
if (listElem ==NULL){ if (listElem ==NULL){
NZG_ERROR("msgSpaceListElemOpen",listElemId); NZG_ERROR("msgSpaceListElemOpen",listElemId);

View file

@ -5,11 +5,11 @@
int msgSpaceListFindId(msgSpaceId externId){ int msgSpaceListFindId(msgSpaceId externId){
msgSpaceList * list; msgSpaceList * list;
msgSpaceId spaceId; msgSpaceId spaceId;
msgSpaceIdIntern(spaceId,externId);
msgSpaceListElemId listHeadElemId; msgSpaceListElemId listHeadElemId;
msgSpaceListElemId listTailElemId; msgSpaceListElemId listTailElemId;
msgSpaceListId listId; msgSpaceListId listId;
msgSpaceIdIntern(spaceId,externId);
list=msgSpaceListOpen(); list=msgSpaceListOpen();
if (list==NULL){ if (list==NULL){
NZG_ERROR("msgSpaceListOpen",""); NZG_ERROR("msgSpaceListOpen","");

View file

@ -4,11 +4,9 @@
int msgSpaceListInit(){ int msgSpaceListInit(){
int spaceListFd; int spaceListFd;
sem_t * spaceListSemFd; sem_t * spaceListSemFd;
msgSpaceList *list;
msgSpaceListSemId spaceListSemId; msgSpaceListSemId spaceListSemId;
msgSpaceListId spaceListId; msgSpaceListId spaceListId;
strcpy(spaceListSemId,DEFAULT_MSGSPACELISTSEMID); strcpy(spaceListSemId,DEFAULT_MSGSPACELISTSEMID);
strcpy(spaceListId,DEFAULT_MSGSPACELISTID); strcpy(spaceListId,DEFAULT_MSGSPACELISTID);
@ -44,6 +42,7 @@ int msgSpaceListInit(){
} }
close(spaceListFd); close(spaceListFd);
msgSpaceList *list;
list=msgSpaceListOpen(); list=msgSpaceListOpen();
if (list == NULL){ if (list == NULL){
NZG_ERROR("msgSpaceListOpen",""); NZG_ERROR("msgSpaceListOpen","");

View file

@ -24,26 +24,21 @@ CC=gcc
CFLAGS=-Wall -O2 -ggdb CFLAGS=-Wall -O2 -ggdb
#-O2 -ggdb #-O2 -ggdb
INCLUDES=-I /usr/include/ -I ../src/ INCLUDES=-I /usr/include -I ../src/
LIBINC=-L /usr/lib -L ../src LIBINC=-L /usr/lib -L ../src
BASELIBS=-lnazgul BASELIBS=-lnazgul
LIBS=$(BASELIBS) LIBS=$(BASELIBS)
DEFS=
ifeq "HP-UX" "${OS}" ifeq "HP-UX" "${OS}"
DEFS=-D_NZG_HPUX
LIBS=$(BASELIBS) -lpthread -lrt LIBS=$(BASELIBS) -lpthread -lrt
endif endif
ifeq "SunOS" "${OS}" ifeq "SunOS" "${OS}"
DEFS=-D_NZG_SUNOS
LIBS=$(BASELIBS) -lrt LIBS=$(BASELIBS) -lrt
endif endif
ifeq "Linux" "${OS}" ifeq "Linux" "${OS}"
DEFS=-D_NZG_LINUX
LIBS=$(BASELIBS) -lrt -lpthread LIBS=$(BASELIBS) -lrt -lpthread
endif endif
@ -66,7 +61,7 @@ clean:
@rm -f $(FILES) @rm -f $(FILES)
% : %.c % : %.c
$(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS) $(DEFS) $(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS)
edit: edit:
gvim *.h *.c gvim *.h *.c

View file

@ -1,15 +1,9 @@
#ifdef _NZG_HPUX
#include <sys/wait.h>
#else
#include <wait.h> #include <wait.h>
#endif
#include "libnazgul.h" #include "libnazgul.h"
int main(void) { int main(void) {
// msgSpace mS=0; // msgSpace mS=0;
pid_t pid;
msgSpaceId testId; msgSpaceId testId;
msgSpace * mSPAC; msgSpace * mSPAC;
msgPool poolInfos[3]; msgPool poolInfos[3];
@ -26,14 +20,14 @@ int main(void) {
sprintf(testId,"test%d",(int)getuid()); sprintf(testId,"test%d",(int)getuid());
printf("RequestedId: %s\n",testId); printf("RequestedId: %s\n",testId);
printf("Void size: %d\n",(int)sizeof(void)); printf("Void size: %d\n",sizeof(void));
mSPAC=msgSpaceCreate(testId,0,3,poolInfos); mSPAC=msgSpaceCreate(testId,0,3,poolInfos);
if (mSPAC ==NULL) { if (mSPAC ==NULL) {
NZG_ERROR("msgSpaceCreate",testId); NZG_ERROR("msgSpaceCreate",testId);
exit(0); exit(0);
} }
pid=fork(); pid_t pid=fork();

View file

@ -1,9 +1,4 @@
#ifdef _NZG_HPUX
#include <sys/wait.h>
#else
#include <wait.h> #include <wait.h>
#endif
#include "libnazgul.h" #include "libnazgul.h"
void usage(char * myname){ void usage(char * myname){

View file

@ -1,9 +1,4 @@
#ifdef _NZG_HPUX
#include <sys/wait.h>
#else
#include <wait.h> #include <wait.h>
#endif
#include "libnazgul.h" #include "libnazgul.h"
int main(void) { int main(void) {
@ -22,7 +17,7 @@ int main(void) {
sprintf(testId,"test%d",(int)getuid()); sprintf(testId,"test%d",(int)getuid());
printf("RequestedId: %s\n",testId); printf("RequestedId: %s\n",testId);
printf("Void size: %d\n",(int)sizeof(void)); printf("Void size: %d\n",sizeof(void));
//creation de l'espace de messages //creation de l'espace de messages
mSPAC=msgSpaceCreate(testId,1,2,poolInfos); mSPAC=msgSpaceCreate(testId,1,2,poolInfos);
if (mSPAC ==NULL) { if (mSPAC ==NULL) {

View file

@ -1,9 +1,4 @@
#ifdef _NZG_HPUX
#include <sys/wait.h>
#else
#include <wait.h> #include <wait.h>
#endif
#include "libnazgul.h" #include "libnazgul.h"
int main(void) { int main(void) {
@ -22,7 +17,7 @@ int main(void) {
sprintf(testId,"test%d",(int)getuid()); sprintf(testId,"test%d",(int)getuid());
printf("RequestedId: %s\n",testId); printf("RequestedId: %s\n",testId);
printf("Void size: %d\n",(int)sizeof(void)); printf("Void size: %d\n",sizeof(void));
//creation de l'espace de messages //creation de l'espace de messages
mSPAC=msgSpaceCreate(testId,1,2,poolInfos); mSPAC=msgSpaceCreate(testId,1,2,poolInfos);
if (mSPAC ==NULL) { if (mSPAC ==NULL) {