* malloc/Makefile: Change all references to memprof into memusage.
	* malloc/memprof.c: Rename to...
	* malloc/memusage.c: ...this.  New file.
	* malloc/memprof.sh: Rename to...
	* malloc/memusage.sh: ...this.  New file.
	* malloc/memprofstat.c: Rename to...
	* malloc/memusagestat.c: ...this.  New file.
This commit is contained in:
Ulrich Drepper 2000-06-20 04:46:22 +00:00
parent ea97f90c9a
commit ba80a015ee
9 changed files with 135 additions and 73 deletions

View File

@ -1,5 +1,13 @@
2000-06-19 Ulrich Drepper <drepper@redhat.com> 2000-06-19 Ulrich Drepper <drepper@redhat.com>
* malloc/Makefile: Change all references to memprof into memusage.
* malloc/memprof.c: Rename to...
* malloc/memusage.c: ...this. New file.
* malloc/memprof.sh: Rename to...
* malloc/memusage.sh: ...this. New file.
* malloc/memprofstat.c: Rename to...
* malloc/memusagestat.c: ...this. New file.
* elf/sprof.c (print_version): Update year. * elf/sprof.c (print_version): Update year.
* elf/sprof.c (load_shobj): Don't always add load address to dynamic * elf/sprof.c (load_shobj): Don't always add load address to dynamic

View File

@ -1,3 +1,15 @@
2000-06-19 H.J. Lu <hjl@gnu.org>
* spinlock.h (HAS_COMPARE_AND_SWAP): Defined if
HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS is defined.
(compare_and_swap_with_release_semantics): New. Default to
compare_and_swap if HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
is not defined.
* spinlock.c (__pthread_unlock): Call
compare_and_swap_with_release_semantics () instead of
compare_and_swap ().
2000-06-19 Ulrich Drepper <drepper@redhat.com> 2000-06-19 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/timer_create.c: Use _set_errno instead of assigning * sysdeps/pthread/timer_create.c: Use _set_errno instead of assigning

View File

