1 /* BeginSourceFile tls.c
3 This file creates and deletes threads. It uses thread local storage
11 #include <semaphore.h>
16 /* Uncomment to turn on debugging output */
17 /*#define START_DEBUG*/
19 /* Thread-local storage. */
20 __thread
int a_thread_local
;
24 static __thread
int another_thread_local
;
27 __thread
int K::another_thread_local
;
29 /* psymtabs->symtabs resolving check. */
30 extern __thread
int file2_thread_local
;
32 /* Global variable just for info addr in gdb. */
35 /* Print the results of thread-local storage. */
36 int thread_local_val
[ N_THREADS
];
37 int another_thread_local_val
[ N_THREADS
];
39 /* Semaphores to make sure the threads are alive when we print the TLS
40 variables from gdb. */
41 sem_t tell_main
, tell_thread
;
49 fprintf (stderr
, "EAGAIN\n");
52 fprintf (stderr
, "EINTR\n");
55 fprintf (stderr
, "EINVAL\n");
58 fprintf (stderr
, "ENOSYS\n");
61 fprintf (stderr
, "ENOENT\n");
64 fprintf (stderr
, "EDEADLK\n");
67 fprintf (stderr
, "Unknown error\n");
72 /* Routine for each thread to run, does nothing. */
73 void *spin( void *vp
)
82 K::another_thread_local
= me
;
83 for( i
= 0; i
<= me
; i
++ ) {
87 another_thread_local_val
[me
] = K::another_thread_local
;
88 thread_local_val
[ me
] = a_thread_local
; /* here we know tls value */
90 if (sem_post (&tell_main
) == -1)
92 fprintf (stderr
, "th %d post on sem tell_main failed\n", me
);
97 fprintf (stderr
, "th %d post on tell main\n", me
);
103 fprintf (stderr
, "th %d start wait on tell_thread\n", me
);
105 if (sem_wait (&tell_thread
) == 0)
111 fprintf (stderr
, "th %d wait tell_thread got EINTR, rewaiting\n", me
);
117 fprintf (stderr
, "th %d wait on sem tell_thread failed\n", me
);
124 fprintf (stderr
, "th %d Wait on tell_thread\n", me
);
131 function_referencing_file2_thread_local (void)
133 file2_thread_local
= file2_thread_local
;
140 pthread_t t
[ N_THREADS
];
143 for( i
= 0; i
< N_THREADS
; i
++)
145 thread_local_val
[i
] = 0;
146 another_thread_local_val
[i
] = 0;
149 if (sem_init (&tell_main
, 0, 0) == -1)
151 fprintf (stderr
, "tell_main semaphore init failed\n");
155 if (sem_init (&tell_thread
, 0, 0) == -1)
157 fprintf (stderr
, "tell_thread semaphore init failed\n");
161 /* Start N_THREADS threads, then join them so that they are terminated. */
162 for( i
= 0; i
< N_THREADS
; i
++ )
164 err
= pthread_create( &t
[i
], NULL
, spin
, (void *) (long) i
);
166 fprintf(stderr
, "Error in thread %d create\n", i
);
170 for( i
= 0; i
< N_THREADS
; i
++ )
175 fprintf (stderr
, "main %d start wait on tell_main\n", i
);
177 if (sem_wait (&tell_main
) == 0)
183 fprintf (stderr
, "main %d wait tell_main got EINTR, rewaiting\n", i
);
189 fprintf (stderr
, "main %d wait on sem tell_main failed\n", i
);
197 fprintf (stderr
, "main done waiting on tell_main\n");
200 i
= 10; /* Here all threads should be still alive. */
202 for( i
= 0; i
< N_THREADS
; i
++ )
204 if (sem_post (&tell_thread
) == -1)
206 fprintf (stderr
, "main %d post on sem tell_thread failed\n", i
);
211 fprintf (stderr
, "main %d post on tell_thread\n", i
);
215 for( i
= 0; i
< N_THREADS
; i
++ )
217 err
= pthread_join(t
[i
], NULL
);
220 fprintf (stderr
, "error in thread %d join\n", i
);
224 i
= 10; /* Null line for setting bpts on. */
233 return 0; /* Set breakpoint here before exit. */