From: David Lamparter Date: Wed, 26 Oct 2016 15:19:56 +0000 (+0200) Subject: lib: memtypes: restore atomicity X-Git-Tag: reindent-master-before~227^2~2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=a31446a88f7751b763d0af2a3d92c9e0887faa61;p=matthieu%2Ffrr.git lib: memtypes: restore atomicity the original version of this code already used _Atomic and atomic_*(). Restore this functionality for future multithreading. Signed-off-by: David Lamparter --- diff --git a/lib/memory.c b/lib/memory.c index ad55366f64..28e358dfc1 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -30,19 +30,22 @@ DEFINE_MTYPE(LIB, TMP, "Temporary memory") static inline void mt_count_alloc (struct memtype *mt, size_t size) { - mt->n_alloc++; + size_t oldsize; - if (mt->size == 0) - mt->size = size; - else if (mt->size != size) - mt->size = SIZE_VAR; + atomic_fetch_add_explicit(&mt->n_alloc, 1, memory_order_relaxed); + + oldsize = atomic_load_explicit(&mt->size, memory_order_relaxed); + if (oldsize == 0) + oldsize = atomic_exchange_explicit(&mt->size, size, memory_order_relaxed); + if (oldsize != 0 && oldsize != size && oldsize != SIZE_VAR) + atomic_store_explicit(&mt->size, SIZE_VAR, memory_order_relaxed); } static inline void mt_count_free (struct memtype *mt) { assert(mt->n_alloc); - mt->n_alloc--; + atomic_fetch_sub_explicit(&mt->n_alloc, 1, memory_order_relaxed); } static inline void * diff --git a/lib/memory.h b/lib/memory.h index 477a6162dc..284a1b13c5 100644 --- a/lib/memory.h +++ b/lib/memory.h @@ -18,6 +18,7 @@ #define _QUAGGA_MEMORY_H #include +#include #define array_size(ar) (sizeof(ar) / sizeof(ar[0])) @@ -26,8 +27,8 @@ struct memtype { struct memtype *next, **ref; const char *name; - size_t n_alloc; - size_t size; + _Atomic size_t n_alloc; + _Atomic size_t size; }; struct memgroup