nrelease: Clean up a bit the 'clean' target
[dragonfly.git] / test / testcases / threads / umtx_errno / umtx_errno.c
blob25031dc8f20a337ebb7f2fe2f7d0f38e8b924c28
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <sys/types.h>
5 #include <dirent.h>
6 #include <errno.h>
7 #include <unistd.h>
9 pthread_barrier_t bar;
12 void* tester(void *arg)
14 struct dirent en, *enp;
15 DIR *d = opendir("/");
16 int r;
18 if (d == NULL) {
19 perror("opendir() failed");
20 return NULL;
23 pthread_barrier_wait(&bar);
25 do {
26 r = readdir_r(d, &en, &enp);
27 if (errno != 0)
29 perror("thread tester error");
30 exit(2);
31 break;
33 } while (enp != NULL);
35 closedir(d);
38 void* checker(void *arg)
40 pthread_barrier_wait(&bar);
41 printf("Passed barrier!\n");
45 int main(int argc, char *argv[])
47 int i, ret, nthreads;
48 pthread_t *threads;
49 pthread_t th;
51 if (argc <= 1)
53 printf("Need one argument\n");
54 exit(1);
57 nthreads = atoi(argv[1]);
58 threads = malloc(sizeof(pthread_t) * (nthreads + 1));
59 if (threads == NULL) {
60 fprintf(stderr, "malloc failed!\n");
61 exit(3);
64 printf("Trying with %d threads\n", nthreads);
66 if ( (ret = pthread_barrier_init(&bar, NULL, nthreads + 1)) != 0)
68 printf("error occurred during pthread_barrier_init, ret = %d\n", ret);
69 perror("Or: ");
70 exit(1);
73 printf("Creating checker thread\n");
74 pthread_create(&th, NULL, checker, NULL);
76 printf("Creating tester threads\n");
79 for (i = 0; i < nthreads; i++) {
80 ret = pthread_create(&threads[i], NULL, tester, NULL);
81 if (ret != 0)
82 threads[i] = 0;
85 //sleep(5);
87 printf("Starting join\n");
88 for (i = 0; i < nthreads; i++) {
89 if (threads[i] != 0)
90 pthread_join(threads[i], NULL);
93 printf("All done!\n");
94 return 0;