diff mbox

[libbacktrace] Don't call __sync_lock_test_and_set if we don't have sync functions

Message ID 20121209190812.GA20280@hiauly1.hia.nrc.ca
State New
Headers show

Commit Message

John David Anglin Dec. 9, 2012, 7:08 p.m. UTC
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

Comments

John David Anglin Dec. 30, 2012, 4:28 p.m. UTC | #1
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.anglin@nrc-cnrc.gc.ca
> National Research Council of Canada              (613) 990-0752  
> (FAX: 952-6602)
>
> 2012-12-09  John David Anglin  <dave.anglin@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.anglin@bell.net
Ian Lance Taylor Jan. 1, 2013, 4:14 p.m. UTC | #2
On Sun, Dec 9, 2012 at 11:08 AM, John David Anglin
<dave@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  <iant@google.com>

	PR other/55536
	* mmap.c (backtrace_alloc): Don't call sync functions if not
	threaded.
	(backtrace_free): Likewise.
diff mbox

Patch

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);