diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | malloc/memusage.c | 8 |
2 files changed, 8 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index 66534b1121..fafcde5e4b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2009-02-06 Ulrich Drepper <drepper@redhat.com> + * malloc/memusage.c (update_data): Fix handling of wrapping back + to the beginning of the buffer. + [BZ #9823] * stdio-common/psignal.c (psignal): Fix test for empty string. diff --git a/malloc/memusage.c b/malloc/memusage.c index d11e9e6ed5..6c67a8c2e8 100644 --- a/malloc/memusage.c +++ b/malloc/memusage.c @@ -1,5 +1,5 @@ /* Profile heap and stack memory usage of running program. - Copyright (C) 1998-2002, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1998-2002, 2004-2006, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -18,6 +18,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <assert.h> #include <atomic.h> #include <dlfcn.h> #include <errno.h> @@ -168,10 +169,11 @@ update_data (struct header *result, size_t len, size_t old_len) this fails because of another thread increasing the counter it does not matter since that thread will take care of the correction. */ - unsigned int reset = idx - 2 * buffer_size; - catomic_compare_and_exchange_val_acq (&buffer_size, reset, idx); + uatomic32_t reset = idx % (2 * buffer_size); + catomic_compare_and_exchange_val_acq (&buffer_cnt, reset, idx); idx = reset; } + assert (idx < 2 * DEFAULT_BUFFER_SIZE); buffer[idx].heap = current_heap; buffer[idx].stack = current_stack; |