From ce6e047fbb353e1d2faf15ab104a19db609b622b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 6 Jul 2004 04:26:42 +0000 Subject: Update. 2004-07-05 Ulrich Drepper * elf/dl-init.c: Don't define and use _dl_starting_up if HAVE_INLINED_SYSCALLS is defined and the variable is not used. * elf/dl-support.c: Likewise. * elf/rtld.c: Likewise. * elf/dl-misc.c (_dl_debug_vdprintf): Use writev syscall directly if HAVE_INLINED_SYSCALLS is defined. * sysdeps/powerpc/powerpc64/dl-machine.h: Don't rest _dl_starting_up here. * sysdeps/powerpc/powerpc32/dl-start.S: Likewise. * sysdeps/unix/sysv/linux/configure.in: Define HAVE_INLINED_SYSCALLS. * config.h.in: Add entry for HAVE_INLINED_SYSCALLS. * sysdeps/posix/profil.c: If compiled for ld.so, omit code which is needed to stop profiling. * elf/dl-open.c (dl_open_worker): If a newly opened object is to be profile make sure it cannot be unloaded. * sysdeps/unix/sysv/linux/dl-origin.c: Inline readlink syscall. * sysdeps/unix/sysv/linux/fcntl.c: If compiled without cancellation support, make sure the helper function is inlined. * sysdeps/unix/sysv/linux/pread.c: Likewise. * sysdeps/unix/sysv/linux/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Likewise. --- sysdeps/posix/profil.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'sysdeps/posix/profil.c') diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c index d789c121cd..3c2e1dfa07 100644 --- a/sysdeps/posix/profil.c +++ b/sysdeps/posix/profil.c @@ -1,5 +1,5 @@ /* Low-level statistical profiling support function. Mostly POSIX.1 version. - Copyright (C) 1996,97,98,2002 Free Software Foundation, Inc. + Copyright (C) 1996,97,98,2002, 2004 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 @@ -62,10 +62,13 @@ profil_count (void *pc) int __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) { - static struct sigaction oact; - static struct itimerval otimer; struct sigaction act; struct itimerval timer; +#ifndef IS_IN_rtld + static struct sigaction oact; + static struct itimerval otimer; +# define oact_ptr &oact +# define otimer_ptr &otimer if (sample_buffer == NULL) { @@ -88,6 +91,12 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) || __sigaction (SIGPROF, &oact, NULL) < 0) return -1; } +#else + /* In ld.so profiling should never be disabled once it runs. */ + //assert (sample_buffer != NULL); +# define oact_ptr NULL +# define otimer_ptr NULL +#endif samples = sample_buffer; nsamples = size / sizeof *samples; @@ -97,13 +106,13 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) act.sa_handler = (sighandler_t) &profil_counter; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); - if (__sigaction (SIGPROF, &act, &oact) < 0) + if (__sigaction (SIGPROF, &act, oact_ptr) < 0) return -1; timer.it_value.tv_sec = 0; timer.it_value.tv_usec = 1; timer.it_interval = timer.it_value; - return __setitimer (ITIMER_PROF, &timer, &otimer); + return __setitimer (ITIMER_PROF, &timer, otimer_ptr); } weak_alias (__profil, profil) -- cgit v1.2.3