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