1 /* 2 * Test program for verifying whether pthread cleanup handlers are invoked 3 * correctly. 4 */ 5 6 7 #include <stdbool.h> 8 #include <stdio.h> 9 #include <unistd.h> 10 #include <pthread.h> 11 #include <stdlib.h> 12 13 14 static pthread_mutex_t s_mutex; 15 16 17 static void cleanup_handler(void* param) 18 { 19 fprintf(stderr, "Cleanup handler has been called.\n"); 20 pthread_mutex_unlock(&s_mutex); 21 } 22 23 static void* f(void *p) 24 { 25 if (pthread_mutex_lock(&s_mutex) != 0) 26 { 27 fprintf(stderr, "pthread_mutex_lock()\n"); 28 exit(1); 29 } 30 31 pthread_cleanup_push(cleanup_handler, NULL); 32 pthread_exit(0); 33 pthread_cleanup_pop(true); 34 } 35 36 37 int main() 38 { 39 pthread_t pt1, pt2; 40 41 // Make sure the program exits in case a deadlock has been triggered. 42 alarm(20); 43 44 if (pthread_mutex_init(&s_mutex, NULL) != 0) 45 { 46 fprintf(stderr, "pthread_mutex_init()\n"); 47 exit(1); 48 } 49 if (pthread_create(&pt1, NULL, f, NULL) != 0) 50 { 51 fprintf(stderr, "pthread_create()\n"); 52 exit(1); 53 } 54 if (pthread_create(&pt2, NULL, f, NULL) != 0) 55 { 56 fprintf(stderr, "pthread_create()\n"); 57 exit(1); 58 } 59 60 pthread_join(pt1, 0); 61 pthread_join(pt2, 0); 62 63 fprintf(stderr, "Test succeeded.\n"); 64 65 return 0; 66 } 67