]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* rt/tst-timer2.c: New file.
authorRoland McGrath <roland@gnu.org>
Tue, 29 Jul 2003 09:32:03 +0000 (09:32 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 29 Jul 2003 09:32:03 +0000 (09:32 +0000)
* rt/Makefile (tests): Add it.

ChangeLog
linuxthreads/ChangeLog
linuxthreads/sysdeps/pthread/timer_create.c
linuxthreads/sysdeps/pthread/timer_routines.c
nptl/ChangeLog
nptl/sysdeps/pthread/timer_create.c
nptl/sysdeps/pthread/timer_routines.c
rt/Makefile
rt/tst-timer2.c [new file with mode: 0644]

index 35ac3d8ef4cee2ae0391d377e8201e15a8e86108..a99e6913b751d60ea6fa3745f2dca99b94d850d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-29  Roland McGrath  <roland@redhat.com>
+
+       * rt/tst-timer2.c: New file.
+       * rt/Makefile (tests): Add it.
+
 2003-07-25  Jakub Jelinek  <jakub@redhat.com>
 
        * elf/dl-support.c (_dl_hwcap): Add nocommon attribute.
index 4d70bb326c5e36167abb39b871aeb42ea1e3ef08..b151dc3406e712a725bcd62120909462a3a508cb 100644 (file)
@@ -1,3 +1,10 @@
+2003-06-19  Daniel Jacobowitz  <drow@mvista.com>
+
+       * sysdeps/pthread/timer_create.c (timer_create): Call timer_delref
+       before __timer_dealloc.
+       * sysdeps/pthread/timer_routines.c (__timer_thread_find_matching):
+       Don't call list_unlink.
+
 2003-07-29  Roland McGrath  <roland@redhat.com>
 
        * Makefile [$(build-shared) = yes] (tests): Depend on $(test-modules).
index 795f94c7d2f484cc20fda88a946bb959f7871e4e..d63cda06873928627982a501cca544da0a446f1f 100644 (file)
@@ -178,7 +178,10 @@ timer_create (clock_id, evp, timerid)
       if (thread != NULL)
        __timer_thread_dealloc (thread);
       if (newtimer != NULL)
-       __timer_dealloc (newtimer);
+       {
+         timer_delref (newtimer);
+         __timer_dealloc (newtimer);
+       }
     }
 
   pthread_mutex_unlock (&__timer_mutex);
index b88c5e055699dde528aef275360dd67ab3517e27..36c26b2a012befcd22ba0539c9d09e72903fed7d 100644 (file)
@@ -538,10 +538,7 @@ __timer_thread_find_matching (const pthread_attr_t *desired_attr,
 
       if (thread_attr_compare (desired_attr, &candidate->attr)
          && desired_clock_id == candidate->clock_id)
-       {
-         list_unlink (iter);
-         return candidate;
-        }
+       return candidate;
 
       iter = list_next (iter);
     }
index 145c7195891d82ca7c4f6782dbaf658e99b83d4f..45037eb6155a8c020b091e0d10e73143dbf297d4 100644 (file)
@@ -1,3 +1,10 @@
+2003-06-19  Daniel Jacobowitz  <drow@mvista.com>
+
+       * sysdeps/pthread/timer_create.c (timer_create): Call timer_delref
+       before __timer_dealloc.
+       * sysdeps/pthread/timer_routines.c (__timer_thread_find_matching):
+       Don't call list_unlink.
+
 2003-07-29  Roland McGrath  <roland@redhat.com>
 
        * Makefile [$(build-shared) = yes] (tests): Depend on $(test-modules).
index 4ee0966f4ebe7b4e559cf12d4534954bff3010f0..16aa8100b427d3d377ba9fcb5566f8d22b726e3c 100644 (file)
@@ -178,7 +178,10 @@ timer_create (clock_id, evp, timerid)
       if (thread != NULL)
        __timer_thread_dealloc (thread);
       if (newtimer != NULL)
-       __timer_dealloc (newtimer);
+       {
+         timer_delref (newtimer);
+         __timer_dealloc (newtimer);
+       }
     }
 
   pthread_mutex_unlock (&__timer_mutex);
index 7dec0caab1e2a478142ce139b36fb65824180bee..af6f7412b631d665c28987412777d8d4e444ba41 100644 (file)
@@ -296,7 +296,7 @@ thread_cleanup (void *val)
       thread->current_timer = 0;
 
       if (list_isempty (&thread->timer_queue))
-         __timer_thread_dealloc (thread);
+       __timer_thread_dealloc (thread);
       else
        (void) __timer_thread_start (thread);
 
@@ -540,10 +540,7 @@ __timer_thread_find_matching (const pthread_attr_t *desired_attr,
 
       if (thread_attr_compare (desired_attr, &candidate->attr)
          && desired_clock_id == candidate->clock_id)
-       {
-         list_unlink (iter);
-         return candidate;
-        }
+       return candidate;
 
       iter = list_next (iter);
     }
index 9f49a02e0cd800b744337e5cc2770718e0cd6489..47167890a0b87ffc0232869bea62cd36bb4994f7 100644 (file)
@@ -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 (file)
index 0000000..74ccc49
--- /dev/null
@@ -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"