summaryrefslogtreecommitdiff
path: root/rt
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-04-13 05:26:20 +0000
committerUlrich Drepper <drepper@redhat.com>2004-04-13 05:26:20 +0000
commite079c2285466ed0ddeed002a651c2e7ed7af5e8d (patch)
tree5d37a59b9ce2b94dea02d785e5cbe1b9348be0ff /rt
parent1b82c6c77d566ce3977c83b7ca47f09aac31e525 (diff)
downloadglibc-e079c2285466ed0ddeed002a651c2e7ed7af5e8d.tar.gz
Update.
2004-04-12 Ulrich Drepper <drepper@redhat.com> * rt/Makefile (tests): Add tst-timer3. * rt/tst-timer3.c: New file. By Roland McGrath.
Diffstat (limited to 'rt')
-rw-r--r--rt/Makefile3
-rw-r--r--rt/tst-timer3.c81
2 files changed, 83 insertions, 1 deletions
diff --git a/rt/Makefile b/rt/Makefile
index fd5185292c..011bef357e 100644
--- a/rt/Makefile
+++ b/rt/Makefile
@@ -43,7 +43,8 @@ librt-routines = $(aio-routines) \
tests := tst-shm tst-clock tst-clock_nanosleep tst-timer tst-timer2 \
tst-aio tst-aio64 tst-aio2 tst-aio3 tst-aio4 tst-aio5 tst-aio6 \
- tst-aio7 tst-mqueue1 tst-mqueue2 tst-mqueue3 tst-mqueue4
+ tst-aio7 tst-mqueue1 tst-mqueue2 tst-mqueue3 tst-mqueue4 \
+ tst-timer3
extra-libs := librt
extra-libs-others := $(extra-libs)
diff --git a/rt/tst-timer3.c b/rt/tst-timer3.c
new file mode 100644
index 0000000000..10b6309179
--- /dev/null
+++ b/rt/tst-timer3.c
@@ -0,0 +1,81 @@
+/* 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>
+#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 ()
+#include "../test-skeleton.c"