612  

pthread_condattr_t psharedc;

fd = open(semaphore_name, 0_RDWR | 0_CREAT | 0_EXCL, 0666);

if (fd <0)

return (NULL) ;

(void) ftruncate (fd, sizeof (semaphore_t));

(void) pthread_mutexattr_init (&psharedm) ;

(void) pthread_mutexattr_setpshared(&psharedm,

PTHREAD_PROCESS_SHARED) ;

(void) pthread_condattr_init (&psharedc) ;

(void) pthread_condattr_setpshared (&psharedc,

PTHREAD_PROCESS_SHARED) ;

semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t),
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);

close (fd) ;

(void) pthread_mutex_init (&semap->lock, &psharedm) ;

(void) pthread_cond_init (&semap->nonzero, &psharedc) ;

semap->count = 0;

return (semap) ;

}

semaphore_t *

semaphore_open (char *semaphore_name)

{

int fd;

semaphore_t *semap;

fd = open (semaphore_name, 0_RDWR, 0666);

if (fd <0)

return (NULL) ;

semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t),
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0) ;

close (fd) ;

return (semap) ;

}

void

semaphore_post (semaphore_t *semap)

{

pthread_mutex_lock (&semap->lock) ;

if (semap->count == 0)

pthread_cond_signal (&semapx->nonzero) ;

semap->count++ ;

pthread_mutex_unlock (&semap->lock) ;

}

void

semaphore_wait (semaphore_t *semap)

{