mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 00:46:12 +00:00
67 lines
1.1 KiB
C
67 lines
1.1 KiB
C
/*
|
|
* 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;
|
|
}
|