Funzione di creazione e ricerca del mutex
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index 9b04f516ff264eea8f358a29be2d5e1917aa3d0f..1060b49d15190a352d62cf3ed23acce734c7e64a 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -2440,7 +2440,87 @@ ignorare silenziosamente le altre; questo per
 ripristino non è comunque garantito in tutte le occasioni.
 
 Come esempio di uso dell'interfaccia dei semafori vediamo come implementare
-con essa dei semplici \textit{mutex} (cioè semafori binari), 
+con essa dei semplici \textit{mutex} (cioè semafori binari), tutte le funzioni
+relative sono definite come \ctyp{inline}\footnote{la direttiva \func{inline}
+  viene usata per dire al compilatore di non trattare la funzione cui essa fa
+  riferimento come una funzione, ma di inserire il codice direttamente nel
+  testo del programma. Anche se i compilatori più moderni sono in grado di
+  effettuare da soli queste manipolazioni (impostando le opportune
+  ottimizzazioni) questa è una tecnica usata per migliorare le prestazioni per
+  le funzioni piccole ed usate di frequente, in tal caso infatti le istruzioni
+  per creare un nuovo frame nello stack per chiamare la funzione
+  costituirebbero una parte rilevante del codice, appesantendo inutilmente il
+  programma. Originariamente questa era fatto utilizzando delle macro, ma
+  queste hanno tutta una serie di problemi di sintassi nel passaggio degli
+  argomenti (si veda ad esempio \cite[oullaine]) che in questo modo possono
+  essere evitati.} nel file \file{wrappers.h}. In
+\secref{fig:ipc_mutex_create} si è riportata la definizione delle due funzioni
+che permettono di acquisire il \textit{mutex}; la prima è \func{MutexCreate}
+che crea il semaforo usato per il mutex e lo inizializza, restituendone
+l'identificatore; la seconda è \func{MutexFind}, che data una chiave
+restitituisce l'identificatore del semaforo ad essa associato.
+
+\begin{figure}[!bht]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}{}
+/*
+ * Function MutexCreate:
+ *
+ * Input: an IPC key value (to create an unique semaphore)
+ * Return: the semaphore id#
+ */
+const union semun semunion={1};    /* semaphore union structure */
+inline int MutexCreate(key_t ipc_key) 
+{
+    int sem_id;
+    if( (sem_id=semget(ipc_key,1,IPC_CREAT|0666))<0 ){ /* get sem ID */
+        perror("cannot create semaphore");     /* a sem_id <0 is an error */
+        printf("semid=%d",sem_id);
+        exit(1);
+    }
+    if ( (semctl(sem_id,0,SETVAL,semunion)) < 0 ) {
+        perror("cannot init semaphore");       /* <0 is an error */
+        printf("on semid=%d",sem_id);
+        exit(1);
+    }
+    return sem_id;
+}
+/*
+ * Find Mutex
+ * get the semaphore/mutex Id given the IPC key value
+ *
+ * Input: an IPC key value
+ */
+inline int MutexFind(key_t ipc_key) 
+{
+    int sem_id;
+    if( (sem_id=semget(ipc_key,1,0))<0 ){       /* find sem .ID */
+        perror("cannot find semaphore");
+        exit(1);
+    }
+    return sem_id;
+}
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{Il codice delle funzioni che permettono di creare o recuperare
+    l'identificatore di un semaforo da utilizzare come \textit{mutex}.}
+  \label{fig:ipc_mutex_create}
+\end{figure}
+
+
+La prima funzione definita (\texttt{\small 8--22}) è \func{MutexCreate},
+anzitutto (\texttt{\small 11--15}) si chiama \func{semget} con
+\macro{IPC\_CREATE} per creare il semaforo qualora non esista, assegnandogli i
+privilegi di lettura e scrittura per l'utente. In caso di errore si
+scrive un errore e si esce. 
+
+
+
+
+
+