From 00b6aaa735ef3aab8a96eceafd010d17a875d8d5 Mon Sep 17 00:00:00 2001 From: Mineplay Date: Sat, 19 Apr 2025 06:37:17 -0500 Subject: [PATCH 1/3] refactor(allocator): made seperate allocator function for malloc --- Include/Hallocy/Core/Allocator.h | 5 ++++- Src/Core/Allocator.c | 27 ++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Include/Hallocy/Core/Allocator.h b/Include/Hallocy/Core/Allocator.h index 825bad7..04ff2e5 100644 --- a/Include/Hallocy/Core/Allocator.h +++ b/Include/Hallocy/Core/Allocator.h @@ -24,10 +24,13 @@ #define HALLOCY_ALLOCATOR #include +#include #include "../Utils/Error.h" -void *hallocy_malloc(size_t size); +void *hallocy_allocate(size_t size, bool zero_memory); + +static inline void *hallocy_malloc(size_t size) { return hallocy_allocate(size, false); } HallocyError hallocy_free(void *pointer); #endif \ No newline at end of file diff --git a/Src/Core/Allocator.c b/Src/Core/Allocator.c index 9ff04ba..42b88b4 100644 --- a/Src/Core/Allocator.c +++ b/Src/Core/Allocator.c @@ -21,8 +21,7 @@ * ----------------------------------------------------------------------------- */ #include "../../Include/Hallocy/Core/Allocator.h" - -#include +#include "../../Include/Hallocy/Core/Memory.h" #if defined(_WIN32) #include @@ -70,7 +69,7 @@ static BOOL CALLBACK hallocy_initialize_mutex(PINIT_ONCE init_once, PVOID parame } #endif -void *hallocy_malloc(size_t size) { +void *hallocy_allocate(size_t size, bool zero_memory) { if (page_size == 0) { #if defined(_WIN32) SYSTEM_INFO system_info; @@ -102,6 +101,10 @@ void *hallocy_malloc(size_t size) { } memory_pointer->next = NULL; + if (zero_memory) { + hallocy_set_memory(memory_pointer + 1, 0, aligned_size - sizeof(HallocyMemoryHeader)); + } + return (void*)(memory_pointer + 1); } @@ -114,7 +117,12 @@ void *hallocy_malloc(size_t size) { hallocy_heap = GetProcessHeap(); } - memory_pointer = HeapAlloc(hallocy_heap, 0, aligned_size); + if (zero_memory) { + memory_pointer = HeapAlloc(hallocy_heap, HEAP_ZERO_MEMORY, aligned_size); + } else { + memory_pointer = HeapAlloc(hallocy_heap, 0, aligned_size); + } + if (memory_pointer == NULL) { return NULL; } @@ -162,6 +170,10 @@ void *hallocy_malloc(size_t size) { #endif memory_pointer->next = NULL; + if (zero_memory) { + hallocy_set_memory(memory_pointer + 1, 0, aligned_size - sizeof(HallocyMemoryHeader)); + } + return (void*)(memory_pointer + 1); } @@ -174,7 +186,12 @@ void *hallocy_malloc(size_t size) { hallocy_heap = GetProcessHeap(); } - memory_pointer = HeapAlloc(hallocy_heap, 0, aligned_size); + if (zero_memory) { + memory_pointer = HeapAlloc(hallocy_heap, HEAP_ZERO_MEMORY, aligned_size); + } else { + memory_pointer = HeapAlloc(hallocy_heap, 0, aligned_size); + } + if (memory_pointer == NULL) { return NULL; } From 79ea8dda648c3c702fc894ab04820df2c2090ce9 Mon Sep 17 00:00:00 2001 From: Mineplay Date: Sat, 19 Apr 2025 06:38:01 -0500 Subject: [PATCH 2/3] feat(allocator): added calloc function --- Include/Hallocy/Core/Allocator.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/Hallocy/Core/Allocator.h b/Include/Hallocy/Core/Allocator.h index 04ff2e5..e3ab9c0 100644 --- a/Include/Hallocy/Core/Allocator.h +++ b/Include/Hallocy/Core/Allocator.h @@ -31,6 +31,7 @@ void *hallocy_allocate(size_t size, bool zero_memory); static inline void *hallocy_malloc(size_t size) { return hallocy_allocate(size, false); } +static inline void *hallocy_calloc(size_t size, size_t count) { return hallocy_allocate(size * count, true); } HallocyError hallocy_free(void *pointer); #endif \ No newline at end of file From 6e1533c9439283c70ead0d72fb6ed2d9fe6954df Mon Sep 17 00:00:00 2001 From: Mineplay Date: Sat, 19 Apr 2025 06:49:34 -0500 Subject: [PATCH 3/3] feat(allocator): implemented realloc function --- Include/Hallocy/Core/Allocator.h | 1 + Src/Core/Allocator.c | 22 ++++++++++++++++++++++ Tests/Main.c | 7 +++++++ 3 files changed, 30 insertions(+) diff --git a/Include/Hallocy/Core/Allocator.h b/Include/Hallocy/Core/Allocator.h index e3ab9c0..85c0111 100644 --- a/Include/Hallocy/Core/Allocator.h +++ b/Include/Hallocy/Core/Allocator.h @@ -32,6 +32,7 @@ void *hallocy_allocate(size_t size, bool zero_memory); static inline void *hallocy_malloc(size_t size) { return hallocy_allocate(size, false); } static inline void *hallocy_calloc(size_t size, size_t count) { return hallocy_allocate(size * count, true); } +void *hallocy_realloc(void *memory_pointer, size_t size); HallocyError hallocy_free(void *pointer); #endif \ No newline at end of file diff --git a/Src/Core/Allocator.c b/Src/Core/Allocator.c index 42b88b4..96ee44f 100644 --- a/Src/Core/Allocator.c +++ b/Src/Core/Allocator.c @@ -229,6 +229,28 @@ void *hallocy_allocate(size_t size, bool zero_memory) { return (void*)(memory_pointer + 1); } +void *hallocy_realloc(void *memory_pointer, size_t size) { + if (memory_pointer == NULL) { + return hallocy_allocate(size, false); + } + + if (size == 0) { + hallocy_free(memory_pointer); + return NULL; + } + + HallocyMemoryHeader *memory_header = ((HallocyMemoryHeader*)memory_pointer) - 1; + if (memory_header->size - sizeof(HallocyMemoryHeader) >= size) { + return memory_pointer; + } + + void *new_memory = hallocy_allocate(size, false); + hallocy_copy_memory(new_memory, memory_pointer, memory_header->size); + hallocy_free(memory_pointer); + + return new_memory; +} + HallocyError hallocy_free(void *pointer) { if (pointer == NULL) { return HALLOCY_ERROR_INVALID_POINTER; diff --git a/Tests/Main.c b/Tests/Main.c index 934c082..65bb50b 100644 --- a/Tests/Main.c +++ b/Tests/Main.c @@ -70,6 +70,13 @@ printf("text_copy_copy and text_copy are equal\n"); } + text_copy_copy = (char*)hallocy_realloc(text_copy_copy, 40); + + hallocy_set_memory(text_copy_copy + 35, 'q', 4); + text_copy_copy[39] = '\0'; + + printf("%s\n", text_copy_copy); + hallocy_free(text_copy_copy); hallocy_free(text_copy); hallocy_free(text);