On Sun, Jul 24, 2016 at 8:01 AM, Gleb Natapov <[email protected]> wrote:
> _Unwind_Find_FDE calls _Unwind_Find_registered_FDE and it takes lock even
> when there is no registered objects. As far as I see only statically
> linked applications call __register_frame_info* functions, so for
> dynamically linked executables taking the lock to check unseen_objects
> and seen_objects is a pessimization. Since the function is called on
> each thrown exception this is a lot of unneeded locking. This patch
> checks unseen_objects and seen_objects outside of the lock and returns
> earlier if both are NULL.
There are problems with this patch.
First the stores to unseen_objects and seen_objects are not atomic stores.
The second issue is not all targets support atomics because some are
single threaded.
Another issue is CONSUME memory model should almost never be used; it
just decays into acquire anyways.
>
> diff --git a/libgcc/unwind-dw2-fde.c b/libgcc/unwind-dw2-fde.c
> index 5b16a1f..9af558d 100644
> --- a/libgcc/unwind-dw2-fde.c
> +++ b/libgcc/unwind-dw2-fde.c
> @@ -1001,6 +1001,10 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases
> *bases)
> struct object *ob;
> const fde *f = NULL;
>
> + if (!__atomic_load_n(&unseen_objects, __ATOMIC_CONSUME) &&
> !__atomic_load_n(&seen_objects, __ATOMIC_CONSUME)) {
> + return NULL;
> + }
There is formatting issues too.
if (!__atomic_load_n(&unseen_objects, __ATOMIC_CONSUME)
&& !__atomic_load_n(&seen_objects, __ATOMIC_CONSUME))
{
return NULL;
}
is the correct formating.
> +
> init_object_mutex_once ();
> __gthread_mutex_lock (&object_mutex);
>
> @@ -1020,8 +1024,8 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases
> *bases)
> while ((ob = unseen_objects))
> {
> struct object **p;
> + struct object *next = ob->next;
>
> - unseen_objects = ob->next;
> f = search_object (ob, pc);
>
> /* Insert the object into the classified list. */
> @@ -1031,6 +1035,8 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases
> *bases)
> ob->next = *p;
> *p = ob;
>
> + unseen_objects = next;
This store should be an atomic store to be paired with the loads.
Thanks,
Andrew
> +
> if (f)
> goto fini;
> }
> --
> Gleb.