Re: [PATCH, libbacktrace] Don't call __sync_lock_test_and_set if we don't have sync functions
On Sun, Dec 9, 2012 at 11:08 AM, John David Anglin d...@hiauly1.hia.nrc.ca wrote: On hppa*-*-hpux*, we don't have sync functions. However, __sync_lock_test_and_set is called in backtrace_alloc and backtrace_free. This causes an abort before ICE proccessing is fully complete. hppa64 is an ELF target and backtraces are nominally supported. The attached change avoids calling __sync_lock_test_and_set if we don't have sync functions. As a result, the memory is leaked. Sorry for the delay. I think it's better to fix this the same way we handle the other sync functions, as in this patch. Bootstrapped and ran libbacktrace and go testsuites on x86_64-unknown-linux-gnu. Committed to mainline. Ian 2013-01-01 Ian Lance Taylor i...@google.com PR other/55536 * mmap.c (backtrace_alloc): Don't call sync functions if not threaded. (backtrace_free): Likewise. foo.patch Description: Binary data
Re: [PATCH, libbacktrace] Don't call __sync_lock_test_and_set if we don't have sync functions
Ping. On 9-Dec-12, at 2:08 PM, John David Anglin wrote: On hppa*-*-hpux*, we don't have sync functions. However, __sync_lock_test_and_set is called in backtrace_alloc and backtrace_free. This causes an abort before ICE proccessing is fully complete. hppa64 is an ELF target and backtraces are nominally supported. The attached change avoids calling __sync_lock_test_and_set if we don't have sync functions. As a result, the memory is leaked. This fixes the btest failure. OK for trunk? Dave -- J. David Anglin dave.ang...@nrc-cnrc.gc.ca National Research Council of Canada (613) 990-0752 (FAX: 952-6602) 2012-12-09 John David Anglin dave.ang...@nrc-cnrc.gc.ca * mmap.c: Define HAVE_SYNC_FUNCTIONS if not defined. (backtrace_alloc): Don't call __sync_lock_test_and_set if we don't have sync functions. (backtrace_free): Likewise. Index: mmap.c === --- mmap.c (revision 194055) +++ mmap.c (working copy) @@ -49,6 +49,10 @@ #define MAP_ANONYMOUS MAP_ANON #endif +#ifndef HAVE_SYNC_FUNCTIONS +#define HAVE_SYNC_FUNCTIONS 0 +#endif + /* A list of free memory blocks. */ struct backtrace_freelist_struct @@ -96,7 +100,7 @@ using mmap. __sync_lock_test_and_set returns the old state of the lock, so we have acquired it if it returns 0. */ - if (!__sync_lock_test_and_set (state-lock_alloc, 1)) + if (HAVE_SYNC_FUNCTIONS !__sync_lock_test_and_set (state- lock_alloc, 1)) { for (pp = state-freelist; *pp != NULL; pp = (*pp)-next) { @@ -158,7 +162,7 @@ If we can't acquire the lock, just leak the memory. __sync_lock_test_and_set returns the old state of the lock, so we have acquired it if it returns 0. */ - if (!__sync_lock_test_and_set (state-lock_alloc, 1)) + if (HAVE_SYNC_FUNCTIONS !__sync_lock_test_and_set (state- lock_alloc, 1)) { backtrace_free_locked (state, addr, size); -- John David Anglin dave.ang...@bell.net
[PATCH, libbacktrace] Don't call __sync_lock_test_and_set if we don't have sync functions
On hppa*-*-hpux*, we don't have sync functions. However, __sync_lock_test_and_set is called in backtrace_alloc and backtrace_free. This causes an abort before ICE proccessing is fully complete. hppa64 is an ELF target and backtraces are nominally supported. The attached change avoids calling __sync_lock_test_and_set if we don't have sync functions. As a result, the memory is leaked. This fixes the btest failure. OK for trunk? Dave -- J. David Anglin dave.ang...@nrc-cnrc.gc.ca National Research Council of Canada (613) 990-0752 (FAX: 952-6602) 2012-12-09 John David Anglin dave.ang...@nrc-cnrc.gc.ca * mmap.c: Define HAVE_SYNC_FUNCTIONS if not defined. (backtrace_alloc): Don't call __sync_lock_test_and_set if we don't have sync functions. (backtrace_free): Likewise. Index: mmap.c === --- mmap.c (revision 194055) +++ mmap.c (working copy) @@ -49,6 +49,10 @@ #define MAP_ANONYMOUS MAP_ANON #endif +#ifndef HAVE_SYNC_FUNCTIONS +#define HAVE_SYNC_FUNCTIONS 0 +#endif + /* A list of free memory blocks. */ struct backtrace_freelist_struct @@ -96,7 +100,7 @@ using mmap. __sync_lock_test_and_set returns the old state of the lock, so we have acquired it if it returns 0. */ - if (!__sync_lock_test_and_set (state-lock_alloc, 1)) + if (HAVE_SYNC_FUNCTIONS !__sync_lock_test_and_set (state-lock_alloc, 1)) { for (pp = state-freelist; *pp != NULL; pp = (*pp)-next) { @@ -158,7 +162,7 @@ If we can't acquire the lock, just leak the memory. __sync_lock_test_and_set returns the old state of the lock, so we have acquired it if it returns 0. */ - if (!__sync_lock_test_and_set (state-lock_alloc, 1)) + if (HAVE_SYNC_FUNCTIONS !__sync_lock_test_and_set (state-lock_alloc, 1)) { backtrace_free_locked (state, addr, size);