#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
static void thread_cleanup(void *arg)
{
printf("cleaning up 0x%lx\n", (long)arg);
return;
}
static void *thread_main(void *arg)
{
pthread_cleanup_push(thread_cleanup, (void *)0x1234);
pthread_cleanup_push(thread_cleanup, (void *)0x5678);
if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0)
{
perror("pthread_setcanceltype");
return NULL;
}
if (pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
{
perror("pthread_setcancelstate");
return NULL;
}
pause();
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return NULL;
}
int main(int argc, char **argv)
{
pthread_t tid;
void *result;
if (pthread_create(&tid, NULL, thread_main, NULL) != 0)
{
perror("pthread_create");
exit(1);
}
sleep(1);
if (pthread_cancel(tid) != 0)
{
perror("pthread_cancel");
exit(1);
}
if (pthread_join(tid, &result) != 0)
{
perror("pthread_join");
exit(1);
}
printf("result is %s\n", result == PTHREAD_CANCELED ? "correct" : "incorrect");
exit(0);
}