aboutsummaryrefslogtreecommitdiff
path: root/linuxthreads/sysdeps/pthread/timer_routines.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-04-09 02:10:21 +0000
committerUlrich Drepper <drepper@redhat.com>2002-04-09 02:10:21 +0000
commit14b2ede5b27384fb037282b98cacbc516c9cd34c (patch)
tree7276aec28f416feb6bd45d38ac196d559c8f0633 /linuxthreads/sysdeps/pthread/timer_routines.c
parent776cc5d31c5e8031315b1a0e4fb73e3755b18eba (diff)
downloadglibc-14b2ede5b27384fb037282b98cacbc516c9cd34c.tar
glibc-14b2ede5b27384fb037282b98cacbc516c9cd34c.tar.gz
glibc-14b2ede5b27384fb037282b98cacbc516c9cd34c.tar.bz2
glibc-14b2ede5b27384fb037282b98cacbc516c9cd34c.zip
Update.
2002-04-08 Ulrich Drepper <drepper@redhat.com> * sysdeps/pthread/timer_getoverr.c: Return real overrun. * sysdeps/pthread/posix-timer.h (struct timer_node): Add overrun_count. * sysdeps/pthread/timer_routines.c (thread_func): Schedule next timeout based on previous one and not on current time. Count overruns. Patch by Eric F. Sorton <eric@cctcorp.com>. * sysdeps/unix/sysv/linux/bits/local_lim.h: Add DELAYTIMER_MAX. (FLOATING_STACKS, ARCH_STACK_MAX_SIZE): Defined.
Diffstat (limited to 'linuxthreads/sysdeps/pthread/timer_routines.c')
-rw-r--r--linuxthreads/sysdeps/pthread/timer_routines.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/linuxthreads/sysdeps/pthread/timer_routines.c b/linuxthreads/sysdeps/pthread/timer_routines.c
index 85d626b0f4..6eae476cf5 100644
--- a/linuxthreads/sysdeps/pthread/timer_routines.c
+++ b/linuxthreads/sysdeps/pthread/timer_routines.c
@@ -1,5 +1,5 @@
/* Helper code for POSIX timer implementation on LinuxThreads.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
@@ -413,8 +413,16 @@ thread_func (void *arg)
if (__builtin_expect (timer->value.it_interval.tv_sec, 0) != 0
|| timer->value.it_interval.tv_nsec != 0)
{
- timespec_add (&timer->expirytime, &now,
+ timer->overrun_count = 0;
+ timespec_add (&timer->expirytime, &timer->expirytime,
&timer->value.it_interval);
+ while (timespec_compare(&timer->expirytime, &now) < 0)
+ {
+ timespec_add (&timer->expirytime, &timer->expirytime,
+ &timer->value.it_interval);
+ if (timer->overrun_count < DELAYTIMER_MAX)
+ ++timer->overrun_count;
+ }
__timer_thread_queue_timer (self, timer);
}