*
* Author: S. Piccardi
*
- * $Id: wrappers.h,v 1.3 2002/08/18 23:24:44 piccardi Exp $
+ * $Id: wrappers.h,v 1.4 2002/11/20 23:34:02 piccardi Exp $
*
***************************************************************/
#include <sys/sem.h> /* IPC semaphore declarations */
};
#endif
/*
- * Define the sem_lock and sem_ulock sembuf structures to
- * lock and unlock the semaphore (used to implement a mutex)
- */
-struct sembuf sem_lock={ /* to lock semaphore */
- 0, /* semaphore number (only one so 0) */
- -1, /* semaphore operation (-1 to use resource) */
- 0}; /* semaphore flag (in this case 0) */
-struct sembuf sem_ulock={ /* to unlock semaphore */
- 0, /* semaphore number (only one so 0) */
- 1, /* semaphore operation (-1 to release resource) */
- 0}; /* semaphore flag (in this case 0) */
-/*
- * Function MutexLock:
- * to lock a mutex/semaphore
- *
- * Input: a semaphore id #
- */
-inline void MutexLock(int sem_id)
-{
- if (semop(sem_id,&sem_lock,1)) {
- perror("Cannot lock the semaphore");
- exit(1);
- }
-}
-/*
- * Function MutexUnlock
- * to unlock a mutex/semaphore
+ * Function MutexCreate: create a mutex/semaphore
*
- * Input: a semaphore id #
- */
-inline void MutexUnlock(int sem_id)
-{
- if (semop(sem_id,&sem_ulock,1)) {
- perror("Cannot unlock the semaphore");
- exit(1);
- }
-}
-/*
- * Function MutexCreate:
* First call create a semaphore, using the given key.
* We want only one semaphore so we set second argument to 1; third
* parameter is the flag argument, and is set to create a semaphore
* Second call initialize the semaphore to 1 (unlocked)
*
* Input: an IPC key value (to create an unique semaphore)
- * Return: the semaphore id#
+ * Return: the semaphore id# or -1 on error
*/
-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);
+ const union semun semunion={1}; /* semaphore union structure */
+ int sem_id, ret;
+ sem_id = semget(ipc_key, 1, IPC_CREAT|0666); /* get semaphore ID */
+ if (sem_id == -1) { /* if error return code */
+ return sem_id;
}
- if ( (semctl(sem_id,0,SETVAL,semunion)) < 0 ) {
- perror("cannot init semaphore"); /* <0 is an error */
- printf("on semid=%d",sem_id);
- exit(1);
+ ret = semctl(sem_id, 0, SETVAL, semunion); /* init semaphore */
+ if (ret == -1) {
+ return ret;
}
return sem_id;
}
/*
- * Find Mutex
- * get the semaphore/mutex Id given the IPC key value
+ * Function MutexFind: 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;
+ return semget(ipc_key,1,0);
}
/*
- * Function MutexRead:
- * Read the current value of the mutex/semaphore
+ * Function MutexRead: read the current value of the mutex/semaphore
*
* Input: a semaphore id #
* Return: the semaphore value
*/
inline int MutexRead(int sem_id)
{
- int value;
- if ( (value=semctl(sem_id,0,GETVAL,semunion)) < 0 ) {
- perror("cannot read semaphore"); /* a <0 is an error */
- printf("on semid=%d\n",sem_id);
- exit(1);
- }
- return value;
+ return semctl(sem_id, 0, GETVAL);
+}
+/*
+ * Define sembuf structures to lock and unlock the semaphore
+ * (used to implement a mutex)
+ */
+struct sembuf sem_lock={ /* to lock semaphore */
+ 0, /* semaphore number (only one so 0) */
+ -1, /* operation (-1 to use resource) */
+ SEM_UNDO}; /* flag (set for undo at exit) */
+struct sembuf sem_ulock={ /* to unlock semaphore */
+ 0, /* semaphore number (only one so 0) */
+ 1, /* operation (1 to release resource) */
+ SEM_UNO}; /* flag (in this case 0) */
+/*
+ * Function MutexLock: to lock a mutex/semaphore
+ *
+ * Input: a semaphore id #
+ * Output: semop return code (0 OK, -1 KO)
+ */
+inline int MutexLock(int sem_id)
+{
+ return semop(sem_id, &sem_lock, 1);
+}
+/*
+ * Function MutexUnlock: to unlock a mutex/semaphore
+ *
+ * Input: a semaphore id #
+ * Return: semop return code (0 OK, -1 KO)
+ */
+inline int MutexUnlock(int sem_id)
+{
+ return semop(sem_id, &sem_ulock, 1);
}
/*
* Function ShmCreate: