| /* |
| * Test program for verifying whether pthread cleanup handlers are invoked |
| * correctly. |
| */ |
| |
| |
| #include <stdbool.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <pthread.h> |
| #include <stdlib.h> |
| |
| |
| static pthread_mutex_t s_mutex; |
| |
| |
| static void cleanup_handler(void* param) |
| { |
| fprintf(stderr, "Cleanup handler has been called.\n"); |
| pthread_mutex_unlock(&s_mutex); |
| } |
| |
| static void* f(void *p) |
| { |
| if (pthread_mutex_lock(&s_mutex) != 0) |
| { |
| fprintf(stderr, "pthread_mutex_lock()\n"); |
| exit(1); |
| } |
| |
| pthread_cleanup_push(cleanup_handler, NULL); |
| pthread_exit(0); |
| pthread_cleanup_pop(true); |
| } |
| |
| |
| int main() |
| { |
| pthread_t pt1, pt2; |
| |
| // Make sure the program exits in case a deadlock has been triggered. |
| alarm(20); |
| |
| if (pthread_mutex_init(&s_mutex, NULL) != 0) |
| { |
| fprintf(stderr, "pthread_mutex_init()\n"); |
| exit(1); |
| } |
| if (pthread_create(&pt1, NULL, f, NULL) != 0) |
| { |
| fprintf(stderr, "pthread_create()\n"); |
| exit(1); |
| } |
| if (pthread_create(&pt2, NULL, f, NULL) != 0) |
| { |
| fprintf(stderr, "pthread_create()\n"); |
| exit(1); |
| } |
| |
| pthread_join(pt1, 0); |
| pthread_join(pt2, 0); |
| |
| fprintf(stderr, "Test succeeded.\n"); |
| |
| return 0; |
| } |