/* 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"