Hi,
On Mon, 2019-10-21 at 11:28 -0500, Jonathon Anderson wrote:
> On Mon, Oct 21, 2019 at 18:13, Mark Wielaard <[email protected]> wrote:
> > Does that look reasonable?
>
> It does, although I would prefer:
>
> diff --git a/libdw/dwarf_end.c b/libdw/dwarf_end.c
> index 9ca17212..6da9e0cd 100644
> --- a/libdw/dwarf_end.c
> +++ b/libdw/dwarf_end.c
> @@ -95,7 +95,9 @@ dwarf_end (Dwarf *dwarf)
> tdestroy (dwarf->split_tree, noop_free);
>
> /* Free the internally allocated memory. */
> - struct libdw_memblock *memp = (struct libdw_memblock
> *)dwarf->mem_tail;
> + struct libdw_memblock *memp;
> + memp = (struct libdw_memblock *)atomic_load(&dwarf->mem_tail,
> + memory_order_relaxed);
> while (memp != NULL)
> {
> struct libdw_memblock *prevp = memp->prev;
>
> Because some idiot thought making seq_cst the default was a good idea.
> And this way it notes in the code that this load is non-synchronizing.
Lets avoid the "strong" language about people. But lets see if we can
make the load less "strong" for the atomics :)
I think we cannot use the atomic_load () function, but have to use
atomic_load_explicit. So it would become:
diff --git a/libdw/dwarf_end.c b/libdw/dwarf_end.c
index fc573cb3..a2e94436 100644
--- a/libdw/dwarf_end.c
+++ b/libdw/dwarf_end.c
@@ -95,7 +95,10 @@ dwarf_end (Dwarf *dwarf)
tdestroy (dwarf->split_tree, noop_free);
/* Free the internally allocated memory. */
- struct libdw_memblock *memp = (struct libdw_memblock *)dwarf->mem_tail;
+ struct libdw_memblock *memp;
+ memp = (struct libdw_memblock *) (atomic_load_explicit
+ (&dwarf->mem_tail,
+ memory_order_relaxed));
while (memp != NULL)
{
struct libdw_memblock *prevp = memp->prev;
Cheers,
Mark