9#include <mimalloc/include/mimalloc.h>
15#if defined(ELYSIA_RUNTIME_HPERF_ENABLE)
19#if defined(ELYSIA_RUNTIME_BUILD_TYPE_DEBUG) && defined(ELYSIA_RUNTIME_ENABLE_BUILTIN_MEMORY_LEAK_DETECTOR)
22void runtime_debug_print_current_allocated_memory() {
24 printf(
"[Elysia/DEBUG] | Memory of %s at %p, size: %ld bytes. target refcount: %lld.\n",
28 ((
YoiObject *)node->memory)->gc_refcount);
33#if defined(ELYSIA_RUNTIME_ENABLE_BUILTIN_MEMORY_LEAK_DETECTOR)
34int64_t runtime_object_allocated = 0;
38 #if defined (ELYSIA_RUNTIME_HPERF_ENABLE)
41 #if defined(ELYSIA_RUNTIME_BUILD_TYPE_DEBUG) && defined(ELYSIA_RUNTIME_ENABLE_BUILTIN_MEMORY_LEAK_DETECTOR)
42 printf(
"[Elysia/DEBUG] Allocating %zu bytes memory at %p. Current object count: %lld.\n", size,
object, runtime_object_allocated);
43 runtime_object_allocated ++;
45 #if defined(ELYSIA_RUNTIME_BUILD_TYPE_DEBUG) && defined(ELYSIA_RUNTIME_ENABLE_BUILTIN_MEMORY_LEAK_DETECTOR)
46 if (allocated_memory_list ==
nullptr) {
48 allocated_memory_list->
memory = object;
49 allocated_memory_list->
size = size;
50 allocated_memory_list->
prev =
nullptr;
51 allocated_memory_list->
next =
nullptr;
55 new_node->size = size;
56 new_node->prev =
nullptr;
57 new_node->next = allocated_memory_list;
58 allocated_memory_list->
prev = new_node;
59 allocated_memory_list = new_node;
66 #if defined(ELYSIA_RUNTIME_HPERF_ENABLE)
69 #if defined(ELYSIA_RUNTIME_BUILD_TYPE_DEBUG) && defined(ELYSIA_RUNTIME_ENABLE_BUILTIN_MEMORY_LEAK_DETECTOR)
70 printf(
"[Elysia/DEBUG] Finalizing %s object at %p. Current object count: %lld.\n",
rtti_table[object->
type_id].
type_name,
object, runtime_object_allocated);
71 runtime_object_allocated --;
74 if (node->memory && node->memory ==
object) {
75 if (node->prev !=
nullptr) {
76 node->prev->next = node->next;
78 allocated_memory_list = node->
next;
80 if (node->next !=
nullptr) {
86 runtime_debug_print_current_allocated_memory();
97 void *ptr = mi_calloc(size, 1);
103 auto raw =
reinterpret_cast<int64_t
>(&array->
data);
116#elif defined(__linux__) || defined(__APPLE__)
117 #include <sys/mman.h>
121#ifndef ELYSIA_DISABLE_MEMORY_EXECUTABLE_MAPPING_FEATURE
125 return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
126 #elif defined(__linux__) || defined(__APPLE__)
128 size_t header_size = 16;
129 size_t real_size = size + header_size;
131 int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
132 int flags = MAP_PRIVATE | MAP_ANONYMOUS;
134 #if defined(__APPLE__) && defined(__aarch64__)
138 void *ptr = mmap(NULL, real_size, prot, flags, -1, 0);
140 if (ptr == MAP_FAILED) {
145 *
reinterpret_cast<size_t*
>(ptr) = real_size;
148 return static_cast<char*
>(ptr) + header_size;
158 VirtualFree(ptr, 0, MEM_RELEASE);
159 #elif defined(__linux__) || defined(__APPLE__)
160 size_t header_size = 16;
161 char *real_ptr =
static_cast<char*
>(ptr) - header_size;
162 size_t real_size = *
reinterpret_cast<size_t*
>(real_ptr);
164 munmap(real_ptr, real_size);
void hperf_report_mem_free(void *ptr)
void hperf_report_mem_alloc(void *ptr, size_t size)
YoiIntegerObject * runtime_get_string_array_data_pointer(YoiObjectArray *array)
void * runtime_object_alloc(unsigned long size)
void runtime_finalize_object_report(YoiObject *object)
void runtime_exec_permit_free(void *ptr)
void runtime_finalize_object(YoiObject *object)
void * runtime_exec_permit_alloc(unsigned long size)
void * runtime_object_alloc_report(size_t size, void *object)
AllocatedMemoryList * prev
AllocatedMemoryList * next
unsigned long long gc_refcount
unsigned long long gc_refcount
unsigned long long type_id