| |
| |
| #include <pthread.h> |
| #include <string.h> |
| #include "test.h" |
| |
| #define TEST(r, f) if (((r)=(f))) t_error(#f " failed: %s\n", strerror(r)) |
| |
| static void cleanup(void *arg) |
| { |
| *(int *)arg = 1; |
| } |
| |
| static void *start(void *arg) |
| { |
| pthread_cleanup_push(cleanup, arg); |
| pthread_exit(0); |
| pthread_cleanup_pop(0); |
| return arg; |
| } |
| |
| int main(void) |
| { |
| pthread_t td; |
| void *status; |
| int arg = 0; |
| int r; |
| |
| TEST(r, pthread_create(&td, 0, start, &arg)); |
| TEST(r, pthread_join(td, &status)); |
| if (status) |
| t_error("expected 0 thread exit status, got 0x%lx\n", (long)status); |
| if (arg != 1) |
| t_error("cleanup handler failed to run\n"); |
| return t_status; |
| } |