mirror of
https://git.proxmox.com/git/mirror_frr
synced 2026-01-04 15:37:05 +00:00
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:
parent
899a4fd2a1
commit
a31446a88f
15
lib/memory.c
15
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 *
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user