blob: 0fb3d073d66839e457505bcf1dcdace531c62f45 [file] [log] [blame]
bart505a4962009-07-04 12:20:04 +00001/*
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
bart9ed94aa2009-07-11 15:02:27 +000014static pthread_mutex_t s_mutex;
bart505a4962009-07-04 12:20:04 +000015
16
17static void cleanup_handler(void* param)
18{
19 fprintf(stderr, "Cleanup handler has been called.\n");
bart9ed94aa2009-07-11 15:02:27 +000020 pthread_mutex_unlock(&s_mutex);
bart505a4962009-07-04 12:20:04 +000021}
22
23static void* f(void *p)
24{
bart9ed94aa2009-07-11 15:02:27 +000025 if (pthread_mutex_lock(&s_mutex) != 0)
bart505a4962009-07-04 12:20:04 +000026 {
bart9ed94aa2009-07-11 15:02:27 +000027 fprintf(stderr, "pthread_mutex_lock()\n");
bart505a4962009-07-04 12:20:04 +000028 exit(1);
29 }
30
31 pthread_cleanup_push(cleanup_handler, NULL);
32 pthread_exit(0);
33 pthread_cleanup_pop(true);
34}
35
36
37int main()
38{
39 pthread_t pt1, pt2;
40
41 // Make sure the program exits in case a deadlock has been triggered.
bart811b60e2011-12-13 07:49:30 +000042 alarm(20);
bart505a4962009-07-04 12:20:04 +000043
bart9ed94aa2009-07-11 15:02:27 +000044 if (pthread_mutex_init(&s_mutex, NULL) != 0)
bart505a4962009-07-04 12:20:04 +000045 {
bart9ed94aa2009-07-11 15:02:27 +000046 fprintf(stderr, "pthread_mutex_init()\n");
bart505a4962009-07-04 12:20:04 +000047 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}