xref: /openbsd-src/regress/lib/libpthread/semaphore/sem_destroy/sem_destroy.c (revision 3fbe19a47e48fbca381ff3c959a0c6669579f479)
1*3fbe19a4Smpi /*	$OpenBSD: sem_destroy.c,v 1.1.1.1 2012/01/04 17:36:40 mpi Exp $	*/
2*3fbe19a4Smpi /*
3*3fbe19a4Smpi  * Martin Pieuchot <mpi@openbsd.org>, 2011. Public Domain.
4*3fbe19a4Smpi  */
5*3fbe19a4Smpi 
6*3fbe19a4Smpi #include <errno.h>
7*3fbe19a4Smpi #include <unistd.h>
8*3fbe19a4Smpi #include <pthread.h>
9*3fbe19a4Smpi #include <semaphore.h>
10*3fbe19a4Smpi #include "test.h"
11*3fbe19a4Smpi 
12*3fbe19a4Smpi int val;
13*3fbe19a4Smpi sem_t cons_sem;
14*3fbe19a4Smpi sem_t prod_sem;
15*3fbe19a4Smpi 
16*3fbe19a4Smpi void *producer(void *arg);
17*3fbe19a4Smpi void *consumer(void *arg);
18*3fbe19a4Smpi 
19*3fbe19a4Smpi int
main(int argc,char ** argv)20*3fbe19a4Smpi main(int argc, char **argv)
21*3fbe19a4Smpi {
22*3fbe19a4Smpi 	pthread_t prod_th, cons_th;
23*3fbe19a4Smpi 	long counter = 4;
24*3fbe19a4Smpi 
25*3fbe19a4Smpi 	CHECKn(sem_destroy(&cons_sem));
26*3fbe19a4Smpi 	ASSERT(errno == EINVAL);
27*3fbe19a4Smpi 
28*3fbe19a4Smpi 	val = 0;
29*3fbe19a4Smpi 
30*3fbe19a4Smpi 	CHECKr(sem_init(&cons_sem, 0, 0));
31*3fbe19a4Smpi 	CHECKr(sem_init(&prod_sem, 0, 1));
32*3fbe19a4Smpi 
33*3fbe19a4Smpi 	CHECKr(pthread_create(&prod_th, NULL, producer, &counter));
34*3fbe19a4Smpi 	CHECKr(pthread_create(&cons_th, NULL, consumer, &counter));
35*3fbe19a4Smpi 
36*3fbe19a4Smpi 	CHECKr(pthread_join(prod_th, NULL));
37*3fbe19a4Smpi 	CHECKr(pthread_join(cons_th, NULL));
38*3fbe19a4Smpi 
39*3fbe19a4Smpi 	pthread_exit(NULL);
40*3fbe19a4Smpi 
41*3fbe19a4Smpi 	CHECKr(sem_destroy(&prod_sem));
42*3fbe19a4Smpi 	CHECKr(sem_destroy(&cons_sem));
43*3fbe19a4Smpi 
44*3fbe19a4Smpi 	SUCCEED;
45*3fbe19a4Smpi }
46*3fbe19a4Smpi 
47*3fbe19a4Smpi void *
producer(void * arg)48*3fbe19a4Smpi producer(void *arg)
49*3fbe19a4Smpi {
50*3fbe19a4Smpi 	long *counter = arg;
51*3fbe19a4Smpi 	int i;
52*3fbe19a4Smpi 
53*3fbe19a4Smpi 	for (i = 0; i < *counter; i++) {
54*3fbe19a4Smpi 		sem_wait(&prod_sem);
55*3fbe19a4Smpi 		val++;
56*3fbe19a4Smpi 		sem_post(&cons_sem);
57*3fbe19a4Smpi 	}
58*3fbe19a4Smpi 
59*3fbe19a4Smpi 	return (NULL);
60*3fbe19a4Smpi }
61*3fbe19a4Smpi 
62*3fbe19a4Smpi void *
consumer(void * arg)63*3fbe19a4Smpi consumer(void *arg)
64*3fbe19a4Smpi {
65*3fbe19a4Smpi 	long *counter = arg;
66*3fbe19a4Smpi 	int i;
67*3fbe19a4Smpi 
68*3fbe19a4Smpi 	for (i = 0; i < *counter; i++) {
69*3fbe19a4Smpi 		sem_wait(&cons_sem);
70*3fbe19a4Smpi 		val--;
71*3fbe19a4Smpi 		sem_post(&prod_sem);
72*3fbe19a4Smpi 	}
73*3fbe19a4Smpi 
74*3fbe19a4Smpi 	return (NULL);
75*3fbe19a4Smpi }
76