about summary refs log tree commit diff
path: root/sysdeps/posix/profil.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-07-06 04:26:42 +0000
committerUlrich Drepper <drepper@redhat.com>2004-07-06 04:26:42 +0000
commitce6e047fbb353e1d2faf15ab104a19db609b622b (patch)
tree3cf56ba767e54e26c5a7bfedc235728d457c9093 /sysdeps/posix/profil.c
parent2dd18ce2b2dfecc737479548f5b6d1784d90fe79 (diff)
downloadglibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.tar.gz
glibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.tar.xz
glibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.zip
Update.
2004-07-05  Ulrich Drepper  <drepper@redhat.com>

	* 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.
Diffstat (limited to 'sysdeps/posix/profil.c')
-rw-r--r--sysdeps/posix/profil.c19
1 files changed, 14 insertions, 5 deletions
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)