[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Libunwind-devel] [PATCH 06/57] Simplify `sos_alloc()' implementatio
From: |
Arun Sharma |
Subject: |
Re: [Libunwind-devel] [PATCH 06/57] Simplify `sos_alloc()' implementation |
Date: |
Sat, 29 Sep 2012 12:22:19 -0700 |
On Fri, Sep 21, 2012 at 4:11 AM, Tommi Rantala <address@hidden> wrote:
> HIDDEN void *
> sos_alloc (size_t size)
> {
> - char *mem;
> -
> -#ifdef HAVE_CMPXCHG
> - char *old_mem;
> + size_t pos;
>
> size = UNW_ALIGN(size, MAX_ALIGN);
> - if (!sos_memp)
> - cmpxchg_ptr (&sos_memp, 0, sos_memory);
> - do
> - {
> - old_mem = sos_memp;
>
> - mem = (char *) UNW_ALIGN((unsigned long) old_mem, MAX_ALIGN);
> - mem += size;
> - assert (mem < sos_memory + sizeof (sos_memory));
> - }
> - while (!cmpxchg_ptr (&sos_memp, old_mem, mem));
> +#if defined(__GNUC__)
> + /* Assume `sos_memory' is suitably aligned. */
> + assert(((uintptr_t) &sos_memory[0] & (MAX_ALIGN-1)) == 0);
> +#endif
> +
> +#if defined(__GNUC__) && defined(HAVE_FETCH_AND_ADD)
> + pos = fetch_and_add (&sos_memory_freepos, size);
> #else
> static define_lock (sos_lock);
> intrmask_t saved_mask;
>
> - size = UNW_ALIGN(size, MAX_ALIGN);
> -
> lock_acquire (&sos_lock, saved_mask);
> {
> - if (!sos_memp)
> - sos_memp = sos_memory;
> -
> - mem = (char *) UNW_ALIGN((unsigned long) sos_memp, MAX_ALIGN);
> - mem += size;
> - assert (mem < sos_memory + sizeof (sos_memory));
> - sos_memp = mem;
> +# ifndef __GNUC__
> + /* No assumptions about `sos_memory' alignment. */
> + if (sos_memory_freepos == 0)
> + {
> + unsigned align = UNW_ALIGN((uintptr_t) &sos_memory[0], MAX_ALIGN)
> + - (uintptr_t) &sos_memory[0];
> + sos_memory_freepos = align;
> + }
> +# endif
> + pos = sos_memory_freepos;
> + sos_memory_freepos += size;
> }
> lock_release (&sos_lock, saved_mask);
> #endif
> - return mem;
> +
> + assert (((uintptr_t) &sos_memory[pos] & (MAX_ALIGN-1)) == 0);
> + assert ((pos+size) <= SOS_MEMORY_SIZE);
> +
> + return &sos_memory[pos];
> }
>
> /* Must be called while holding the mempool lock. */
That's a lot of ifdefs in machine independent code. I feel:
http://paste.ubuntu.com/1250227/
should suffice. This might pessimize the GNUC && !HAVE_FETCH_AND_ADD a
bit. Let me know if you think this is a problem.
-Arun
- [Libunwind-devel] [PATCH 00/57] patchset v2, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 02/57] Remove unneeded `atomic_ops.h' inclusion in `dwarf.h', Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 03/57] Use GCC __BIGGEST_ALIGNMENT__ for sos-pool MAX_ALIGN, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 08/57] Use __sync builtin atomics on all architectures if available, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 01/57] Pull attribute macros from `libunwind_i.h' to new header `compiler.h', Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 07/57] Remove unneeded `cmpxchg_ptr()' from include/libunwind_i.h, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 06/57] Simplify `sos_alloc()' implementation, Tommi Rantala, 2012/09/21
- Re: [Libunwind-devel] [PATCH 06/57] Simplify `sos_alloc()' implementation,
Arun Sharma <=
- [Libunwind-devel] [PATCH 04/57] Workaround non-power-of-two i386 sizeof(long double) in src/mi/mempool.c, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 15/57] HPPA: kludge out unused variable in unw_get_save_loc() stub, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 05/57] Align `sos_memory' to MAX_ALIGN, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 10/57] Apply UNW_ALIGN more in src/mi/mempool.c, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 13/57] PPC: remove unused `PAGE_START' macro from Ginit.c, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 09/57] Invert tdep_init() flag logic, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 14/57] HPPA: properly check dwarf_get() return value in unw_step(), Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 17/57] Clear out `ip' to avoid -Wuninitialized warning in tests/test-coredump-unwind.c, Tommi Rantala, 2012/09/21
- [Libunwind-devel] [PATCH 20/57] Annotate potentially unused variable in tests/Gtest-bt.c, Tommi Rantala, 2012/09/21