From e14790032b8f357ebf8511b2f88e24d135372a75 Mon Sep 17 00:00:00 2001 From: "evgeniy.generalov" Date: Sun, 22 Jun 2025 17:12:28 +0300 Subject: [PATCH] libarkts: Use pool allocator in arena --- ui2abc/libarkts/native/meson.build | 3 +- ui2abc/libarkts/native/src/common.cc | 51 +++++++++++++++++----------- ui2abc/libarkts/native/src/common.h | 48 +++++++++++++------------- 3 files changed, 56 insertions(+), 46 deletions(-) diff --git a/ui2abc/libarkts/native/meson.build b/ui2abc/libarkts/native/meson.build index 126a13083f..82a7b48c82 100644 --- a/ui2abc/libarkts/native/meson.build +++ b/ui2abc/libarkts/native/meson.build @@ -36,6 +36,7 @@ cflags = [ '-DINTEROP_LIBRARY_NAME=' + get_option('lib_name'), '-DKOALA_USE_NODE_VM', '-DKOALA_NAPI', + '-g', ] if (target_machine.system() == 'windows') @@ -125,4 +126,4 @@ if get_option('cross_compile') link_args: [cflags_cross], dependencies: [] ) -endif \ No newline at end of file +endif diff --git a/ui2abc/libarkts/native/src/common.cc b/ui2abc/libarkts/native/src/common.cc index 105576f909..6434e69efc 100644 --- a/ui2abc/libarkts/native/src/common.cc +++ b/ui2abc/libarkts/native/src/common.cc @@ -26,26 +26,15 @@ StageArena* StageArena::instance() return ¤tArena; } -void StageArena::add(void* pointer) -{ - if (pointer) - allocated.push_back(pointer); -} - void StageArena::cleanup() { - if (totalSize > 0 && false) - printf("cleanup %d objects %d bytes\n", (int)allocated.size(), (int)totalSize); - for (auto it : allocated) { - free(it); - } - totalSize = 0; - allocated.clear(); + pool.clear(); + addBlock(); // arena has to be reusable after cleanup } StageArena::StageArena() { - totalSize = 0; + addBlock(); } StageArena::~StageArena() @@ -56,18 +45,40 @@ StageArena::~StageArena() char* StageArena::strdup(const char* string) { auto* arena = StageArena::instance(); - auto size = strlen(string) + 1; - char* memory = (char*)arena->alloc(size); + auto const size = strlen(string) + 1; + char* const memory = (char*)arena->alloc(size); memcpy(memory, string, size); return memory; } void* StageArena::alloc(size_t size) { - void* result = malloc(size); - totalSize += size; - add(result); - return result; + return alignedAlloc(size, 1); +} + +void* StageArena::alignedAlloc(size_t size, size_t align) +{ + auto const index = allocateInPool(size, align); + return &pool.back()[index]; +} + +size_t StageArena::allocateInPool(size_t size, size_t align) +{ + auto& blk = pool.back(); + auto const used = (blk.size() + (align - 1)) & (~(align - 1)); + if (used + size > blk.capacity()) { + addBlock(); + pool.back().resize(size); + return 0; + } + blk.resize(used + size); + return used; +} + +void StageArena::addBlock() +{ + pool.emplace_back(0); + pool.back().reserve(1 * 1024 * 1024); } #ifdef KOALA_WINDOWS diff --git a/ui2abc/libarkts/native/src/common.h b/ui2abc/libarkts/native/src/common.h index 7b57d89a16..3a5446423a 100644 --- a/ui2abc/libarkts/native/src/common.h +++ b/ui2abc/libarkts/native/src/common.h @@ -38,6 +38,7 @@ #include #include #include +#include using std::string, std::cout, std::endl, std::vector; @@ -76,41 +77,36 @@ inline KUInt unpackUInt(const KByte* bytes) es2panda_ContextState intToState(KInt state); class StageArena { - std::vector allocated; - size_t totalSize; + std::list> pool; + + void addBlock(); + size_t allocateInPool(size_t size, size_t align = 1); + public: StageArena(); ~StageArena(); + static StageArena* instance(); - template - static T* alloc() - { - auto* arena = StageArena::instance(); - void* memory = arena->alloc(sizeof(T)); - return new (memory) T(); - } - template - static T* alloc(T1 arg1) - { - auto* arena = StageArena::instance(); - void* memory = arena->alloc(sizeof(T)); - return new (memory) T(std::forward(arg1)); - } - template - static T* alloc(T1 arg1, T2 arg2) + + template + static T* alloc(Args&&... args) { + using Type = std::decay_t; auto* arena = StageArena::instance(); - void* memory = arena->alloc(sizeof(T)); - return new (memory) T(arg1, arg2); + void* memory = arena->alignedAlloc(sizeof(Type), alignof(Type)); + return new (memory) T(std::forward(args)...); } + template static T* allocArray(size_t count) { + using Type = std::decay_t; auto* arena = StageArena::instance(); - // align? - void* memory = arena->alloc(sizeof(T) * count); + void* memory = arena->alignedAlloc(sizeof(Type) * count, alignof(Type)); + // todo: need to call ctors return new (memory) T(); } + template static T* clone(const T& arg) { @@ -118,15 +114,17 @@ class StageArena { void* memory = arena->alloc(sizeof(T)); return new (memory) T(arg); } + template static std::vector* cloneVector(const T* arg, size_t count) { - return alloc, const T*, const T*>(arg, arg + count); + return alloc>(arg, arg + count); } + void* alloc(size_t size); + void* alignedAlloc(size_t size, size_t align); static char* strdup(const char* original); - void add(void* pointer); void cleanup(); }; -#endif // COMMON_H \ No newline at end of file +#endif // COMMON_H -- Gitee