1 /* This test triggers execution of the code that releases per-thread 2 transaction data when a thread exists, potentially repeatedly. However, 3 we currently cannot check whether the data has indeed been released. */ 4 5 /* { dg-options "-pthread" } */ 6 7 #include <stddef.h> 8 #include <stdlib.h> 9 #include <pthread.h> 10 11 static int round = 0; 12 static pthread_key_t key; 13 14 static void thread_exit_handler(void * dummy)15thread_exit_handler(void *dummy __attribute__((unused))) 16 { 17 if (round == 0) 18 abort(); 19 if (round == 1) 20 { 21 // ??? It would be good if we could check here that the transaction has 22 // indeed been released. 23 __transaction_atomic { round++; } 24 if (pthread_setspecific(key, &round)) 25 abort(); 26 } 27 // ??? It would be good if we could check here that the transaction has 28 // indeed been released (again). 29 } 30 thread(void * dummy)31static void *thread (void *dummy __attribute__((unused))) 32 { 33 if (pthread_key_create(&key, thread_exit_handler)) 34 abort(); 35 if (pthread_setspecific(key, &round)) 36 abort(); 37 __transaction_atomic { round++; } 38 return NULL; 39 } 40 main()41int main() 42 { 43 pthread_t pt; 44 pthread_create(&pt, NULL, thread, NULL); 45 pthread_join(pt, NULL); 46 if (round != 2) 47 abort(); 48 return 0; 49 } 50