[PATCH v2 1/4] malloc: Remove atomic_* usage

Stafford Horne shorne@gmail.com
Mon Dec 27 06:09:21 GMT 2021


On Thu, Dec 23, 2021 at 02:37:03PM -0300, Adhemerval Zanella via Libc-alpha wrote:
> These typedef are used solely on memusage and can be replaced with
> generic types.
> ---
>  malloc/memusage.c          | 36 ++++++++++++++++++------------------
>  sysdeps/arc/memusage.h     |  2 --
>  sysdeps/generic/memusage.h | 14 --------------
>  sysdeps/nios2/memusage.h   |  2 --
>  4 files changed, 18 insertions(+), 36 deletions(-)
> 
> diff --git a/malloc/memusage.c b/malloc/memusage.c
> index e99f0c1c14..de39ad1c1a 100644
> --- a/malloc/memusage.c
> +++ b/malloc/memusage.c
> @@ -71,20 +71,20 @@ struct header
>  #define MAGIC 0xfeedbeaf
>  
>  
> -static memusage_cntr_t calls[idx_last];
> -static memusage_cntr_t failed[idx_last];
> -static memusage_size_t total[idx_last];
> -static memusage_size_t grand_total;
> -static memusage_cntr_t histogram[65536 / 16];
> -static memusage_cntr_t large;
> -static memusage_cntr_t calls_total;
> -static memusage_cntr_t inplace;
> -static memusage_cntr_t decreasing;
> -static memusage_cntr_t realloc_free;
> -static memusage_cntr_t inplace_mremap;
> -static memusage_cntr_t decreasing_mremap;
> -static memusage_size_t current_heap;
> -static memusage_size_t peak_use[3];
> +static unsigned long int calls[idx_last];
> +static unsigned long int failed[idx_last];
> +static size_t total[idx_last];
> +static size_t grand_total;
> +static unsigned long int histogram[65536 / 16];
> +static unsigned long int large;
> +static unsigned long int calls_total;
> +static unsigned long int inplace;
> +static unsigned long int decreasing;
> +static unsigned long int realloc_free;
> +static unsigned long int inplace_mremap;
> +static unsigned long int decreasing_mremap;
> +static size_t current_heap;
> +static size_t peak_use[3];
>  static __thread uintptr_t start_sp;

OK.

>  /* A few macros to make the source more readable.  */
> @@ -111,7 +111,7 @@ struct entry
>  };
>  
>  static struct entry buffer[2 * DEFAULT_BUFFER_SIZE];
> -static uatomic32_t buffer_cnt;
> +static uint32_t buffer_cnt;
>  static struct entry first;
>  
>  
> @@ -128,7 +128,7 @@ update_data (struct header *result, size_t len, size_t old_len)
>      }
>  
>    /* Compute current heap usage and compare it with the maximum value.  */
> -  memusage_size_t heap
> +  size_t heap
>      = catomic_exchange_and_add (&current_heap, len - old_len) + len - old_len;
>    catomic_max (&peak_heap, heap);
>  
> @@ -161,14 +161,14 @@ update_data (struct header *result, size_t len, size_t old_len)
>    /* Store the value only if we are writing to a file.  */
>    if (fd != -1)
>      {
> -      uatomic32_t idx = catomic_exchange_and_add (&buffer_cnt, 1);
> +      uint32_t idx = catomic_exchange_and_add (&buffer_cnt, 1);
>        if (idx + 1 >= 2 * buffer_size)
>          {
>            /* We try to reset the counter to the correct range.  If
>               this fails because of another thread increasing the
>               counter it does not matter since that thread will take
>               care of the correction.  */
> -          uatomic32_t reset = (idx + 1) % (2 * buffer_size);
> +          uint32_t reset = (idx + 1) % (2 * buffer_size);
>            catomic_compare_and_exchange_val_acq (&buffer_cnt, reset, idx + 1);
>            if (idx >= 2 * buffer_size)
>              idx = reset - 1;

OK.

> diff --git a/sysdeps/arc/memusage.h b/sysdeps/arc/memusage.h
> index 290252a92f..e8a508a8ff 100644
> --- a/sysdeps/arc/memusage.h
> +++ b/sysdeps/arc/memusage.h
> @@ -18,6 +18,4 @@
>  
>  #define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })
>  
> -#define uatomic32_t unsigned int
> -
>  #include <sysdeps/generic/memusage.h>
> diff --git a/sysdeps/generic/memusage.h b/sysdeps/generic/memusage.h
> index 408e0b891b..c9bde5cd11 100644
> --- a/sysdeps/generic/memusage.h
> +++ b/sysdeps/generic/memusage.h
> @@ -17,7 +17,6 @@
>  
>  
>  #include <limits.h>
> -#include <atomic.h>
>  #include <stdint.h>
>  
>  #ifndef GETSP
> @@ -36,16 +35,3 @@
>      high = usecs >> 32;							   \
>    }
>  #endif
> -
> -#if LONG_BIT == 32
> -# define memusage_cntr_t uatomic32_t
> -#else
> -# define memusage_cntr_t uatomic64_t
> -#endif
> -#ifndef memusage_size_t
> -# if LONG_BIT == 32
> -#  define memusage_size_t uatomic32_t
> -# else
> -#  define memusage_size_t uatomic64_t
> -# endif
> -#endif

OK.

> diff --git a/sysdeps/nios2/memusage.h b/sysdeps/nios2/memusage.h
> index 01618e44a8..6f1c78812d 100644
> --- a/sysdeps/nios2/memusage.h
> +++ b/sysdeps/nios2/memusage.h
> @@ -18,6 +18,4 @@
>  
>  #define GETSP() ({ register uintptr_t stack_ptr asm ("%sp"); stack_ptr; })
>  
> -#define uatomic32_t unsigned int
> -
>  #include <sysdeps/generic/memusage.h>

As I see it, the arch specific bits replace uatomic32_t with unsigned long int from
unsigned int.  However, there should be no physical change so I think it's OK.

This looks good to me.

-Stafford


More information about the Libc-alpha mailing list