some pthread test progs
[tridge/junkcode.git] / pthreads / tls.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <errno.h>
7 #include <pthread.h>
8
9 /*
10   create a thread with initial function fn(private)
11 */
12 static int thread_start(void *(*fn)(void *private), void *private)
13 {
14         pthread_t thread_id;
15         pthread_attr_t thread_attr;
16         int rc;
17
18         pthread_attr_init(&thread_attr);
19         pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
20         rc = pthread_create(&thread_id, &thread_attr, fn, private);
21         pthread_attr_destroy(&thread_attr);
22         return rc;
23 }
24
25 static __thread int tls;
26 static int non_tls;
27
28 /*
29   main thread fn
30 */
31 static void *thread_main(void *private)
32 {
33         tls++;
34         non_tls++;
35         printf("tls=%d non_tls=%d\n", tls, non_tls);
36         return NULL;
37 }
38
39 /* lock a byte range in a open file */
40 int main(int argc, char *argv[])
41 {
42         thread_start(thread_main, NULL);
43         thread_start(thread_main, NULL);
44         thread_start(thread_main, NULL);
45         thread_start(thread_main, NULL);
46         thread_start(thread_main, NULL);
47
48         printf("tls=%d non_tls=%d\n", tls, non_tls);
49
50         if (tls != 0 || non_tls != 5) {
51                 printf("tls failed\n");
52                 exit(1);
53         } else {
54                 printf("tls OK\n");
55         }
56         return 0;
57 }