aboutsummaryrefslogtreecommitdiff
path: root/rt
diff options
context:
space:
mode:
Diffstat (limited to 'rt')
-rw-r--r--rt/Makefile2
-rw-r--r--rt/tst-timer2.c62
2 files changed, 63 insertions, 1 deletions
diff --git a/rt/Makefile b/rt/Makefile
index 9f49a02..4716789 100644
--- a/rt/Makefile
+++ b/rt/Makefile
@@ -38,7 +38,7 @@ librt-routines = $(aio-routines) \
$(clock-routines) $(timer-routines) \
$(shm-routines)
-tests := tst-shm tst-clock tst-clock_nanosleep tst-timer \
+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
diff --git a/rt/tst-timer2.c b/rt/tst-timer2.c
new file mode 100644
index 0000000..74ccc49
--- /dev/null
+++ b/rt/tst-timer2.c
@@ -0,0 +1,62 @@
+/* Test for crashing bugs when trying to create too many timers. */
+
+#include <stdio.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+
+#if _POSIX_THREADS
+# include <pthread.h>
+
+void
+thread (union sigval arg)
+{
+ puts ("Timeout");
+}
+
+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_THREAD;
+ sigev.sigev_signo = SIGRTMIN;
+ sigev.sigev_notify_function = thread;
+ sigev.sigev_notify_attributes = 0;
+ sigev.sigev_value.sival_ptr = (void *) &timerId;
+
+ for (i = 0; i < 100; i++)
+ {
+ printf ("cnt = %d\n", i);
+
+ if (timer_create (CLOCK_REALTIME, &sigev, &timerId) < 0)
+ perror ("timer_create");
+
+ res = timer_settime (timerId, 0, &itval, NULL);
+ if (res < 0)
+ perror ("timer_settime");
+
+ res = timer_delete (timerId);
+ if (res < 0)
+ perror ("timer_delete");
+ }
+
+ return 0;
+}
+
+# define TEST_FUNCTION do_test ()
+#else
+# define TEST_FUNCTION 0
+#endif
+
+#include "../test-skeleton.c"