#include // printf() #include // malloc() free() #include // memset() #include "../defines.h" #include "../logger/logger.h" #include "zone.h" typedef struct ZoneHeader { u64 capacity; u64 cur_size; } ZoneHeader; Zone *zoneCreate(size_t sizeBytes) { // First we need to get a block of memory from the OS // This block needs to include the size of what we want to store // plus the size of our ZoneHeader void *mem_block = malloc(sizeBytes + sizeof(ZoneHeader)); // Now that we have the block let's get the addresses // for where the header is, and the offset where the data starts ZoneHeader *zone_header = (ZoneHeader *)mem_block; Zone *zone_addr = (Zone *)(zone_header + sizeof(ZoneHeader)); // Initialize the values of the header zone_header->capacity = sizeBytes; zone_header->cur_size = 0; return zone_addr; } void *zoneAlloc(Zone *zone, size_t sizeBytes) { ZoneHeader *zone_header = (ZoneHeader *)zone - sizeof(ZoneHeader); if (zone_header->cur_size + sizeBytes > zone_header->capacity) { QERROR("Could not allocate, not enough space."); return NULL; } void *new_mem = (char *)zone + zone_header->cur_size; zone_header->cur_size += sizeBytes; printf("Zone Header Information:\n"); printf("Current Size: %" PRIu64 "\n", zone_header->cur_size); printf("Total Capacity: %" PRIu64 "\n", zone_header->capacity); return new_mem; } void zoneFree(void *data, size_t dataSize) { // TODO: We want to eventually pass in a pointer to the zone so we can track // our free blocks // Lets first check to make sure we weren't given a NULL pointer if (data == NULL) return; // First we need to set the memory starting at `data` and going to `dataSize` // to 0 memset(data, 0, dataSize); // Now we need to null the pointer data = NULL; // TODO: Add logic to alert that this space can now be used } void zoneClear(Zone *zone) { ZoneHeader *zone_header = (ZoneHeader *)zone - sizeof(ZoneHeader); zone_header->cur_size = 0; printf("Zone Header Information:\n"); printf("Current Size: %" PRIu64 "\n", zone_header->cur_size); printf("Total Capacity: %" PRIu64 "\n", zone_header->capacity); } void zoneDestroy(Zone *zone) { // First we need to go back to the beginning of the header as we returned // an offset for the user to use void *del_mem = (ZoneHeader *)zone - sizeof(ZoneHeader); // Free the memory free(del_mem); }