2017-01-14 03:01:35 +00:00
|
|
|
/*
|
|
|
|
* Mr. 4th Dimention - Allen Webster
|
|
|
|
*
|
|
|
|
* 01.14.2017
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
// TOP
|
|
|
|
|
|
|
|
#ifndef FED_DEBUG_MEM_H
|
|
|
|
#define FED_DEBUG_MEM_H
|
|
|
|
|
2017-06-16 23:10:50 +00:00
|
|
|
// NOTE(allen): Prevent any future instantiation of 4coder_mem.h
|
2017-01-14 03:01:35 +00:00
|
|
|
#define FCODER_MEM_H
|
|
|
|
|
|
|
|
#if !defined(OS_PAGE_SIZE)
|
|
|
|
#define OS_PAGE_SIZE 4096
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct Debug_GM{
|
|
|
|
System_Functions *system;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
debug_gm_open(System_Functions *system, Debug_GM *general, void *memory, i32 size){
|
|
|
|
general->system = system;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void*
|
|
|
|
debug_gm_allocate(Debug_GM *general, int32_t size){
|
|
|
|
System_Functions *system = general->system;
|
2017-06-16 23:10:50 +00:00
|
|
|
|
|
|
|
local_persist u32 page_round_val = OS_PAGE_SIZE-1;
|
|
|
|
int32_t page_rounded_size = (size + page_round_val) & (~page_round_val);
|
|
|
|
u8 *result = (u8*)system->memory_allocate(page_rounded_size + OS_PAGE_SIZE);
|
|
|
|
system->memory_set_protection(result + page_rounded_size, OS_PAGE_SIZE, 0);
|
|
|
|
|
|
|
|
local_persist u32 align_round_val = PREFERRED_ALIGNMENT-1;
|
|
|
|
int32_t align_rounded_size = (size + align_round_val) & (~align_round_val);
|
|
|
|
int32_t offset = page_rounded_size - align_rounded_size;
|
|
|
|
|
|
|
|
return(result + offset);
|
2017-01-14 03:01:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
debug_gm_free(Debug_GM *general, void *memory){
|
2017-06-16 23:10:50 +00:00
|
|
|
u8 *ptr = (u8*)memory;
|
|
|
|
umem val = *(umem*)(&ptr);
|
|
|
|
val &= ~(0xFFF);
|
|
|
|
ptr = *(u8**)(&val);
|
|
|
|
|
|
|
|
Assert(sizeof(val) == sizeof(ptr));
|
|
|
|
|
2017-01-14 03:01:35 +00:00
|
|
|
System_Functions *system = general->system;
|
2017-06-16 23:10:50 +00:00
|
|
|
system->memory_free(ptr, 0);
|
2017-01-14 03:01:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void*
|
|
|
|
debug_gm_reallocate(Debug_GM *general, void *old, int32_t old_size, int32_t size){
|
|
|
|
void *result = debug_gm_allocate(general, size);
|
|
|
|
memcpy(result, old, old_size);
|
|
|
|
debug_gm_free(general, old);
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void*
|
|
|
|
debug_gm_reallocate_nocopy(Debug_GM *general, void *old, int32_t size){
|
|
|
|
debug_gm_free(general, old);
|
|
|
|
void *result = debug_gm_allocate(general, size);
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Redefine the normal general memory names to go to these debug names.
|
|
|
|
#define General_Memory Debug_GM
|
|
|
|
struct Debug_Mem_Options{
|
|
|
|
Partition part;
|
|
|
|
General_Memory general;
|
|
|
|
};
|
|
|
|
#define Mem_Options Debug_Mem_Options
|
|
|
|
#define general_memory_open(sys,gen,mem,siz) debug_gm_open(sys,gen,mem,siz)
|
|
|
|
#define general_memory_allocate(gen,siz) debug_gm_allocate(gen,siz)
|
|
|
|
#define general_memory_free(gen,siz) debug_gm_free(gen,siz)
|
|
|
|
#define general_memory_reallocate(gen,old,old_size,new_size) debug_gm_reallocate(gen,old,old_size,new_size)
|
|
|
|
#define general_memory_reallocate_nocopy(gen,old,new_size) debug_gm_reallocate_nocopy(gen,old,new_size)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// BOTTOM
|
|
|
|
|