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 <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2016-10-26 17:19:56 +02:00
parent 899a4fd2a1
commit a31446a88f
2 changed files with 12 additions and 8 deletions

View File

@ -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 *

View File

@ -18,6 +18,7 @@
#define _QUAGGA_MEMORY_H
#include <stdlib.h>
#include <frratomic.h>
#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