From c90883ac270526d437441914231dd88fb57a5009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Monta=C3=B1es=20Ojados?= Date: Sun, 15 Feb 2026 20:57:19 +0100 Subject: [PATCH] base allocator logic --- run.exe | Bin 62989 -> 66102 bytes src/main.c | 17 +++- src/memory/allocator.h | 216 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 src/memory/allocator.h diff --git a/run.exe b/run.exe index ec0091b12729805ff3a4a4ea44ffa546900fa913..99be10faaace17b74b27fcd75af069a2b8b51f4d 100644 GIT binary patch delta 18694 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 X{*JuVKRl{HY8L;trD@`~@A3Z!NK>p6 delta 16043 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 + printf("size=%zu\n", allocPtr->size); + + JLANG_visualize(allocPtr); + + void *var1 = JLANG_malloc(allocPtr, 512); + printf("var1Ptr=%p\n", var1); + + JLANG_visualize(allocPtr); + + return 0; } \ No newline at end of file diff --git a/src/memory/allocator.h b/src/memory/allocator.h new file mode 100644 index 0000000..e8c1ff1 --- /dev/null +++ b/src/memory/allocator.h @@ -0,0 +1,216 @@ +#include +#include +#include + +/* + Custom Memory Allocator + + Implementacion custom de un memory allocator que opera sobre un array de bytes usandolo como "heap" +*/ + +#define JLANG_OK 0 +#define JLANG_ERR 1 +#define JLANG_FREE 0 +#define JLANG_HEADER 1 +#define JLANG_PAYLOAD 2 + +/* + La estructura de Metadata se encarga de almacenar el tamaño del bloque y si está en uso. + Se añadirá al principio de cada bloque + [BLOCK_METADATA] + [BLOCK_BYTES] +*/ +typedef struct +{ + size_t size; // 8 bytes + int in_use; // 4 bytes + // --- aquí el compilador mete 4 bytes invisibles --- +} JLANG_metadata; + +/* + La estructura de Memory Allocator se encarga de almancenar el array de memoria y el tamaño de esta. +*/ +typedef struct +{ + char *memory; // 8 bytes + size_t size; // 8 bytes +} JLANG_memory_allocator; + +void *JLANG_CreateAllocator() +{ + // Allocate memory in heap for JLANG_memory_allocator + JLANG_memory_allocator *allocator = (JLANG_memory_allocator *)malloc(sizeof(JLANG_memory_allocator)); + + // Assign default free bytes + allocator->memory = (char *)malloc(1 * 1024); + allocator->size = 1 * 1024; + + // ensure all memory is zero + for (int i = 0; i < 1 * 1024; i++) + { + allocator->memory[i] = 0; + } + + return allocator; +} + +size_t JLANG_used(void *ptr) +{ + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; + + // Iterate memory parsing only metadata + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + size_t used = 0; + while (currentHeader->in_use != 0 && used < allocPtr->size) + { + used += sizeof(JLANG_metadata) + currentHeader->size; + + // Current block is in_use, jump to next block + currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); + } + + return used; +} + +void *JLANG_last_free(void *ptr) +{ + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; + + // Iterate memory parsing only metadata + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + size_t used = 0; + while (currentHeader->in_use != 0 && used < allocPtr->size) + { + used += sizeof(JLANG_metadata) + currentHeader->size; + + // Current block is in_use, jump to next block + currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); + } + + return currentHeader; +} + +void *JLANG_malloc(void *ptr, size_t size) +{ + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; + + // 1. Hay bloques disponibles?? + size_t used = JLANG_used(ptr); + size_t available = allocPtr->size - used; + + // chequear si hay suficiente espacio libre + if (available > size + sizeof(JLANG_metadata)) + { + JLANG_metadata *freeHeader = (JLANG_metadata *)JLANG_last_free(ptr); + freeHeader->size = size; + freeHeader->in_use = 1; + + return (char *)freeHeader + sizeof(JLANG_metadata); + } + + return NULL; // TODO +} + +/* + Debug Visualization + + [FF FF FF FF FF FF FF ] +*/ + +int _ceil(float v) +{ + int n = (int)v; + float r = v - n; + + if (r > 0) + { + return n + 1; + } + return n; +} + +void JLANG_visualize(void *ptr) +{ + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; + + // Step 1. Get byte type + char *byteMapPtr = (char *)malloc(allocPtr->size); + memset(byteMapPtr, 0, allocPtr->size); + + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + long used = 0; + while (used < allocPtr->size) + { + long blockIndex = (char *)currentHeader - (char *)allocPtr->memory; + printf("blockIndex=%u\n", blockIndex); + used += sizeof(JLANG_metadata) + currentHeader->size; + + /* + HEADER + blockIndex + sizeof(JLANG_metadata) + */ + + if (currentHeader->size > 0) + { + byteMapPtr[blockIndex] = JLANG_HEADER; + for (int i = 0; i < sizeof(JLANG_metadata); i++) + { + byteMapPtr[blockIndex + i] = JLANG_HEADER; + } + + /* + PAYLOAD + */ + for (int i = 0; i < currentHeader->size; i++) + { + byteMapPtr[blockIndex + sizeof(JLANG_metadata) + i] = JLANG_PAYLOAD; + } + } else { + break; + } + + // Jump to next block + currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); + } + + // Step 2. Draw + + int bytePerRow = 40; + int totalRows = _ceil(allocPtr->size / bytePerRow); + printf("totalRows=%d\n", totalRows); + + char *currentMemPtr = allocPtr->memory; + + for (int i = 0; i < totalRows; i++) + { + printf("["); + for (int n = 0; n < bytePerRow; n++) + { + + int index = n + i * bytePerRow; + + switch (byteMapPtr[index]) + { + case JLANG_HEADER: + printf("\033[46m"); + break; + case JLANG_FREE: + printf("\033[32m"); + break; + default: + printf("\033[41m"); + break; + } + + printf("%.2x", (unsigned char) *(currentMemPtr + (n + i * bytePerRow))); + + if (n < bytePerRow - 1) + { + printf(" "); + } + + printf("\033[0m"); + } + + printf("]\n"); + } +}