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