Files
skynet/skynet-src/mem_info.c
EfveZombie 528b6bd32f mem: 优化 C 内存统计, 缓解多线程竞争导致的 skynet_malloc 性能下降 (#2083)
* mem: 优化 C 内存统计, 缓解多线程竞争导致的 skynet_malloc 性能下降

* rm unused SPMC_STEP_LG macro

---------

Co-authored-by: efve.zff <efve.zff@alibaba-inc.com>
2025-09-11 21:23:07 +08:00

60 lines
1.3 KiB
C

#include <string.h>
#include "mem_info.h"
void
meminfo_init(MemInfo *info) {
memset(info, 0, sizeof(*info));
}
void
atomic_meminfo_init(AtomicMemInfo *info) {
ATOM_INIT(&info->alloc, 0);
ATOM_INIT(&info->alloc_count, 0);
ATOM_INIT(&info->free, 0);
ATOM_INIT(&info->free_count, 0);
}
void
meminfo_alloc(MemInfo *info, size_t size) {
info->alloc += size;
++info->alloc_count;
}
void
atomic_meminfo_alloc(AtomicMemInfo *info, size_t size) {
ATOM_FADD(&info->alloc, size);
ATOM_FADD(&info->alloc_count, 1);
}
void
meminfo_free(MemInfo *info, size_t size) {
info->free += size;
++info->free_count;
}
void
atomic_meminfo_free(AtomicMemInfo *info, size_t size) {
ATOM_FADD(&info->free, size);
ATOM_FADD(&info->free_count, 1);
}
void
meminfo_merge(MemInfo *dest, const MemInfo *src) {
dest->alloc += src->alloc;
dest->alloc_count += src->alloc_count;
dest->free += src->free;
dest->free_count += src->free_count;
}
void
atomic_meminfo_merge(MemInfo *dest, const AtomicMemInfo *src) {
MemInfo info;
// 先加载 free 后加载 alloc 避免大小错乱
info.free_count = ATOM_LOAD(&src->free_count);
info.free = ATOM_LOAD(&src->free);
info.alloc_count = ATOM_LOAD(&src->alloc_count);
info.alloc = ATOM_LOAD(&src->alloc);
meminfo_merge(dest, &info);
}