enum{
MM_HANDLE_REFCOUNT,
MM_HANDLE_REFCOUNT_METADATA,
MM_HANDLE_SERIALIZE_FUNC,
MM_HANDLE_DESERIALIZE_FUNC,
MM_HANDLE_META_MAX,
}mm_metadata_blocks;
typedef struct{
int huid; //handle unique ID
uintptr_t metadata[MM_HANDLE_META_MAX]; //userdefined metadata;
size_t alloc_size; //size of memory controlled by handle
void* ptr; //pointer to chunk of memory
pthread_mutex_t recursive_lock;
bool used;
}mm_handle_metablock;
typedef struct{
int huid; //after mm_handle invalidation it would be changed in metablock and all handles with huid != info->huid will cause assert!
mm_handle_metablock* info;
}mm_handle;
#define HANDLE_HEAP_SIZE (4 * 1024 * 1024)
#define HANDLE_HEAP_MINALLOC 256
static pthread_mutex_t g_heap_mutex = PTHREAD_MUTEX_INITIALIZER;
static mm_handle_metablock g_handle_metablocks[HANDLE_HEAP_SIZE / HANDLE_HEAP_MINALLOC] = {0};
static uint8_t g_handle_heap[HANDLE_HEAP_SIZE] = {0};
static size_t g_availibe_memory = HANDLE_HEAP_SIZE;
static size_t g_largest_block = HANDLE_HEAP_SIZE;
#include <stdatomic.h>
#include <pthread.h>
#include <stdint.h>
#define auto_unlock __attribute__((cleanup(NULL)));
enum{
MM_HANDLE_REFCOUNT_METADATA,
MM_HANDLE_SERIALIZE_FUNC,
MM_HANDLE_DESERIALIZE_FUNC,
MM_HANDLE_META_MAX,
}mm_metadata_blocks;
typedef struct{
uint64_t huid; //handle unique ID
void* metadata[MM_HANDLE_META_MAX]; //userdefined metadata;
size_t alloc_size; //size of memory controlled by handle
void* ptr; //pointer to chunk of memory
atomic_int refcount;
}mm_handle_metablock;
typedef struct{
uint64_t huid; //after mm_handle invalidation it would be changed in metablock and all handles with huid != info->huid will cause assert!
mm_handle_metablock* info;
}mm_handle;