home *** CD-ROM | disk | FTP | other *** search
- /* Some simple binary semaphore routines */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
-
- /* Set a semaphore to a particular value - meant to be used before
- * first lock/unlock */
- void
- sem_set( sem_id, val )
- int sem_id;
- int val;
- {
- union semun arg;
- extern int errno;
-
- arg.val = val;
-
- errno = 0;
- semctl( sem_id, 0, SETVAL, arg );
- if( errno != 0 ){
- perror( "internal error, sem_set" );
- exit( -1 );
- }
- }
-
- int
- new_sem()
- {
- int sem;
-
- sem = semget( IPC_PRIVATE, 1, IPC_CREAT|S_IREAD|S_IWRITE );
- if( sem < 0 ){
- perror( "internal error, couldn't create semaphore" );
- exit( -1 );
- }
- sem_set( sem, 1 );
-
- return sem;
- }
-
- void
- lock( sem_id )
- int sem_id;
- {
- struct sembuf sembuf;
-
- sembuf.sem_num = 0;
- sembuf.sem_op = -1;
- sembuf.sem_flg = 0;
-
- if( semop( sem_id, &sembuf, 1 ) == -1 ){
- fprintf( stderr, "internal error, lock id %d\n", sem_id );
- perror( "lock error" );
- exit( -1 );
- }
- }
-
- void
- unlock( sem_id )
- int sem_id;
- {
- struct sembuf sembuf;
-
- sembuf.sem_num = 0;
- sembuf.sem_op = 1;
- sembuf.sem_flg = 0;
-
- if( semop( sem_id, &sembuf, 1 ) == -1 ){
- fprintf( stderr, "internal error, lock id %d\n", sem_id );
- perror( "unlock error" );
- exit( -1 );
- }
- }
-
- void
- remove_sem( sem_id )
- int sem_id;
- {
- if( sem_id == -1 )
- return;
-
- if( semctl( sem_id, 0, IPC_RMID, NULL ) == -1 )
- perror( "internal error, failed to remove semaphore" );
- }
-