mirror of git://sourceware.org/git/glibc.git
Update.
2003-03-25 Ulrich Drepper <drepper@redhat.com> * csu/tst-atomic.c: Adjust tests to what atomic_add_negative and atomic_add_zero were supposed to do. * include/atomic.h: Adjust atomic_add_negative and atomic_add_zero to x86 behavior. * sysdeps/generic/bits/typesizes.h (__TIMER_T_TYPE): Define as void*. This matches the new timer implementation. * sysdeps/unix/sysv/linux/bits/siginfo.h (struct siginfo): Adjust timer info for what the kernel provides these days. (struct sigevent): Add _tid field. Define SIGEV_THREAD_ID. * Versions.def (librt): Add GLIBC_2.3.3. * abilist/libpthread.abilist: Update for nptl.
This commit is contained in:
parent
2a9ae45c3f
commit
09402f5bc1
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
||||||
|
2003-03-25 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* csu/tst-atomic.c: Adjust tests to what atomic_add_negative and
|
||||||
|
atomic_add_zero were supposed to do.
|
||||||
|
* include/atomic.h: Adjust atomic_add_negative and atomic_add_zero
|
||||||
|
to x86 behavior.
|
||||||
|
|
||||||
|
* sysdeps/generic/bits/typesizes.h (__TIMER_T_TYPE): Define as void*.
|
||||||
|
This matches the new timer implementation.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/siginfo.h (struct siginfo): Adjust
|
||||||
|
timer info for what the kernel provides these days.
|
||||||
|
(struct sigevent): Add _tid field.
|
||||||
|
Define SIGEV_THREAD_ID.
|
||||||
|
|
||||||
|
* Versions.def (librt): Add GLIBC_2.3.3.
|
||||||
|
|
||||||
|
* abilist/libpthread.abilist: Update for nptl.
|
||||||
|
|
||||||
2003-03-24 Jon Grimm <jgrimm@us.ibm.com>
|
2003-03-24 Jon Grimm <jgrimm@us.ibm.com>
|
||||||
|
|
||||||
* inet/netinet/in.h: Add IPPROTO_SCTP.
|
* inet/netinet/in.h: Add IPPROTO_SCTP.
|
||||||
|
|
|
@ -85,6 +85,7 @@ librt {
|
||||||
GLIBC_2.1
|
GLIBC_2.1
|
||||||
GLIBC_2.2
|
GLIBC_2.2
|
||||||
GLIBC_2.3
|
GLIBC_2.3
|
||||||
|
GLIBC_2.3.3
|
||||||
}
|
}
|
||||||
libutil {
|
libutil {
|
||||||
GLIBC_2.0
|
GLIBC_2.0
|
||||||
|
|
|
@ -232,3 +232,10 @@ GLIBC_2.2 i.86-.*-linux.* ia64-.*-linux.* powerpc-.*-linux.* s390-.*-linux.* sh[
|
||||||
GLIBC_2.2 A
|
GLIBC_2.2 A
|
||||||
GLIBC_2.3.2 i.86-.*-linux.* ia64-.*-linux.* powerpc-.*-linux.* s390-.*-linux.* sh[34].*-.*-linux.* x86_64-.*-linux.*
|
GLIBC_2.3.2 i.86-.*-linux.* ia64-.*-linux.* powerpc-.*-linux.* s390-.*-linux.* sh[34].*-.*-linux.* x86_64-.*-linux.*
|
||||||
GLIBC_2.3.2 A
|
GLIBC_2.3.2 A
|
||||||
|
GLIBC_2.3.3 i.86-.*-linux.* ia64-.*-linux.* powerpc-.*-linux.* s390-.*-linux.* sh[34].*-.*-linux.* x86_64-.*-linux.*
|
||||||
|
GLIBC_2.3.3 A
|
||||||
|
pthread_barrierattr_getpshared F
|
||||||
|
pthread_condattr_getclock F
|
||||||
|
pthread_condattr_setclock F
|
||||||
|
pthread_timedjoin_np F
|
||||||
|
pthread_tryjoin_np F
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
||||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
||||||
#define __KEY_T_TYPE __S32_TYPE
|
#define __KEY_T_TYPE __S32_TYPE
|
||||||
#define __CLOCKID_T_TYPE __S32_TYPE
|
#define __CLOCKID_T_TYPE __S32_TYPE
|
||||||
#define __TIMER_T_TYPE __S32_TYPE
|
#define __TIMER_T_TYPE void *
|
||||||
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
||||||
#define __FSID_T_TYPE struct { int __val[2]; }
|
#define __FSID_T_TYPE struct { int __val[2]; }
|
||||||
|
|
||||||
|
|
|
@ -178,9 +178,9 @@ do_test (void)
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem = -10;
|
mem = -12;
|
||||||
if (! atomic_add_negative (&mem, 12)
|
if (! atomic_add_negative (&mem, 10)
|
||||||
|| mem != 2)
|
|| mem != -2)
|
||||||
{
|
{
|
||||||
puts ("atomic_add_negative test 1 failed");
|
puts ("atomic_add_negative test 1 failed");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
@ -210,9 +210,9 @@ do_test (void)
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem = 0;
|
mem = -36;
|
||||||
if (! atomic_add_zero (&mem, 36)
|
if (! atomic_add_zero (&mem, 36)
|
||||||
|| mem != 36)
|
|| mem != 0)
|
||||||
{
|
{
|
||||||
puts ("atomic_add_zero test 2 failed");
|
puts ("atomic_add_zero test 2 failed");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
|
|
@ -189,13 +189,15 @@
|
||||||
|
|
||||||
#ifndef atomic_add_negative
|
#ifndef atomic_add_negative
|
||||||
# define atomic_add_negative(mem, value) \
|
# define atomic_add_negative(mem, value) \
|
||||||
(atomic_exchange_and_add ((mem), (value)) < 0)
|
({ __typeof (value) __value = (value); \
|
||||||
|
atomic_exchange_and_add ((mem), __value) < -__value); })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef atomic_add_zero
|
#ifndef atomic_add_zero
|
||||||
# define atomic_add_zero(mem, value) \
|
# define atomic_add_zero(mem, value) \
|
||||||
(atomic_exchange_and_add ((mem), (value)) == 0)
|
({ __typeof (value) __value = (value); \
|
||||||
|
atomic_exchange_and_add ((mem), __value) == -__value; })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2003-03-25 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/pthread/bits/typesizes.h: New file.
|
||||||
|
|
||||||
2003-03-24 Daniel Jacobowitz <drow@mvista.com>
|
2003-03-24 Daniel Jacobowitz <drow@mvista.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
|
* sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
||||||
|
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#ifndef _BITS_TYPES_H
|
||||||
|
# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _BITS_TYPESIZES_H
|
||||||
|
#define _BITS_TYPESIZES_H 1
|
||||||
|
|
||||||
|
/* See <bits/types.h> for the meaning of these macros. This file exists so
|
||||||
|
that <bits/types.h> need not vary across different GNU platforms. */
|
||||||
|
|
||||||
|
#define __DEV_T_TYPE __UQUAD_TYPE
|
||||||
|
#define __UID_T_TYPE __U32_TYPE
|
||||||
|
#define __GID_T_TYPE __U32_TYPE
|
||||||
|
#define __INO_T_TYPE __ULONGWORD_TYPE
|
||||||
|
#define __INO64_T_TYPE __UQUAD_TYPE
|
||||||
|
#define __MODE_T_TYPE __U32_TYPE
|
||||||
|
#define __NLINK_T_TYPE __UWORD_TYPE
|
||||||
|
#define __OFF_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __OFF64_T_TYPE __SQUAD_TYPE
|
||||||
|
#define __PID_T_TYPE __S32_TYPE
|
||||||
|
#define __RLIM_T_TYPE __ULONGWORD_TYPE
|
||||||
|
#define __RLIM64_T_TYPE __UQUAD_TYPE
|
||||||
|
#define __BLKCNT_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __BLKCNT64_T_TYPE __SQUAD_TYPE
|
||||||
|
#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE
|
||||||
|
#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
|
||||||
|
#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE
|
||||||
|
#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
|
||||||
|
#define __ID_T_TYPE __U32_TYPE
|
||||||
|
#define __CLOCK_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __TIME_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __USECONDS_T_TYPE __U32_TYPE
|
||||||
|
#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __DADDR_T_TYPE __S32_TYPE
|
||||||
|
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __KEY_T_TYPE __S32_TYPE
|
||||||
|
#define __CLOCKID_T_TYPE __S32_TYPE
|
||||||
|
#define __TIMER_T_TYPE __S32_TYPE
|
||||||
|
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
||||||
|
#define __FSID_T_TYPE struct { int __val[2]; }
|
||||||
|
|
||||||
|
/* Number of descriptors that can fit in an `fd_set'. */
|
||||||
|
#define __FD_SETSIZE 1024
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* bits/typesizes.h */
|
|
@ -1,3 +1,63 @@
|
||||||
|
2003-03-25 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* pthreadP.h: Define SIGCANCEL and SIGTIMER.
|
||||||
|
* sysdeps/i386/pthreaddef.h: Remove SIGCANCEL definition.
|
||||||
|
* sysdeps/ia64/pthreaddef.h: Likewise.
|
||||||
|
* sysdeps/powerpc/pthreaddef.h: Likewise.
|
||||||
|
* sysdeps/s390/pthreaddef.h: Likewise.
|
||||||
|
* sysdeps/sh/pthreaddef.h: Likewise.
|
||||||
|
* sysdeps/x86_64/pthreaddef.h: Likewise.
|
||||||
|
* init.c (__pthread_initialize_minimal): Block SIGTIMER.
|
||||||
|
* sysdeps/pthread/sigaction.c: Also prevent SIGTIMER handler from
|
||||||
|
being changed.
|
||||||
|
* sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Make sure
|
||||||
|
SIGTIMER is not unblocked.
|
||||||
|
* sysdeps/unix/sysv/linux/allocrtsig.c (current_rtmin): One more
|
||||||
|
RT signal taken.
|
||||||
|
* sysdeps/unix/sysv/linux/pthread_kill.c: Do not allow SIGTIMER to
|
||||||
|
be send.
|
||||||
|
* sysdeps/pthread/posix-timer.h (timer_id2ptr, timer_ptr2id): Just
|
||||||
|
pass pointer through as ID.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/local_lim.h (TIMER_MAX): Removed.
|
||||||
|
* sysdeps/unix/sysv/linux/kernel-posix-timers.h: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_create.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_delete.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_getoverr.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_gettime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_routines.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/timer_settime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/Versions: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/timer_create.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/timer_delete.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/timer_getoverr.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/timer_gettime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/timer_settime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_create.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_delete.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_getoverr.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_gettime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_settime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/Versions: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/timer_create.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/timer_delete.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/timer_getoverr.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/timer_gettime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/timer_settime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/Versions: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/compat-timer.h: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/timer_create.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/timer_delete.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/timer_getoverr.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/timer_gettime.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/timer_settime.c: New file.
|
||||||
|
|
||||||
|
* pthreadP.h: Remove FRAME_LEFT definition.
|
||||||
|
* cleanup.c (_pthread_cleanup_push): Don't check for reference to
|
||||||
|
already left frame. Programs which have this problem are not POSIX
|
||||||
|
compliant.
|
||||||
|
* cleanup_defer.c (_pthread_cleanup_push_defer): Likewise.
|
||||||
|
|
||||||
2003-03-24 Ulrich Drepper <drepper@redhat.com>
|
2003-03-24 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/pthread/tst-timer.c: Check return values of the
|
* sysdeps/pthread/tst-timer.c: Check return values of the
|
||||||
|
|
|
@ -33,9 +33,6 @@ _pthread_cleanup_push (buffer, routine, arg)
|
||||||
buffer->__arg = arg;
|
buffer->__arg = arg;
|
||||||
buffer->__prev = THREAD_GETMEM (self, cleanup);
|
buffer->__prev = THREAD_GETMEM (self, cleanup);
|
||||||
|
|
||||||
if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
|
|
||||||
buffer->__prev = NULL;
|
|
||||||
|
|
||||||
THREAD_SETMEM (self, cleanup, buffer);
|
THREAD_SETMEM (self, cleanup, buffer);
|
||||||
}
|
}
|
||||||
strong_alias (_pthread_cleanup_push, __pthread_cleanup_push)
|
strong_alias (_pthread_cleanup_push, __pthread_cleanup_push)
|
||||||
|
|
|
@ -33,9 +33,6 @@ _pthread_cleanup_push_defer (buffer, routine, arg)
|
||||||
buffer->__arg = arg;
|
buffer->__arg = arg;
|
||||||
buffer->__prev = THREAD_GETMEM (self, cleanup);
|
buffer->__prev = THREAD_GETMEM (self, cleanup);
|
||||||
|
|
||||||
if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
|
|
||||||
buffer->__prev = NULL;
|
|
||||||
|
|
||||||
int cancelhandling = THREAD_GETMEM (self, cancelhandling);
|
int cancelhandling = THREAD_GETMEM (self, cancelhandling);
|
||||||
|
|
||||||
/* Disable asynchronous cancellation for now. */
|
/* Disable asynchronous cancellation for now. */
|
||||||
|
|
10
nptl/init.c
10
nptl/init.c
|
@ -225,6 +225,16 @@ __pthread_initialize_minimal_internal (void)
|
||||||
NULL, _NSIG / 8);
|
NULL, _NSIG / 8);
|
||||||
|
|
||||||
|
|
||||||
|
/* The kernel supported POSIX timer handling needs a signal to implement
|
||||||
|
SIGEV_THREAD. We block the signal everywhere but we have to make
|
||||||
|
sure it is not ignored. The signal is a realtime signal so using
|
||||||
|
the default handler is fine (this handler is already selected). */
|
||||||
|
__sigdelset (&sa.sa_mask, SIGCANCEL);
|
||||||
|
__sigaddset (&sa.sa_mask, SIGTIMER);
|
||||||
|
(void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &sa.sa_mask,
|
||||||
|
NULL, _NSIG / 8);
|
||||||
|
|
||||||
|
|
||||||
/* Determine the default allowed stack size. This is the size used
|
/* Determine the default allowed stack size. This is the size used
|
||||||
in case the user does not specify one. */
|
in case the user does not specify one. */
|
||||||
struct rlimit limit;
|
struct rlimit limit;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -30,9 +30,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 16
|
#define TCB_ALIGNMENT 16
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. */
|
/* Location of current stack frame. */
|
||||||
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
||||||
|
|
|
@ -31,9 +31,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 16
|
#define TCB_ALIGNMENT 16
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. */
|
/* Location of current stack frame. */
|
||||||
#define CURRENT_STACK_FRAME __stack_pointer
|
#define CURRENT_STACK_FRAME __stack_pointer
|
||||||
|
|
|
@ -29,9 +29,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 16
|
#define TCB_ALIGNMENT 16
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. */
|
/* Location of current stack frame. */
|
||||||
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definitions for POSIX timer implementation on top of LinuxThreads.
|
/* Definitions for POSIX timer implementation on top of LinuxThreads.
|
||||||
Copyright (C) 2000, 2002 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
|
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
|
||||||
|
|
||||||
|
@ -94,6 +94,7 @@ extern struct thread_node __timer_signal_thread_tclk;
|
||||||
|
|
||||||
|
|
||||||
/* Return pointer to timer structure corresponding to ID. */
|
/* Return pointer to timer structure corresponding to ID. */
|
||||||
|
#if 0
|
||||||
static inline struct timer_node *
|
static inline struct timer_node *
|
||||||
timer_id2ptr (timer_t timerid)
|
timer_id2ptr (timer_t timerid)
|
||||||
{
|
{
|
||||||
|
@ -109,6 +110,10 @@ timer_ptr2id (struct timer_node *timer)
|
||||||
{
|
{
|
||||||
return timer - __timer_array;
|
return timer - __timer_array;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
# define timer_id2ptr(timerid) ((struct timed_node *) timerid)
|
||||||
|
# define timer_ptr2id(timerid) ((void *) timerid)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check whether timer is valid; global mutex must be held. */
|
/* Check whether timer is valid; global mutex must be held. */
|
||||||
static inline int
|
static inline int
|
||||||
|
|
|
@ -32,13 +32,36 @@ pthread_sigmask (how, newmask, oldmask)
|
||||||
sigset_t local_newmask;
|
sigset_t local_newmask;
|
||||||
|
|
||||||
/* The only thing we have to make sure here is that SIGCANCEL is not
|
/* The only thing we have to make sure here is that SIGCANCEL is not
|
||||||
blocked. */
|
blocked and that SIGTIMER is not unblocked. */
|
||||||
if (newmask != NULL
|
if (newmask != NULL)
|
||||||
&& __builtin_expect (__sigismember (newmask, SIGCANCEL), 0))
|
|
||||||
{
|
{
|
||||||
local_newmask = *newmask;
|
if (__builtin_expect (__sigismember (newmask, SIGCANCEL), 0))
|
||||||
sigdelset (&local_newmask, SIGCANCEL);
|
{
|
||||||
newmask = &local_newmask;
|
local_newmask = *newmask;
|
||||||
|
__sigdelset (&local_newmask, SIGCANCEL);
|
||||||
|
newmask = &local_newmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (__builtin_expect (__sigismember (newmask, SIGTIMER), 0))
|
||||||
|
{
|
||||||
|
if (how == SIG_UNBLOCK)
|
||||||
|
{
|
||||||
|
if (newmask != &local_newmask)
|
||||||
|
local_newmask = *newmask;
|
||||||
|
__sigdelset (&local_newmask, SIGTIMER);
|
||||||
|
newmask = &local_newmask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (how == SIG_SETMASK)
|
||||||
|
{
|
||||||
|
if (newmask != &local_newmask)
|
||||||
|
local_newmask = *newmask;
|
||||||
|
__sigaddset (&local_newmask, SIGTIMER);
|
||||||
|
newmask = &local_newmask;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef INTERNAL_SYSCALL
|
#ifdef INTERNAL_SYSCALL
|
||||||
|
|
|
@ -22,9 +22,10 @@
|
||||||
exact file anyway. */
|
exact file anyway. */
|
||||||
#ifndef LIBC_SIGACTION
|
#ifndef LIBC_SIGACTION
|
||||||
|
|
||||||
|
#include <nptl/pthreadP.h>
|
||||||
|
|
||||||
/* We use the libc implementation but we tell it to not allow
|
/* We use the libc implementation but we tell it to not allow
|
||||||
SIGCANCEL to be handled. */
|
SIGCANCEL or SIGTIMER to be handled. */
|
||||||
# define SIGCANCEL __SIGRTMIN
|
|
||||||
# define LIBC_SIGACTION 1
|
# define LIBC_SIGACTION 1
|
||||||
|
|
||||||
# include <nptl/sysdeps/pthread/sigaction.c>
|
# include <nptl/sysdeps/pthread/sigaction.c>
|
||||||
|
@ -35,7 +36,7 @@ __sigaction (sig, act, oact)
|
||||||
const struct sigaction *act;
|
const struct sigaction *act;
|
||||||
struct sigaction *oact;
|
struct sigaction *oact;
|
||||||
{
|
{
|
||||||
if (sig == SIGCANCEL)
|
if (sig == SIGCANCEL || sig == SIGTIMER)
|
||||||
{
|
{
|
||||||
__set_errno (EINVAL);
|
__set_errno (EINVAL);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -29,9 +29,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 16
|
#define TCB_ALIGNMENT 16
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. */
|
/* Location of current stack frame. */
|
||||||
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
||||||
|
|
|
@ -30,9 +30,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 8
|
#define TCB_ALIGNMENT 8
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. */
|
/* Location of current stack frame. */
|
||||||
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
#define CURRENT_STACK_FRAME __builtin_frame_address (0)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
static int current_rtmin = __SIGRTMIN + 1;
|
static int current_rtmin = __SIGRTMIN + 2;
|
||||||
static int current_rtmax = __SIGRTMAX;
|
static int current_rtmax = __SIGRTMAX;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -73,9 +73,6 @@
|
||||||
/* Minimum size for a thread. We are free to choose a reasonable value. */
|
/* Minimum size for a thread. We are free to choose a reasonable value. */
|
||||||
#define PTHREAD_STACK_MIN 16384
|
#define PTHREAD_STACK_MIN 16384
|
||||||
|
|
||||||
/* Maximum number of POSIX timers available. */
|
|
||||||
#define TIMER_MAX 256
|
|
||||||
|
|
||||||
/* Maximum number of timer expiration overruns. */
|
/* Maximum number of timer expiration overruns. */
|
||||||
#define DELAYTIMER_MAX 2147483647
|
#define DELAYTIMER_MAX 2147483647
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
librt {
|
||||||
|
GLIBC_2.3.3 {
|
||||||
|
# Changed timer_t.
|
||||||
|
timer_create; timer_delete; timer_getoverrun; timer_gettime;
|
||||||
|
timer_settime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_create.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_delete.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_getoverr.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_gettime.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_settime.c"
|
|
@ -0,0 +1,62 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Nonzero if the system calls are not available. */
|
||||||
|
extern int __no_posix_timers attribute_hidden;
|
||||||
|
|
||||||
|
/* Helper function to implement SIGEV_THREAD. */
|
||||||
|
extern void *__timer_helper_thread (void *arg) attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
|
/* Type of timers in the kernel. */
|
||||||
|
typedef int kernel_timer_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Internal representation of timer. */
|
||||||
|
struct timer
|
||||||
|
{
|
||||||
|
/* Notification mechanism. */
|
||||||
|
int sigev_notify;
|
||||||
|
|
||||||
|
/* Timer ID returned by the kernel. */
|
||||||
|
kernel_timer_t ktimerid;
|
||||||
|
|
||||||
|
/* All new elements must be added after ktimerid. And if the thrfunc
|
||||||
|
element is not the third element anymore the memory allocation in
|
||||||
|
timer_create needs to be changed. */
|
||||||
|
|
||||||
|
/* Parameters for the thread to be started for SIGEV_THREAD. */
|
||||||
|
void (*thrfunc) (sigval_t);
|
||||||
|
sigval_t sival;
|
||||||
|
pthread_attr_t attr;
|
||||||
|
|
||||||
|
/* Id of the helper thread. */
|
||||||
|
pthread_t th;
|
||||||
|
|
||||||
|
/* Barrier used for synchronization. */
|
||||||
|
pthread_barrier_t bar;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This is the signal the kernel will send to the helper thread. */
|
||||||
|
#define TIMER_SIG 40 /* some RT signal */
|
|
@ -0,0 +1,7 @@
|
||||||
|
librt {
|
||||||
|
GLIBC_2.3.3 {
|
||||||
|
# Changed timer_t.
|
||||||
|
timer_create; timer_delete; timer_getoverrun; timer_gettime;
|
||||||
|
timer_settime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_create.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_delete.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_getoverr.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_gettime.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_settime.c"
|
|
@ -37,7 +37,7 @@ __pthread_kill (threadid, signo)
|
||||||
return ESRCH;
|
return ESRCH;
|
||||||
|
|
||||||
/* Disallow sending the signal we use for cancellation. */
|
/* Disallow sending the signal we use for cancellation. */
|
||||||
if (signo == SIGCANCEL)
|
if (signo == SIGCANCEL || signo == SIGTIMER)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
/* We have a special syscall to do the work. */
|
/* We have a special syscall to do the work. */
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
librt {
|
||||||
|
GLIBC_2.3.3 {
|
||||||
|
# Changed timer_t.
|
||||||
|
timer_create; timer_delete; timer_getoverrun; timer_gettime;
|
||||||
|
timer_settime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_create.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_delete.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_getoverr.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_gettime.c"
|
|
@ -0,0 +1 @@
|
||||||
|
#include "../x86_64/timer_settime.c"
|
|
@ -0,0 +1,235 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include <internaltypes.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_create
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# define timer_create static compat_timer_create
|
||||||
|
# include <nptl/sysdeps/pthread/timer_create.c>
|
||||||
|
# undef timer_create
|
||||||
|
|
||||||
|
/* Nonzero if the system calls are not available. */
|
||||||
|
int __no_posix_timers attribute_hidden;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef timer_create_alias
|
||||||
|
# define timer_create timer_create_alias
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
timer_create (clock_id, evp, timerid)
|
||||||
|
clockid_t clock_id;
|
||||||
|
struct sigevent *evp;
|
||||||
|
timer_t *timerid;
|
||||||
|
{
|
||||||
|
# undef timer_create
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (__no_posix_timers >= 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
/* If the user wants notification via a thread we need to handle
|
||||||
|
this special. */
|
||||||
|
if (evp == NULL
|
||||||
|
|| __builtin_expect (evp->sigev_notify != SIGEV_THREAD, 1))
|
||||||
|
{
|
||||||
|
kernel_timer_t ktimerid;
|
||||||
|
int retval = INLINE_SYSCALL (timer_create, 3, clock_id, evp,
|
||||||
|
&ktimerid);
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (retval != -1 || errno != ENOSYS)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (retval != -1)
|
||||||
|
{
|
||||||
|
struct timer *newp;
|
||||||
|
|
||||||
|
/* We avoid allocating too much memory by basically
|
||||||
|
using struct timer as a derived class with the
|
||||||
|
first two elements being in the superclass. We only
|
||||||
|
need these two elements here. */
|
||||||
|
newp = (struct timer *) malloc (offsetof (struct timer,
|
||||||
|
thrfunc));
|
||||||
|
if (newp != NULL)
|
||||||
|
{
|
||||||
|
newp->sigev_notify = (evp != NULL
|
||||||
|
? evp->sigev_notify
|
||||||
|
: SIGEV_SIGNAL);
|
||||||
|
newp->ktimerid = ktimerid;
|
||||||
|
|
||||||
|
*timerid = (timer_t) newp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No memory. Free the kernel timer. */
|
||||||
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
|
(void) INTERNAL_SYSCALL (timer_delete, err, 1, ktimerid);
|
||||||
|
|
||||||
|
retval = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
/* Make sure we have the necessary kernel support. */
|
||||||
|
if (__no_posix_timers == 0)
|
||||||
|
{
|
||||||
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
|
struct timespec ts;
|
||||||
|
int res = INTERNAL_SYSCALL (clock_getres, err, 1, &ts);
|
||||||
|
__no_posix_timers = (INTERNAL_SYSCALL_ERROR_P (res, err)
|
||||||
|
? -1 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (__no_posix_timers > 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
sigset_t ss;
|
||||||
|
sigemptyset (&ss);
|
||||||
|
sigaddset (&ss, TIMER_SIG);
|
||||||
|
pthread_sigmask (SIG_BLOCK, &ss, NULL);
|
||||||
|
struct timer *newp;
|
||||||
|
|
||||||
|
newp = (struct timer *) malloc (sizeof (struct timer));
|
||||||
|
if (newp == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Copy the thread parameters the user provided. */
|
||||||
|
newp->sival = evp->sigev_value;
|
||||||
|
newp->thrfunc = evp->sigev_notify_function;
|
||||||
|
|
||||||
|
/* We cannot simply copy the thread attributes since the
|
||||||
|
implementation might keep internal information for
|
||||||
|
each instance. */
|
||||||
|
(void) pthread_attr_init (&newp->attr);
|
||||||
|
if (evp->sigev_notify_attributes != NULL)
|
||||||
|
{
|
||||||
|
struct pthread_attr *nattr;
|
||||||
|
struct pthread_attr *oattr;
|
||||||
|
|
||||||
|
nattr = (struct pthread_attr *) &newp->attr;
|
||||||
|
oattr = (struct pthread_attr *) evp->sigev_notify_attributes;
|
||||||
|
|
||||||
|
nattr->schedparam = oattr->schedparam;
|
||||||
|
nattr->schedpolicy = oattr->schedpolicy;
|
||||||
|
nattr->flags = oattr->flags;
|
||||||
|
nattr->guardsize = oattr->guardsize;
|
||||||
|
nattr->stackaddr = oattr->stackaddr;
|
||||||
|
nattr->stacksize = oattr->stacksize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In any case set the detach flag. */
|
||||||
|
(void) pthread_attr_setdetachstate (&newp->attr,
|
||||||
|
PTHREAD_CREATE_DETACHED);
|
||||||
|
|
||||||
|
/* Set up the barrier for sychronization. */
|
||||||
|
(void) pthread_barrier_init (&newp->bar, NULL, 2);
|
||||||
|
|
||||||
|
/* The helper thread needs only very little resources
|
||||||
|
and should go away automatically when canceled. */
|
||||||
|
pthread_attr_t attr;
|
||||||
|
(void) pthread_attr_init (&attr);
|
||||||
|
(void) pthread_attr_setdetachstate (&attr,
|
||||||
|
PTHREAD_CREATE_DETACHED);
|
||||||
|
(void) pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
|
||||||
|
|
||||||
|
/* Create the helper thread for this timer. */
|
||||||
|
int res = pthread_create (&newp->th, &attr,
|
||||||
|
__timer_helper_thread, newp);
|
||||||
|
if (res != 0)
|
||||||
|
goto err_out;
|
||||||
|
|
||||||
|
/* No need for the attribute anymore. */
|
||||||
|
(void) pthread_attr_destroy (&attr);
|
||||||
|
|
||||||
|
/* Create the event structure for the kernel timer. */
|
||||||
|
struct sigevent sev;
|
||||||
|
sev.sigev_value.sival_ptr = newp;
|
||||||
|
sev.sigev_signo = TIMER_SIG;
|
||||||
|
sev.sigev_notify = SIGEV_SIGNAL | SIGEV_THREAD_ID;
|
||||||
|
/* This is the thread ID of the helper thread. */
|
||||||
|
sev._sigev_un._pad[0] = ((struct pthread *) newp->th)->tid;
|
||||||
|
|
||||||
|
/* Wait until the helper thread is set up. */
|
||||||
|
(void) pthread_barrier_wait (&newp->bar);
|
||||||
|
|
||||||
|
/* No need for the barrier anymore. */
|
||||||
|
(void) pthread_barrier_destroy (&newp->bar);
|
||||||
|
|
||||||
|
/* Create the timer. */
|
||||||
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
|
res = INTERNAL_SYSCALL (timer_create, err, 3, clock_id, &sev,
|
||||||
|
&newp->ktimerid);
|
||||||
|
if (! INTERNAL_SYSCALL_ERROR_P (res, err))
|
||||||
|
{
|
||||||
|
*timerid = (timer_t) newp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Something went wrong. Kill the thread. */
|
||||||
|
pthread_cancel (newp->th);
|
||||||
|
/* Free the resources. */
|
||||||
|
res = INTERNAL_SYSCALL_ERRNO (res, err);
|
||||||
|
err_out:
|
||||||
|
free (newp);
|
||||||
|
__set_errno (res);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
/* When we come here the syscall does not exist. Make sure we
|
||||||
|
do not try to use it again. */
|
||||||
|
__no_posix_timers = -1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
/* Compatibility code. */
|
||||||
|
return compat_timer_create (clock_id, evp, timerid);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifdef timer_create_alias
|
||||||
|
# define timer_create timer_create_alias
|
||||||
|
# endif
|
||||||
|
/* The new system calls are not available. Use the userlevel
|
||||||
|
implementation. */
|
||||||
|
# include <nptl/sysdeps/pthread/timer_create.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,94 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_delete
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# define timer_delete static compat_timer_delete
|
||||||
|
# include <nptl/sysdeps/pthread/timer_delete.c>
|
||||||
|
# undef timer_delete
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef timer_delete_alias
|
||||||
|
# define timer_delete timer_delete_alias
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
timer_delete (timerid)
|
||||||
|
timer_t timerid;
|
||||||
|
{
|
||||||
|
# undef timer_delete
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (__no_posix_timers >= 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
struct timer *kt = (struct timer *) timerid;
|
||||||
|
|
||||||
|
/* Delete the kernel timer object. */
|
||||||
|
int res = INLINE_SYSCALL (timer_delete, 1, kt->ktimerid);
|
||||||
|
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
/* We know the syscall support is available. */
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* We have to get rid of the helper thread if we created one. */
|
||||||
|
if (kt->sigev_notify == SIGEV_THREAD)
|
||||||
|
(void) pthread_cancel (kt->th);
|
||||||
|
|
||||||
|
/* Free the memory. */
|
||||||
|
(void) free (kt);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The kernel timer is not known or something else bad happened.
|
||||||
|
Return the error. */
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (errno != ENOSYS)
|
||||||
|
# endif
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
__no_posix_timers = -1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
return compat_timer_delete (timerid);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifdef timer_delete_alias
|
||||||
|
# define timer_delete timer_delete_alias
|
||||||
|
# endif
|
||||||
|
/* The new system calls are not available. Use the userlevel
|
||||||
|
implementation. */
|
||||||
|
# include <nptl/sysdeps/pthread/timer_delete.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,80 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_getoverrun
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# define timer_getoverrun static compat_timer_getoverrun
|
||||||
|
# include <nptl/sysdeps/pthread/timer_getoverrun.c>
|
||||||
|
# undef timer_getoverrun
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef timer_getoverrun_alias
|
||||||
|
# define timer_getoverrun timer_getoverrun_alias
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
timer_getoverrun (timerid)
|
||||||
|
timer_t timerid;
|
||||||
|
{
|
||||||
|
# undef timer_getoverrun
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (__no_posix_timers == 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
struct timer *kt = (struct timer *) timerid;
|
||||||
|
|
||||||
|
/* Get the information from the kernel. */
|
||||||
|
int res = INLINE_SYSCALL (timer_getoverrun, 1, kt->ktimerid);
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (res != -1 || errno != ENOSYS)
|
||||||
|
{
|
||||||
|
/* We know the syscall support is available. */
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
# endif
|
||||||
|
return res;
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
__no_posix_timers = -1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
return compat_timer_getoverrun (timerid);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifdef timer_getoverrun_alias
|
||||||
|
# define timer_getoverrun timer_getoverrun_alias
|
||||||
|
# endif
|
||||||
|
/* The new system calls are not available. Use the userlevel
|
||||||
|
implementation. */
|
||||||
|
# include <nptl/sysdeps/pthread/timer_getoverr.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,82 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_gettime
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# define timer_gettime static compat_timer_gettime
|
||||||
|
# include <nptl/sysdeps/pthread/timer_gettime.c>
|
||||||
|
# undef timer_gettime
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef timer_gettime_alias
|
||||||
|
# define timer_gettime timer_gettime_alias
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
timer_gettime (timerid, value)
|
||||||
|
timer_t timerid;
|
||||||
|
struct itimerspec *value;
|
||||||
|
{
|
||||||
|
# undef timer_gettime
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (__no_posix_timers == 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
struct timer *kt = (struct timer *) timerid;
|
||||||
|
|
||||||
|
/* Delete the kernel timer object. */
|
||||||
|
int res = INLINE_SYSCALL (timer_gettime, 2, kt->ktimerid, value);
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (res != -1 || errno != ENOSYS)
|
||||||
|
{
|
||||||
|
/* We know the syscall support is available. */
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
# endif
|
||||||
|
return res;
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
__no_posix_timers = -1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
return compat_timer_gettime (timerid, value);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifdef timer_gettime_alias
|
||||||
|
# define timer_gettime timer_gettime_alias
|
||||||
|
# endif
|
||||||
|
/* The new system calls are not available. Use the userlevel
|
||||||
|
implementation. */
|
||||||
|
# include <nptl/sysdeps/pthread/timer_gettime.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,81 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_create
|
||||||
|
/* Helper thread to call the user-provided function. */
|
||||||
|
static void *
|
||||||
|
timer_sigev_thread (void *arg)
|
||||||
|
{
|
||||||
|
struct timer *tk = (struct timer *) arg;
|
||||||
|
|
||||||
|
/* Call the user-provided function. */
|
||||||
|
tk->thrfunc (tk->sival);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Helper function to support starting threads for SIGEV_THREAD. */
|
||||||
|
void *
|
||||||
|
attribute_hidden
|
||||||
|
__timer_helper_thread (void *arg)
|
||||||
|
{
|
||||||
|
/* Block all signals. */
|
||||||
|
sigset_t ss;
|
||||||
|
|
||||||
|
sigfillset (&ss);
|
||||||
|
(void) pthread_sigmask (SIG_BLOCK, &ss, NULL);
|
||||||
|
|
||||||
|
struct timer *tk = (struct timer *) arg;
|
||||||
|
|
||||||
|
/* Synchronize with the parent. */
|
||||||
|
(void) pthread_barrier_wait (&tk->bar);
|
||||||
|
|
||||||
|
/* We will only wait for the signal the kernel will send. */
|
||||||
|
sigemptyset (&ss);
|
||||||
|
sigaddset (&ss, TIMER_SIG);
|
||||||
|
|
||||||
|
/* Endless loop of waiting for signals. The loop is only ended when
|
||||||
|
the thread is canceled. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
siginfo_t si;
|
||||||
|
|
||||||
|
if (sigwaitinfo (&ss, &si) > 0 && si.si_timerid == tk->ktimerid)
|
||||||
|
{
|
||||||
|
/* That the signal we are waiting for. */
|
||||||
|
pthread_t th;
|
||||||
|
(void) pthread_create (&th, &tk->attr, timer_sigev_thread, arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# include <nptl/sysdeps/pthread/timer_routines.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
|
#include "kernel-posix-timers.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __NR_timer_settime
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
# define timer_settime static compat_timer_settime
|
||||||
|
# include <nptl/sysdeps/pthread/timer_settime.c>
|
||||||
|
# undef timer_settime
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef timer_settime_alias
|
||||||
|
# define timer_settime timer_settime_alias
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
timer_settime (timerid, flags, value, ovalue)
|
||||||
|
timer_t timerid;
|
||||||
|
int flags;
|
||||||
|
const struct itimerspec *value;
|
||||||
|
struct itimerspec *ovalue;
|
||||||
|
{
|
||||||
|
# undef timer_settime
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (__no_posix_timers == 0)
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
struct timer *kt = (struct timer *) timerid;
|
||||||
|
|
||||||
|
/* Delete the kernel timer object. */
|
||||||
|
int res = INLINE_SYSCALL (timer_settime, 4, kt->ktimerid, flags,
|
||||||
|
value, ovalue);
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
if (res != -1 || errno != ENOSYS)
|
||||||
|
{
|
||||||
|
/* We know the syscall support is available. */
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
# endif
|
||||||
|
return res;
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
__no_posix_timers = 1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __ASSUME_POSIX_TIMERS
|
||||||
|
return compat_timer_settime (timerid, flags, value, ovalue);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifdef timer_settime_alias
|
||||||
|
# define timer_settime timer_settime_alias
|
||||||
|
# endif
|
||||||
|
/* The new system calls are not available. Use the userlevel
|
||||||
|
implementation. */
|
||||||
|
# include <nptl/sysdeps/pthread/timer_settime.c>
|
||||||
|
#endif
|
|
@ -0,0 +1,7 @@
|
||||||
|
librt {
|
||||||
|
GLIBC_2.3.3 {
|
||||||
|
# Changed timer_t.
|
||||||
|
timer_create; timer_delete; timer_getoverrun; timer_gettime;
|
||||||
|
timer_settime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#define OLD_TIMER_MAX 256
|
||||||
|
|
||||||
|
extern timer_t __compat_timer_list[OLD_TIMER_MAX] attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
|
extern int __timer_create_new (clockid_t clock_id, struct sigevent *evp,
|
||||||
|
timer_t *timerid);
|
||||||
|
extern int __timer_delete_new (timer_t timerid);
|
||||||
|
extern int __timer_getoverrun_new (timer_t timerid);
|
||||||
|
extern int __timer_gettime_new (timer_t timerid, struct itimerspec *value);
|
||||||
|
extern int __timer_settime_new (timer_t timerid, int flags,
|
||||||
|
const struct itimerspec *value,
|
||||||
|
struct itimerspec *ovalue);
|
||||||
|
|
||||||
|
|
||||||
|
extern int __timer_create_old (clockid_t clock_id, struct sigevent *evp,
|
||||||
|
int *timerid);
|
||||||
|
extern int __timer_delete_old (int timerid);
|
||||||
|
extern int __timer_getoverrun_old (int timerid);
|
||||||
|
extern int __timer_gettime_old (int timerid, struct itimerspec *value);
|
||||||
|
extern int __timer_settime_old (int timerid, int flags,
|
||||||
|
const struct itimerspec *value,
|
||||||
|
struct itimerspec *ovalue);
|
|
@ -0,0 +1,66 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include "compat-timer.h"
|
||||||
|
#include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define timer_create_alias __timer_create_new
|
||||||
|
#include "../timer_create.c"
|
||||||
|
|
||||||
|
#undef timer_create
|
||||||
|
versioned_symbol (librt, __timer_create_new, timer_create, GLIBC_2_3_3);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (librt, GLIBC_2_2, GLIBC_2_3_3)
|
||||||
|
timer_t __compat_timer_list[OLD_TIMER_MAX] attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
__timer_create_old (clockid_t clock_id, struct sigevent *evp, int *timerid)
|
||||||
|
{
|
||||||
|
timer_t newp;
|
||||||
|
|
||||||
|
int res = __timer_create_new (clock_id, evp, &newp);
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < OLD_TIMER_MAX; ++i)
|
||||||
|
if (__compat_timer_list[i] == NULL
|
||||||
|
&& ! atomic_compare_and_exchange_bool_acq (&__compat_timer_list[i],
|
||||||
|
newp, NULL))
|
||||||
|
{
|
||||||
|
*timerid = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (__builtin_expect (i == OLD_TIMER_MAX, 0))
|
||||||
|
{
|
||||||
|
/* No free slot. */
|
||||||
|
(void) __timer_delete_new (newp);
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
compat_symbol (librt, __timer_create_old, timer_create, GLIBC_2_2);
|
||||||
|
#endif
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include "compat-timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define timer_delete_alias __timer_delete_new
|
||||||
|
#include "../timer_delete.c"
|
||||||
|
|
||||||
|
#undef timer_delete
|
||||||
|
versioned_symbol (librt, __timer_delete_new, timer_delete, GLIBC_2_3_3);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (librt, GLIBC_2_2, GLIBC_2_3_3)
|
||||||
|
int
|
||||||
|
__timer_delete_old (int timerid)
|
||||||
|
{
|
||||||
|
int res = __timer_delete_new (__compat_timer_list[timerid]);
|
||||||
|
|
||||||
|
if (res == 0)
|
||||||
|
/* Successful timer deletion, now free the index. We only need to
|
||||||
|
store a word and that better be atomic. */
|
||||||
|
__compat_timer_list[timerid] = NULL;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
compat_symbol (librt, __timer_delete_old, timer_delete, GLIBC_2_2);
|
||||||
|
#endif
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include "compat-timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define timer_getoverrun_alias __timer_getoverrun_new
|
||||||
|
#include "../timer_getoverr.c"
|
||||||
|
|
||||||
|
#undef timer_getoverrun
|
||||||
|
versioned_symbol (librt, __timer_getoverrun_new, timer_getoverrun,
|
||||||
|
GLIBC_2_3_3);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (librt, GLIBC_2_2, GLIBC_2_3_3)
|
||||||
|
int
|
||||||
|
__timer_getoverrun_old (int timerid)
|
||||||
|
{
|
||||||
|
return __timer_getoverrun_new (__compat_timer_list[timerid]);
|
||||||
|
}
|
||||||
|
compat_symbol (librt, __timer_getoverrun_old, timer_getoverrun, GLIBC_2_2);
|
||||||
|
#endif
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include "compat-timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define timer_gettime_alias __timer_gettime_new
|
||||||
|
#include "../timer_gettime.c"
|
||||||
|
|
||||||
|
#undef timer_gettime
|
||||||
|
versioned_symbol (librt, __timer_gettime_new, timer_gettime, GLIBC_2_3_3);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (librt, GLIBC_2_2, GLIBC_2_3_3)
|
||||||
|
int
|
||||||
|
__timer_gettime_old (int timerid, struct itimerspec *value)
|
||||||
|
{
|
||||||
|
return __timer_gettime_new (__compat_timer_list[timerid], value);
|
||||||
|
}
|
||||||
|
compat_symbol (librt, __timer_gettime_old, timer_gettime, GLIBC_2_2);
|
||||||
|
#endif
|
|
@ -0,0 +1,40 @@
|
||||||
|
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include "compat-timer.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define timer_settime_alias __timer_settime_new
|
||||||
|
#include "../timer_settime.c"
|
||||||
|
|
||||||
|
#undef timer_settime
|
||||||
|
versioned_symbol (librt, __timer_settime_new, timer_settime, GLIBC_2_3_3);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (librt, GLIBC_2_2, GLIBC_2_3_3)
|
||||||
|
int
|
||||||
|
__timer_settime_old (int timerid, int flags, const struct itimerspec *value,
|
||||||
|
struct itimerspec *ovalue)
|
||||||
|
{
|
||||||
|
return __timer_settime_new (__compat_timer_list[timerid], flags,
|
||||||
|
value, ovalue);
|
||||||
|
}
|
||||||
|
compat_symbol (librt, __timer_settime_old, timer_settime, GLIBC_2_2);
|
||||||
|
#endif
|
|
@ -30,9 +30,6 @@
|
||||||
/* Alignment requirement for TCB. */
|
/* Alignment requirement for TCB. */
|
||||||
#define TCB_ALIGNMENT 16
|
#define TCB_ALIGNMENT 16
|
||||||
|
|
||||||
/* The signal used for asynchronous cancelation. */
|
|
||||||
#define SIGCANCEL __SIGRTMIN
|
|
||||||
|
|
||||||
|
|
||||||
/* Location of current stack frame. The frame pointer is not usable. */
|
/* Location of current stack frame. The frame pointer is not usable. */
|
||||||
#define CURRENT_STACK_FRAME \
|
#define CURRENT_STACK_FRAME \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
||||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
||||||
#define __KEY_T_TYPE __S32_TYPE
|
#define __KEY_T_TYPE __S32_TYPE
|
||||||
#define __CLOCKID_T_TYPE __S32_TYPE
|
#define __CLOCKID_T_TYPE __S32_TYPE
|
||||||
#define __TIMER_T_TYPE __S32_TYPE
|
#define __TIMER_T_TYPE void *
|
||||||
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
||||||
#define __FSID_T_TYPE struct { int __val[2]; }
|
#define __FSID_T_TYPE struct { int __val[2]; }
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* siginfo_t, sigevent and constants. Linux version.
|
/* siginfo_t, sigevent and constants. Linux version.
|
||||||
Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
|
Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -69,8 +69,10 @@ typedef struct siginfo
|
||||||
/* POSIX.1b timers. */
|
/* POSIX.1b timers. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned int _timer1;
|
int si_tid; /* Timer ID. */
|
||||||
unsigned int _timer2;
|
int si_overrun; /* Overrun count. */
|
||||||
|
char _pad[sizeof (__uid_t) - sizeof (int)];
|
||||||
|
sigval_t si_sigval; /* Signal value. */
|
||||||
} _timer;
|
} _timer;
|
||||||
|
|
||||||
/* POSIX.1b signals. */
|
/* POSIX.1b signals. */
|
||||||
|
@ -110,8 +112,8 @@ typedef struct siginfo
|
||||||
/* X/Open requires some more fields with fixed names. */
|
/* X/Open requires some more fields with fixed names. */
|
||||||
# define si_pid _sifields._kill.si_pid
|
# define si_pid _sifields._kill.si_pid
|
||||||
# define si_uid _sifields._kill.si_uid
|
# define si_uid _sifields._kill.si_uid
|
||||||
# define si_timer1 _sifields._timer._timer1
|
# define si_timerid _sifields._timer.si_tid
|
||||||
# define si_timer2 _sifields._timer._timer2
|
# define si_overrun _sifields._timer.si_overrun
|
||||||
# define si_status _sifields._sigchld.si_status
|
# define si_status _sifields._sigchld.si_status
|
||||||
# define si_utime _sifields._sigchld.si_utime
|
# define si_utime _sifields._sigchld.si_utime
|
||||||
# define si_stime _sifields._sigchld.si_stime
|
# define si_stime _sifields._sigchld.si_stime
|
||||||
|
@ -280,6 +282,10 @@ typedef struct sigevent
|
||||||
{
|
{
|
||||||
int _pad[__SIGEV_PAD_SIZE];
|
int _pad[__SIGEV_PAD_SIZE];
|
||||||
|
|
||||||
|
/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
|
||||||
|
thread to receive the signal. */
|
||||||
|
__pid_t _tid;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void (*_function) (sigval_t); /* Function to start. */
|
void (*_function) (sigval_t); /* Function to start. */
|
||||||
|
@ -299,8 +305,11 @@ enum
|
||||||
# define SIGEV_SIGNAL SIGEV_SIGNAL
|
# define SIGEV_SIGNAL SIGEV_SIGNAL
|
||||||
SIGEV_NONE, /* Other notification: meaningless. */
|
SIGEV_NONE, /* Other notification: meaningless. */
|
||||||
# define SIGEV_NONE SIGEV_NONE
|
# define SIGEV_NONE SIGEV_NONE
|
||||||
SIGEV_THREAD /* Deliver via thread creation. */
|
SIGEV_THREAD, /* Deliver via thread creation. */
|
||||||
# define SIGEV_THREAD SIGEV_THREAD
|
# define SIGEV_THREAD SIGEV_THREAD
|
||||||
|
|
||||||
|
SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */
|
||||||
|
#define SIGEV_THREAD_ID SIGEV_THREAD_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* have _SIGNAL_H. */
|
#endif /* have _SIGNAL_H. */
|
||||||
|
|
Loading…
Reference in New Issue