+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.
+
2002-04-08 kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/sh/pt-machine.h: Define _PT_MACHINE_H
if it isn't defined yet.
- (FLOATING_STACKS, EARCH_STACK_MAX_SIZE): Defined.
+ (FLOATING_STACKS, ARCH_STACK_MAX_SIZE): Defined.
(THREAD_GETMEM, THREAD_GETMEM_NC, THREAD_SETMEM, THREAD_SETMEM_NC):
Likewise.
* sysdeps/sh/tls.h: New file.
/* Definitions for POSIX timer implementation on top of LinuxThreads.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
struct thread_node *thread;
pid_t creator_pid;
int refcount;
+ int overrun_count;
};
-/* 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>.
if (! timer_valid (timer = timer_id2ptr (timerid)))
__set_errno (EINVAL);
else
- retval = 0; /* TODO: overrun counting not supported */
+ retval = timer->overrun_count;
pthread_mutex_unlock (&__timer_mutex);
/* 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>.
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);
}
} tls_index;
-extern void *__tls_get_addr (tls_index *ti)
- __attribute__ ((__regparm__ (1)));
+extern void *__tls_get_addr (tls_index *ti);