| /* Test for bogus per-thread deletion of timers. */ |
| |
| #include <stdio.h> |
| #include <error.h> |
| #include <time.h> |
| #include <signal.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <sys/time.h> |
| #include <sys/resource.h> |
| #include <unistd.h> |
| #if _POSIX_THREADS |
| # include <pthread.h> |
| |
| |
| /* Creating timers in another thread should work too. */ |
| static void * |
| do_timer_create (void *arg) |
| { |
| struct sigevent *const sigev = arg; |
| timer_t *const timerId = sigev->sigev_value.sival_ptr; |
| if (timer_create (CLOCK_REALTIME, sigev, timerId) < 0) |
| { |
| printf ("timer_create: %m\n"); |
| return NULL; |
| } |
| return timerId; |
| } |
| |
| |
| static int |
| do_test (void) |
| { |
| int i, res; |
| timer_t timerId; |
| struct itimerspec itval; |
| struct sigevent sigev; |
| |
| itval.it_interval.tv_sec = 2; |
| itval.it_interval.tv_nsec = 0; |
| itval.it_value.tv_sec = 2; |
| itval.it_value.tv_nsec = 0; |
| |
| sigev.sigev_notify = SIGEV_SIGNAL; |
| sigev.sigev_signo = SIGALRM; |
| sigev.sigev_value.sival_ptr = (void *) &timerId; |
| |
| for (i = 0; i < 100; i++) |
| { |
| printf ("cnt = %d\n", i); |
| |
| pthread_t thr; |
| res = pthread_create (&thr, NULL, &do_timer_create, &sigev); |
| if (res) |
| { |
| printf ("pthread_create: %s\n", strerror (res)); |
| continue; |
| } |
| void *val; |
| res = pthread_join (thr, &val); |
| if (res) |
| { |
| printf ("pthread_join: %s\n", strerror (res)); |
| continue; |
| } |
| if (val == NULL) |
| continue; |
| |
| res = timer_settime (timerId, 0, &itval, NULL); |
| if (res < 0) |
| printf ("timer_settime: %m\n"); |
| |
| res = timer_delete (timerId); |
| if (res < 0) |
| printf ("timer_delete: %m\n"); |
| } |
| |
| return 0; |
| } |
| |
| # define TEST_FUNCTION do_test () |
| #else |
| # define TEST_FUNCTION 0 |
| #endif |
| |
| #include "../test-skeleton.c" |