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