Update documentation & fix POSIX-related issues
This commit is contained in:
parent
fc1cb56d19
commit
198cf8fe78
32 changed files with 223 additions and 145 deletions
|
@ -8,19 +8,18 @@ Libnazgul/
|
||||||
|-- Makefile // Règles de compilation
|
|-- Makefile // Règles de compilation
|
||||||
|-- doc/
|
|-- doc/
|
||||||
| |-- ennonce // Enoncé du projet en format postscript
|
| |-- ennonce // Enoncé du projet en format postscript
|
||||||
| |-- rapport/ // Rapport Latex
|
| `-- rapport/ // Rapport Latex
|
||||||
| |-- Makefile // Règles de compilation
|
| |-- Makefile // Règles de compilation
|
||||||
| |-- ...
|
| `-- ...
|
||||||
|
|
|
|
||||||
|--test
|
|--test
|
||||||
| |-- Makefile // Règles de compilation
|
| |-- Makefile // Règles de compilation
|
||||||
| |-- create_delete // Le main de la fonction
|
| |-- create_delete // Le main de la fonction
|
||||||
| |-- put_get_mono // Test avec un seul processus
|
| `-- *.c // Programmes de test
|
||||||
| |-- put_get_multi // Test avec plusieurs processus
|
|
||||||
|
|
|
|
||||||
|
|
`-- src/ // Sources de la bibliothèque
|
||||||
|-- src/ // Sources de la bibliothèque
|
|
||||||
|-- Makefile // Règles de compilation
|
|-- Makefile // Règles de compilation
|
||||||
|-- ...
|
|-- *.h // En-têtes pour l'utilisation de Libnazgul
|
||||||
|
`-- *.c // Sources de Libnazgul
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
|
@ -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
|
\par Nous avons fini le projet, mais il n'est certainement pas exempt
|
||||||
sans défauts. C'est pourquoi dans l'avenir, il faudrai corriger les
|
de bugs et d'autres défauts.
|
||||||
bogues éventuels que tous nos tests n'auraient pas fait appara{\^i}tre.
|
C'est pourquoi dans l'avenir, il faudrai corriger les bogues éventuels que
|
||||||
Mais il n'y a pas que cela; le ``code'' pourrai {\^e}tre amélioré et
|
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).
|
||||||
allégé. Nous pourrions également faire plus ``subtil'' par endroits.
|
|
||||||
Nous devrions aussi vérifier tous les codes d'erreurs renvoyés par les
|
\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.
|
||||||
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
|
\par Il serait également possible de faire en sorte d'utiliser moins de
|
||||||
cela il faudrai changer de structure de donnée. Nous aimerions également
|
mémoire en réduisant le nombre de segment de mémoire partagée, mais pour
|
||||||
finir l'outil d'analyse {\em msgSpaceState} des {\em msgSpace}.
|
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.
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
\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 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}
|
\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.
|
\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
|
Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir compiler et tester
|
||||||
tester la bibliothèque dans les meilleures conditions, car sous
|
la bibliothèque dans de meilleurs conditions que sous son système initial\ldots
|
||||||
Microsoft Windows l'utilisateur n'est pas prévenu des
|
|
||||||
{\em segmentation fault} et autres erreurs système.
|
|
||||||
|
|
||||||
|
|
||||||
\section{Programmation}
|
\section{Programmation}
|
||||||
|
@ -28,48 +28,63 @@ 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{\sc msgBuffer*} Ce sont toutes les fonctions qui concernent les
|
\item[msgBuffer*]{Ce sont toutes les fonctions qui concernent les
|
||||||
buffers : comment on les créés, les ``attachent'' aux processus.
|
buffers : création, attachement aux processus\ldots}
|
||||||
\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
|
|
||||||
correspond à un ensemble de {\em buffers}.
|
\item[msgPool*]{Fonctions servant à gérer une {\em pool}, qui
|
||||||
\item{\sc msgPoolDataTab*} Fonctions utiles pour la gestion des
|
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},
|
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
|
|
||||||
trouve celle qui en créé une, celles qui vérifient si elle est
|
\item[msgQueue*]{Toutes les fonctions gérant les ``queues'', {\em
|
||||||
disponible ou pas, celles qui ajoutent un élément ou au contraire en
|
files de messages}. On y trouve celle qui en créé une, celles i
|
||||||
enlève un.
|
qui vérifient si elle est disponible ou pas, celles qui ajoutent
|
||||||
|
un élément ou au contraire en enlève un.
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item{\sc msgQueue*} Rassemble toutes les fonctions servant à la gestion
|
\item[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
|
|
||||||
d'une file de messages.
|
\item[msgQueueElem*]{ Les fonctions utiles pour gérer un élément
|
||||||
\item{\sc msgQueue(Prot/Read)*} Fonctions servant à protéger une file.
|
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}
|
\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{\sc msgSpace*} Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages.
|
\item[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[msgSpaceList*]{Ce sont toutes les fonctions utiles pour la
|
||||||
\item{\sc msgSpaceListElem*} Fonctions correspondant à la gestion d'un
|
gestion de la liste cha{\^i}née des {\em msgSpace} existants.}
|
||||||
é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
|
||||||
|
@ -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
|
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}
|
||||||
|
|
||||||
\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
|
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. Il a donc
|
seulement un segment de mémoire partagée en commun.
|
||||||
fallu utiliser les différentes {\em id} des espaces de messages {\em msgSpace}, ou
|
\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}
|
||||||
encore des {\em pools} pour pouvoir faire en sorte que les processus peuvent
|
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.
|
||||||
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. Par
|
fallait en changer en fonction des différentes implémentations de POSIX.
|
||||||
exemple nous pouvions avoir des identifiants du type ``\verb+/tmp/identifiant+'',
|
En effet la norme POSIX précise que l'identifiant doit commencer par un ``\verb+/+'' et si possible ne pas en comporter d'autres.
|
||||||
qui ne marchaient que sur un type de machines. Sur les autres il
|
\par Si cela est vrai sur certains systèmes (comme GNU/Linux) d'autres
|
||||||
fallait en avoir un du type ``\verb+/identifiant+''. Cela nous a amener
|
systemes (HP-UX, SunOS) requièrent que cet identifiant corresponde
|
||||||
à faire une distinction de cas et générer un identifiant différent
|
au chemin absolu (dans l'arborescence UNIX) d'un fichier sur lequel
|
||||||
selon que l'on soit sur une machine de type {\em HP-UX}, {\em SunOS}
|
on possède des droits\ldots
|
||||||
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
|
||||||
fonctionner convenablement.
|
compiler et 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
|
\par La seconde difficulté liée à POSIX, est la projection de fichier
|
||||||
projection de fichier ou {\em mapping} avec {\em mmap}. L'offset
|
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
|
||||||
peut {\^e}tre aligné sur les pages mémoires sur
|
\par Ceci est assez génant lorsque l'on veut accéder à bloc de donnée
|
||||||
certains systèmes. Or ceci est emb{\^e}tant lorsque l'on veut
|
qui peut commencer n'importe où dans la zone de mémoire partagée.
|
||||||
accéder à un fichier qui commence n'importe où dans le bloc mémoire.
|
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.
|
||||||
Pour remédier à cela, nous {\em mappons} jusqu'à ``juste derrière le
|
\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.
|
||||||
buffer''. Nous autorisons le buffer en lecture/écriture et nous déplaçons
|
\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é.
|
||||||
l'adresse obtenue au début du buffer.
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
\chapter{À propos du projet}
|
\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
|
\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,
|
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.
|
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}
|
\section{Les objectifs}
|
||||||
\par L'objectif de ce projet est de réaliser une bibliothèque permettant
|
\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
|
à 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
|
||||||
faire la recopie de ces messages dans l'espace d'adressage du noyau.
|
d'adressage du noyau.
|
||||||
\par Nous devions donc mettre en oeuvre les techniques de la programmation
|
\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}
|
\section{Obtenir l'archive du projet}
|
||||||
|
|
||||||
|
@ -38,6 +39,6 @@ et son adresse est :
|
||||||
\newline
|
\newline
|
||||||
{\url{http://www.sourceforge.net/projects/libnazgul/}}.
|
{\url{http://www.sourceforge.net/projects/libnazgul/}}.
|
||||||
\par Ce site vous permettra de télécharger le projet, d'en avoir
|
\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
|
\newpage
|
||||||
|
|
|
@ -1,17 +1,30 @@
|
||||||
\chapter{Manuel d'utilisation}
|
\chapter{Manuel d'utilisation}
|
||||||
|
|
||||||
\section{Que faire de nos sources? \ldots les compiler}
|
\section{Que faire de nos sources?}
|
||||||
|
|
||||||
%\subsection{Les compiler}
|
%\subsection{Les compiler}
|
||||||
|
|
||||||
\par Pour pouvoir utiliser notre bibliotèque, il faut commencer par la
|
\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
|
compiler. Pour cela placez-vous dans le répertoire racine de l'archive (noté ici
|
||||||
\verb+/+) ou dans le sous-répertoire \verb+src/+ et tapez ``\verb+make+''.
|
\verb+/+) ou dans son sous-répertoire \verb+src/+
|
||||||
|
|
||||||
\section{Que faire ensuite? \ldots inclure notre bibliothèque}
|
et tapez ``\verb+make+''. Cela compilera la bibliothèque
|
||||||
%\subsection{Inclure notre bibliothèque dans un programme}
|
(fichier \verb+libnazgul.a+) ainsi que les divers programmes de test dans
|
||||||
|
l'archive.
|
||||||
|
|
||||||
\par Dans votre programme, si vous voulez utiliser notre bibliothèque
|
\section{Comment utiliser Libnazgul ?}
|
||||||
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
|
\par Une fois le projet compilé (voir ci-dessus), vous il vous est possible
|
||||||
appeler les fonctions contenues à l'intérieur : {\it msgSpaceCreate(\ldots), msgPut(\ldots), msgFree(\ldots) etc\dots}
|
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}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
%--------------------------------------------------------------
|
%--------------------------------------------------------------
|
||||||
\pagestyle{fancy}
|
\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{}}
|
\lhead[\it{}]{\it{}}
|
||||||
%\rhead[\it{Projet de Système.}]{\it{Projet de Système.}}
|
%\rhead[\it{Projet de Système.}]{\it{Projet de Système.}}
|
||||||
|
|
||||||
|
|
|
@ -33,10 +33,11 @@ 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
|
DEFINES:=-D_NZG_REALFILEID -D_NZG_SUNOS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "HP-UX" "${OS}"
|
ifeq "HP-UX" "${OS}"
|
||||||
|
|
|
@ -15,6 +15,7 @@ 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
|
||||||
|
@ -183,7 +184,6 @@ 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);
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ 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;
|
||||||
|
@ -29,7 +30,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 */
|
||||||
int bIdx=0;
|
bIdx=0;
|
||||||
while((!found) && bIdx<bufferInfoNb){
|
while((!found) && bIdx<bufferInfoNb){
|
||||||
if (bufferInfoTabAddr[bIdx].addr == addr){
|
if (bufferInfoTabAddr[bIdx].addr == addr){
|
||||||
found=true;
|
found=true;
|
||||||
|
|
19
src/free.c
19
src/free.c
|
@ -1,14 +1,18 @@
|
||||||
#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;
|
||||||
/* on acquiert le droit de modifier les infos sur la ressource */
|
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 protege le tableau des associations */
|
/* on protege le tableau des associations */
|
||||||
if (msgPoolDataTabLock(space) <0){
|
if (msgPoolDataTabLock(space) <0){
|
||||||
NZG_ERROR("msgPoolDataTabLock",space->poolDataTabSemId);
|
NZG_ERROR("msgPoolDataTabLock",space->poolDataTabSemId);
|
||||||
|
@ -20,7 +24,6 @@ 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(
|
||||||
|
@ -36,16 +39,16 @@ int msgFree(msgSpace * space, void * addr){
|
||||||
msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr);
|
msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr);
|
||||||
|
|
||||||
/* unmapper le buffer */
|
/* unmapper le buffer */
|
||||||
void * realAddr=addr;
|
realAddr=addr;
|
||||||
int bufferSize=poolDataTabAddr[poolIndex].bufferSize;
|
bufferSize=poolDataTabAddr[poolIndex].bufferSize;
|
||||||
int bufferNb=poolDataTabAddr[poolIndex].bufferNb;
|
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);
|
||||||
|
|
|
@ -8,6 +8,7 @@ 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){
|
||||||
|
@ -39,7 +40,6 @@ 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);
|
||||||
|
|
|
@ -26,6 +26,11 @@
|
||||||
#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
|
||||||
|
|
|
@ -4,10 +4,12 @@
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
int msgPoolDataTabLock(msgSpace * space){
|
int msgPoolDataTabLock(msgSpace * space){
|
||||||
|
int semval;
|
||||||
sem_t * poolDataTabSemFd;
|
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
|
space->poolDataTabSemId
|
||||||
,O_CREAT,
|
,O_CREAT,
|
||||||
SEM_DEFAULT_MODE,
|
SEM_DEFAULT_MODE,
|
||||||
|
@ -21,9 +23,9 @@ if (DEBUG) {printf("Locking %s\n",space->poolDataTabSemId);}
|
||||||
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);}
|
||||||
|
|
||||||
sem_close(poolDataTabSemFd);
|
sem_close(poolDataTabSemFd);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#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(
|
||||||
|
@ -20,7 +21,8 @@ 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); }
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,10 @@ int msgPut(msgSpace * space,int queueIndex, void * addr){
|
||||||
int poolIndex;
|
int poolIndex;
|
||||||
int bufferIndex;
|
int bufferIndex;
|
||||||
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);
|
||||||
|
@ -24,8 +26,6 @@ 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);
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
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);
|
||||||
|
@ -15,8 +17,6 @@ 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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#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;
|
||||||
|
|
||||||
|
@ -18,13 +19,11 @@ int msgQueueProtLock(msgSpaceId externId,int queueIdx){
|
||||||
NZG_ERROR("sem_wait",queueSemId);
|
NZG_ERROR("sem_wait",queueSemId);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
int semval=0;
|
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;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#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;
|
||||||
|
|
||||||
|
@ -20,7 +21,7 @@ int msgQueueProtUnlock(msgSpaceId externId,int queueIdx){
|
||||||
NZG_ERROR("sem_post",queueSemId);
|
NZG_ERROR("sem_post",queueSemId);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
int semval=0;
|
semval=0;
|
||||||
sem_getvalue(queueSemFd,&semval);
|
sem_getvalue(queueSemFd,&semval);
|
||||||
if (DEBUG) { printf("(AfterValue:%d)\n",semval); }
|
if (DEBUG) { printf("(AfterValue:%d)\n",semval); }
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#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;
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ int msgQueueReadLock(msgSpaceId externId,int queueIdx){
|
||||||
NZG_ERROR("sem_wait",queueSemId);
|
NZG_ERROR("sem_wait",queueSemId);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
int semval=0;
|
semval=0;
|
||||||
sem_getvalue(queueSemFd,&semval);
|
sem_getvalue(queueSemFd,&semval);
|
||||||
if (DEBUG) { printf("(AfterValue:%d)\n",semval); }
|
if (DEBUG) { printf("(AfterValue:%d)\n",semval); }
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#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;
|
||||||
|
|
||||||
|
@ -19,9 +20,9 @@ int msgQueueReadTryLock(msgSpaceId externId,int queueIdx){
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
if (DEBUG) { printf("Locking %s\n",queueSemId); }
|
if (DEBUG) { printf("Locking %s\n",queueSemId); }
|
||||||
int semval=0;
|
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);
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){
|
int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){
|
||||||
sem_t * queueSemFd;
|
int semval;
|
||||||
|
sem_t * queueSemFd;
|
||||||
msgQueueSemId queueSemId;
|
msgQueueSemId queueSemId;
|
||||||
|
|
||||||
msgQueueReadSemIdIntern(queueSemId,externId,queueIdx);
|
msgQueueReadSemIdIntern(queueSemId,externId,queueIdx);
|
||||||
if (DEBUG) { printf("Unlocking %s\n",queueSemId); }
|
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){
|
if(queueSemFd==SEM_FAILED){
|
||||||
NZG_ERROR("sem_open",queueSemId);
|
NZG_ERROR("sem_open",queueSemId);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
|
@ -19,9 +20,9 @@ int msgQueueReadUnlock(msgSpaceId externId,int queueIdx){
|
||||||
NZG_ERROR("sem_post",queueSemId);
|
NZG_ERROR("sem_post",queueSemId);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
int semval=0;
|
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);
|
||||||
|
|
|
@ -22,8 +22,10 @@ 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;
|
||||||
|
@ -50,7 +52,6 @@ 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
|
||||||
|
@ -173,7 +174,6 @@ 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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -7,8 +7,9 @@ int msgSpaceListElemCreate(
|
||||||
msgSpace * space)
|
msgSpace * space)
|
||||||
{
|
{
|
||||||
|
|
||||||
msgSpaceListElemIdIntern(listElemId,space->externId);
|
|
||||||
int listElemFd;
|
int listElemFd;
|
||||||
|
msgSpaceListElem * listElem;
|
||||||
|
msgSpaceListElemIdIntern(listElemId,space->externId);
|
||||||
|
|
||||||
listElemFd=shm_open(listElemId,
|
listElemFd=shm_open(listElemId,
|
||||||
O_RDWR|O_CREAT|O_EXCL|O_TRUNC,
|
O_RDWR|O_CREAT|O_EXCL|O_TRUNC,
|
||||||
|
@ -25,7 +26,6 @@ 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);
|
||||||
|
|
|
@ -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","");
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
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);
|
||||||
|
|
||||||
|
@ -42,7 +44,6 @@ int msgSpaceListInit(){
|
||||||
}
|
}
|
||||||
close(spaceListFd);
|
close(spaceListFd);
|
||||||
|
|
||||||
msgSpaceList *list;
|
|
||||||
list=msgSpaceListOpen();
|
list=msgSpaceListOpen();
|
||||||
if (list == NULL){
|
if (list == NULL){
|
||||||
NZG_ERROR("msgSpaceListOpen","");
|
NZG_ERROR("msgSpaceListOpen","");
|
||||||
|
@ -65,7 +66,7 @@ int msgSpaceListInit(){
|
||||||
ERROR:
|
ERROR:
|
||||||
return -1;
|
return -1;
|
||||||
EXISTING:
|
EXISTING:
|
||||||
if (msgSpaceListUnlock() < 0){
|
if (msgSpaceListUnlock() < 0){
|
||||||
NZG_ERROR("msgSpaceListUnlock","");
|
NZG_ERROR("msgSpaceListUnlock","");
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,21 +24,26 @@ 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
|
||||||
|
|
||||||
|
@ -61,5 +66,5 @@ clean:
|
||||||
@rm -f $(FILES)
|
@rm -f $(FILES)
|
||||||
|
|
||||||
% : %.c
|
% : %.c
|
||||||
$(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS)
|
$(CC) -o $* $< $(INCLUDES) $(LIBINC) $(LIBS) $(CFLAGS) $(DEFS)
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
|
#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];
|
||||||
|
@ -20,14 +26,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",sizeof(void));
|
printf("Void size: %d\n",(int)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_t pid=fork();
|
pid=fork();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
|
#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){
|
||||||
|
|
|
@ -1,4 +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) {
|
||||||
|
@ -17,7 +22,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",sizeof(void));
|
printf("Void size: %d\n",(int)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) {
|
||||||
|
|
|
@ -1,4 +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) {
|
||||||
|
@ -17,7 +22,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",sizeof(void));
|
printf("Void size: %d\n",(int)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) {
|
||||||
|
|
Loading…
Reference in a new issue