From 5d6b495d6a55ee12f20d9d86b96ce55831f24142 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 12 Jul 2025 15:43:34 -0400 Subject: [PATCH] kernel/guarded_heap: Implement ctors/dtors in the fake object_cache. Part of #19677. --- src/system/kernel/guarded_heap.cpp | 55 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/system/kernel/guarded_heap.cpp b/src/system/kernel/guarded_heap.cpp index 360a257756..082cfc5340 100644 --- a/src/system/kernel/guarded_heap.cpp +++ b/src/system/kernel/guarded_heap.cpp @@ -1007,31 +1007,46 @@ realloc(void* address, size_t newSize) // #pragma mark - Slab API -void -request_memory_manager_maintenance() +struct ObjectCache { + size_t object_size; + size_t alignment; + + void* cookie; + object_cache_constructor constructor; + object_cache_destructor destructor; +}; + + +object_cache* +create_object_cache(const char* name, size_t object_size, uint32 flags) { + return create_object_cache_etc(name, object_size, 0, 0, 0, 0, flags, + NULL, NULL, NULL, NULL); } object_cache* -create_object_cache(const char*, size_t objectSize, uint32) -{ - return (object_cache*)objectSize; -} - - -object_cache* -create_object_cache_etc(const char*, size_t objectSize, size_t, size_t, size_t, - size_t, uint32, void*, object_cache_constructor, object_cache_destructor, +create_object_cache_etc(const char*, size_t objectSize, size_t alignment, size_t, size_t, + size_t, uint32, void* cookie, object_cache_constructor ctor, object_cache_destructor dtor, object_cache_reclaimer) { - return (object_cache*)objectSize; + ObjectCache* cache = new ObjectCache; + if (cache == NULL) + return NULL; + + cache->object_size = objectSize; + cache->alignment = alignment; + cache->cookie = cookie; + cache->constructor = ctor; + cache->destructor = dtor; + return cache; } void delete_object_cache(object_cache* cache) { + delete cache; } @@ -1045,13 +1060,21 @@ object_cache_set_minimum_reserve(object_cache* cache, size_t objectCount) void* object_cache_alloc(object_cache* cache, uint32 flags) { - return memalign_etc(0, (size_t)cache, flags); + void* object = memalign_etc(cache->alignment, cache->object_size, flags); + if (object == NULL) + return NULL; + + if (cache->constructor != NULL) + cache->constructor(cache->cookie, object); + return object; } void object_cache_free(object_cache* cache, void* object, uint32 flags) { + if (cache->destructor != NULL) + cache->destructor(cache->cookie, object); return free_etc(object, flags); } @@ -1070,6 +1093,12 @@ object_cache_get_usage(object_cache* cache, size_t* _allocatedMemory) } +void +request_memory_manager_maintenance() +{ +} + + void slab_init(kernel_args* args) {