@ -95,7 +95,9 @@ again:
/* No threads are waiting for this lock. Please note that we also /* No threads are waiting for this lock. Please note that we also
enter this case if the lock is not taken at all. If this wouldn't enter this case if the lock is not taken at all. If this wouldn't
be done here we would crash further down. */ be done here we would crash further down. */
if (! compare_and_swap(&lock->__status, oldstatus, 0, &lock->__spinlock)) if (! compare_and_swap_with_release_semantics (&lock->__status,
oldstatus, 0,
&lock->__spinlock))
goto again; goto again;
return 0; return 0;
} }
@ -126,9 +128,9 @@ again:
/* If max prio thread is at head, remove it with compare-and-swap /* If max prio thread is at head, remove it with compare-and-swap
to guard against concurrent lock operation */ to guard against concurrent lock operation */
thr = (pthread_descr) oldstatus; thr = (pthread_descr) oldstatus;
if (! compare_and_swap(&lock->__status, if (! compare_and_swap_with_release_semantics
oldstatus, (long)(thr->p_nextlock), (&lock->__status, oldstatus, (long)(thr->p_nextlock),
&lock->__spinlock)) &lock->__spinlock))
goto again; goto again;
} else { } else {
/* No risk of concurrent access, remove max prio thread normally */ /* No risk of concurrent access, remove max prio thread normally */

View File

@ -12,6 +12,25 @@
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU Library General Public License for more details. */ /* GNU Library General Public License for more details. */
/* There are 2 compare and swap synchronization primitives with
different semantics:
1. compare_and_swap, which has acquire semantics (i.e. it
completes befor subsequent writes.)
2. compare_and_swap_with_release_semantics, which has release
semantics (it completes after previous writes.)
For those platforms on which they are the same. HAS_COMPARE_AND_SWAP
should be defined. For those platforms on which they are different,
HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS has to be defined. */
#ifndef HAS_COMPARE_AND_SWAP
#ifdef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
#define HAS_COMPARE_AND_SWAP
#endif
#endif
#if defined(TEST_FOR_COMPARE_AND_SWAP) #if defined(TEST_FOR_COMPARE_AND_SWAP)
extern int __pthread_has_cas; extern int __pthread_has_cas;
@ -29,6 +48,18 @@ static inline int compare_and_swap(long * ptr, long oldval, long newval,
#elif defined(HAS_COMPARE_AND_SWAP) #elif defined(HAS_COMPARE_AND_SWAP)
#ifdef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
static inline int
compare_and_swap_with_release_semantics (long * ptr, long oldval,
long newval, int * spinlock)
{
return __compare_and_swap_with_release_semantics (ptr, oldval,
newval);
}
#endif
static inline int compare_and_swap(long * ptr, long oldval, long newval, static inline int compare_and_swap(long * ptr, long oldval, long newval,
int * spinlock) int * spinlock)
{ {
@ -48,6 +79,10 @@ static inline int compare_and_swap(long * ptr, long oldval, long newval,
#endif #endif
#ifndef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
#define compare_and_swap_with_release_semantics compare_and_swap
#endif
/* Internal locks */ /* Internal locks */
extern void internal_function __pthread_lock(struct _pthread_fastlock * lock, extern void internal_function __pthread_lock(struct _pthread_fastlock * lock,

View File

@ -1,3 +1,8 @@
2000-06-19 Ulrich Drepper <drepper@redhat.com>
* locales/pt_BR: Correct day and month names.
Patch by Henrique M. Holschuh <hmh@rcm.org.br>.
2000-06-13 Ulrich Drepper <drepper@redhat.com> 2000-06-13 Ulrich Drepper <drepper@redhat.com>
* Makefile (ld-test-srcs): Add tests/test6.c. * Makefile (ld-test-srcs): Add tests/test6.c.

View File

@ -58,35 +58,35 @@ grouping 0;0
END LC_NUMERIC END LC_NUMERIC
LC_TIME LC_TIME
abday "<d><o><m>";"<s><e><g>";/ abday "<D><o><m>";"<S><e><g>";/
"<t><e><r>";"<q><u><a>";/ "<T><e><r>";"<Q><u><a>";/
"<q><u><i>";"<s><e><x>";/ "<Q><u><i>";"<S><e><x>";/
"<s><a'><b>" "<S><a'><b>"
day "<d><o><m><i><n><g><o>";/ day "<D><o><m><i><n><g><o>";/
"<s><e><g><u><n><d><a>";/ "<S><e><g><u><n><d><a>";/
"<t><e><r><c,><a>";/ "<T><e><r><c,><a>";/
"<q><u><a><r><t><a>";/ "<Q><u><a><r><t><a>";/
"<q><u><i><n><t><a>";/ "<Q><u><i><n><t><a>";/
"<s><e><x><t><a>";/ "<S><e><x><t><a>";/
"<s><a'><b><a><d><o>" "<S><a'><b><a><d><o>"
abmon "<j><a><n>";"<f><e><v>";/ abmon "<J><a><n>";"<F><e><v>";/
"<m><a><r>";"<a><b><r>";/ "<M><a><r>";"<A><b><r>";/
"<m><a><i>";"<j><u><n>";/ "<M><a><i>";"<J><u><n>";/
"<j><u><l>";"<a><g><o>";/ "<J><u><l>";"<A><g><o>";/
"<s><e><t>";"<o><u><t>";/ "<S><e><t>";"<O><u><t>";/
"<n><o><v>";"<d><e><z>" "<N><o><v>";"<D><e><z>"
mon "<j><a><n><e><i><r><o>";/ mon "<J><a><n><e><i><r><o>";/
"<f><e><v><e><r><e><i><r><o>";/ "<F><e><v><e><r><e><i><r><o>";/
"<m><a><r><c,><o>";/ "<M><a><r><c,><o>";/
"<a><b><r><i><l>";/ "<A><b><r><i><l>";/
"<m><a><i><o>";/ "<M><a><i><o>";/
"<j><u><n><h><o>";/ "<J><u><n><h><o>";/
"<j><u><l><h><o>";/ "<J><u><l><h><o>";/
"<a><g><o><s><t><o>";/ "<A><g><o><s><t><o>";/
"<s><e><t><e><m><b><r><o>";/ "<S><e><t><e><m><b><r><o>";/
"<o><u><t><u><b><r><o>";/ "<O><u><t><u><b><r><o>";/
"<n><o><v><e><m><b><r><o>";/ "<N><o><v><e><m><b><r><o>";/
"<d><e><z><e><m><b><r><o>" "<D><e><z><e><m><b><r><o>"
d_t_fmt "<%><a><SP><%><d><SP><%><b><SP><%><Y><SP><%><T><SP><%><Z>" d_t_fmt "<%><a><SP><%><d><SP><%><b><SP><%><Y><SP><%><T><SP><%><Z>"
d_fmt "<%><d><-><%><m><-><%><Y>" d_fmt "<%><d><-><%><m><-><%><Y>"
t_fmt "<%><T>" t_fmt "<%><T>"

View File

@ -1,5 +1,5 @@
/* Profile heap and stack memory usage of running program. /* Profile heap and stack memory usage of running program.
Copyright (C) 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1998, 1999, 2000 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@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -28,7 +28,7 @@
#include <unistd.h> #include <unistd.h>
#include <sys/time.h> #include <sys/time.h>
#include <memprof.h> #include <memusage.h>
/* Pointer to the real functions. These are determined used `dlsym' /* Pointer to the real functions. These are determined used `dlsym'
when really needed. */ when really needed. */
@ -164,24 +164,24 @@ init (void)
/* Find out whether this is the program we are supposed to profile. /* Find out whether this is the program we are supposed to profile.
For this the name in the variable `__progname' must match the one For this the name in the variable `__progname' must match the one
given in the environment variable MEMPROF_PROG_NAME. If the variable given in the environment variable MEMUSAGE_PROG_NAME. If the variable
is not present every program assumes it should be profiling. is not present every program assumes it should be profiling.
If this is the program open a file descriptor to the output file. If this is the program open a file descriptor to the output file.
We will write to it whenever the buffer overflows. The name of the We will write to it whenever the buffer overflows. The name of the
output file is determined by the environment variable MEMPROF_OUTPUT. output file is determined by the environment variable MEMUSAGE_OUTPUT.
If the environment variable MEMPROF_BUFFER_SIZE is set its numerical If the environment variable MEMUSAGE_BUFFER_SIZE is set its numerical
value determines the size of the internal buffer. The number gives value determines the size of the internal buffer. The number gives
the number of elements in the buffer. By setting the number to one the number of elements in the buffer. By setting the number to one
one effectively selects unbuffered operation. one effectively selects unbuffered operation.
If MEMPROF_NO_TIMER is not present an alarm handler is installed If MEMUSAGE_NO_TIMER is not present an alarm handler is installed
which at the highest possible frequency records the stack pointer. */ which at the highest possible frequency records the stack pointer. */
static void static void
me (void) me (void)
{ {
const char *env = getenv ("MEMPROF_PROG_NAME"); const char *env = getenv ("MEMUSAGE_PROG_NAME");
size_t prog_len = strlen (__progname); size_t prog_len = strlen (__progname);
if (env != NULL) if (env != NULL)
{ {
@ -195,7 +195,7 @@ me (void)
/* Only open the file if it's really us. */ /* Only open the file if it's really us. */
if (!not_me && fd == -1) if (!not_me && fd == -1)
{ {
const char *outname = getenv ("MEMPROF_OUTPUT"); const char *outname = getenv ("MEMUSAGE_OUTPUT");
if (outname != NULL) if (outname != NULL)
{ {
fd = creat (outname, 0666); fd = creat (outname, 0666);
@ -216,15 +216,15 @@ me (void)
/* Determine the buffer size. We use the default if the /* Determine the buffer size. We use the default if the
environment variable is not present. */ environment variable is not present. */
buffer_size = DEFAULT_BUFFER_SIZE; buffer_size = DEFAULT_BUFFER_SIZE;
if (getenv ("MEMPROF_BUFFER_SIZE") != NULL) if (getenv ("MEMUSAGE_BUFFER_SIZE") != NULL)
{ {
buffer_size = atoi (getenv ("MEMPROF_BUFFER_SIZE")); buffer_size = atoi (getenv ("MEMUSAGE_BUFFER_SIZE"));
if (buffer_size == 0 || buffer_size > DEFAULT_BUFFER_SIZE) if (buffer_size == 0 || buffer_size > DEFAULT_BUFFER_SIZE)
buffer_size = DEFAULT_BUFFER_SIZE; buffer_size = DEFAULT_BUFFER_SIZE;
} }
/* Possibly enable timer-based stack pointer retrieval. */ /* Possibly enable timer-based stack pointer retrieval. */
if (getenv ("MEMPROF_NO_TIMER") == NULL) if (getenv ("MEMUSAGE_NO_TIMER") == NULL)
{ {
struct sigaction act; struct sigaction act;

View File

@ -1,5 +1,5 @@
#! @BASH@ #! @BASH@
# Copyright (C) 1999 Free Software Foundation, Inc. # Copyright (C) 1999, 2000 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@gnu.org>, 1999. # Contributed by Ulrich Drepper <drepper@gnu.org>, 1999.
@ -18,24 +18,24 @@
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
memprofso=@LIBDIR@/libmemprof.so memusageso=@LIBDIR@/libmemusage.so
memprofstat=@BINDIR@/memprofstat memusagestat=@BINDIR@/memusagestat
# Print usage message. # Print usage message.
do_usage() { do_usage() {
echo >&2 $"Try \`memprof --help' for more information." echo >&2 $"Try \`memusage --help' for more information."
exit 1 exit 1
} }
# Message for missing argument. # Message for missing argument.
do_missing_arg() { do_missing_arg() {
echo >&2 $"memprof: option \`$1' requires an argument" echo >&2 $"memusage: option \`$1' requires an argument"
do_usage do_usage
} }
# Print help message # Print help message
do_help() { do_help() {
echo $"Usage: memprof [OPTION]... PROGRAM [PROGRAMOPTION]... echo $"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]...
Profile memory usage of PROGRAM. Profile memory usage of PROGRAM.
-n,--progname=NAME Name of the program file to profile -n,--progname=NAME Name of the program file to profile
@ -64,8 +64,8 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.org>."
} }
do_version() { do_version() {
echo 'memprof (GNU libc) @VERSION@' echo 'memusage (GNU libc) @VERSION@'
echo $"Copyright (C) 1999 Free Software Foundation, Inc. echo $"Copyright (C) 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Ulrich Drepper." Written by Ulrich Drepper."
@ -82,7 +82,7 @@ while test $# -gt 0; do
do_help do_help
;; ;;
--us | --usa | --usag | --usage) --us | --usa | --usag | --usage)
echo $"Syntax: memprof [--data=FILE] [--progname=NAME] [--png=FILE] [--unbuffered] echo $"Syntax: memusage [--data=FILE] [--progname=NAME] [--png=FILE] [--unbuffered]
[--buffer=SIZE] [--no-timer] [--time-based] [--total] [--buffer=SIZE] [--no-timer] [--time-based] [--total]
[--title=STRING] [--x-size=SIZE] [--y-size=SIZE] [--title=STRING] [--x-size=SIZE] [--y-size=SIZE]
PROGRAM [PROGRAMOPTION]..." PROGRAM [PROGRAMOPTION]..."
@ -135,43 +135,43 @@ while test $# -gt 0; do
notimer=yes notimer=yes
;; ;;
-t | --tim | --time | --time- | --time-b | --time-ba | --time-bas | --time-base | --time-based) -t | --tim | --time | --time- | --time-b | --time-ba | --time-bas | --time-base | --time-based)
memprofstat_args="$memprofstat_args -t" memusagestat_args="$memusagestat_args -t"
;; ;;
-T | --to | --tot | --tota | --total) -T | --to | --tot | --tota | --total)
memprofstat_args="$memprofstat_args -T" memusagestat_args="$memusagestat_args -T"
;; ;;
--tit | --titl | --title) --tit | --titl | --title)
if test $# -eq 1; then if test $# -eq 1; then
do_missing_arg $1 do_missing_arg $1
fi fi
shift shift
memprofstat_args="$memprofstat_args -s $1" memusagestat_args="$memusagestat_args -s $1"
;; ;;
--tit=* | --titl=* | --title=*) --tit=* | --titl=* | --title=*)
memprofstat_args="$memprofstat_args -s ${1##*=}" memusagestat_args="$memusagestat_args -s ${1##*=}"
;; ;;
-x | --x | --x- | --x-s | --x-si | --x-siz | --x-size) -x | --x | --x- | --x-s | --x-si | --x-siz | --x-size)
if test $# -eq 1; then if test $# -eq 1; then
do_missing_arg $1 do_missing_arg $1
fi fi
shift shift
memprofstat_args="$memprofstat_args -x $1" memusagestat_args="$memusagestat_args -x $1"
;; ;;
--x=* | --x-=* | --x-s=* | --x-si=* | --x-siz=* | --x-size=*) --x=* | --x-=* | --x-s=* | --x-si=* | --x-siz=* | --x-size=*)
memprofstat_args="$memprofstat_args -x ${1##*=}" memusagestat_args="$memusagestat_args -x ${1##*=}"
;; ;;
-y | --y | --y- | --y-s | --y-si | --y-siz | --y-size) -y | --y | --y- | --y-s | --y-si | --y-siz | --y-size)
if test $# -eq 1; then if test $# -eq 1; then
do_missing_arg $1 do_missing_arg $1
fi fi
shift shift
memprofstat_args="$memprofstat_args -y $1" memusagestat_args="$memusagestat_args -y $1"
;; ;;
--y=* | --y-=* | --y-s=* | --y-si=* | --y-siz=* | --y-size=*) --y=* | --y-=* | --y-s=* | --y-si=* | --y-siz=* | --y-size=*)
memprofstat_args="$memprofstat_args -y ${1##*=}" memusagestat_args="$memusagestat_args -y ${1##*=}"
;; ;;
--p | --p=* | --t | --t=* | --ti | --ti=* | --u) --p | --p=* | --t | --t=* | --ti | --ti=* | --u)
echo >&2 $"memprof: option \`${1##*=}' is ambiguous" echo >&2 $"memusage: option \`${1##*=}' is ambiguous"
do_usage do_usage
;; ;;
--) --)
@ -180,7 +180,7 @@ while test $# -gt 0; do
break break
;; ;;
--*) --*)
echo >&2 $"memprof: unrecognized option \`$1'" echo >&2 $"memusage: unrecognized option \`$1'"
do_usage do_usage
;; ;;
*) *)
@ -198,35 +198,35 @@ if test $# -eq 0; then
fi fi
# This will be in the environment. # This will be in the environment.
add_env="LD_PRELOAD=$memprofso" add_env="LD_PRELOAD=$memusageso"
# Generate data file name. # Generate data file name.
datafile= datafile=
if test -n "$data"; then if test -n "$data"; then
datafile="$data" datafile="$data"
elif test -n "$png"; then elif test -n "$png"; then
datafile=$(mktemp ${TMPDIR:-/tmp}/memprof.XXXXXX 2> /dev/null) datafile=$(mktemp ${TMPDIR:-/tmp}/memusage.XXXXXX 2> /dev/null)
if test $? -ne 0; then if test $? -ne 0; then
# Lame, but if there is no `mktemp' program the user cannot expect more. # Lame, but if there is no `mktemp' program the user cannot expect more.
if test "$RANDOM" != "$RANDOM"; then if test "$RANDOM" != "$RANDOM"; then
datafile=${TMPDIR:-/tmp}/memprof.$RANDOM datafile=${TMPDIR:-/tmp}/memusage.$RANDOM
else else
datafile=${TMPDIR:-/tmp}/memprof.$$ datafile=${TMPDIR:-/tmp}/memusage.$$
fi fi
fi fi
fi fi
if test -n "$datafile"; then if test -n "$datafile"; then
add_env="$add_env MEMPROF_OUTPUT=$datafile" add_env="$add_env MEMUSAGE_OUTPUT=$datafile"
fi fi
# Set buffer size. # Set buffer size.
if test -n "$buffer"; then if test -n "$buffer"; then
add_env="$add_env MEMPROF_BUFFER_SIZE=$buffer" add_env="$add_env MEMUSAGE_BUFFER_SIZE=$buffer"
fi fi
# Disable timers. # Disable timers.
if test -n "$notimer"; then if test -n "$notimer"; then
add_env="$add_env MEMPROF_NO_TIMER=yes" add_env="$add_env MEMUSAGE_NO_TIMER=yes"
fi fi
# Execute the program itself. # Execute the program itself.
@ -241,7 +241,7 @@ if test -n "$png" -a -n "$datafile" -a -s "$datafile"; then
*.png) ;; *.png) ;;
*) png="$png.png" ;; *) png="$png.png" ;;
esac esac
$memprofstat $memprofstat_args "$datafile" "$png" $memusagestat $memusagestat_args "$datafile" "$png"
fi fi
if test -z "$data" -a -n "$datafile"; then if test -z "$data" -a -n "$datafile"; then

View File

@ -1,5 +1,5 @@
/* Generate graphic from memory profiling data. /* Generate graphic from memory profiling data.
Copyright (C) 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1998, 1999, 2000 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@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -191,7 +191,7 @@ main (int argc, char *argv[])
if (maxsize_heap == 0 && maxsize_stack == 0) if (maxsize_heap == 0 && maxsize_stack == 0)
{ {
/* The program aborted before memprof was able to write the /* The program aborted before memusage was able to write the
information about the maximum heap and stack use. Repair information about the maximum heap and stack use. Repair
the file now. */ the file now. */
struct entry next; struct entry next;