Archived
1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
skcblitz/mem.h

95 lines
2.7 KiB
C
Raw Permalink Normal View History

2025-09-02 14:43:36 +02:00
void *mem_alloc(ulong size, byte cat) {
byte *ptr = malloc(size + sizeof(ulong));
if(ptr) {
sys.mem_alloc += size;
sys.mem_blocks += 1;
sys.mem_peak = sys.mem_alloc > sys.mem_peak ? sys.mem_alloc : sys.mem_peak;
sys.mem_pool_sizes[cat] += size;
sys.mem_pool_blocks[cat] += 1;
*((ulong*)ptr) = ((ulong)size) | (((ulong)cat) << 56);
ptr += sizeof(ulong);
#ifdef MEM_TRACING
logt(LOG_MEM, STR_MEM_ALLOC, size, (ulong)ptr, sys.mem_alloc, mem_types[cat]);
#endif
}
else {
sys_panic("OUT_OF_MEMORY", "Konnte nicht %lld Bytes Speicher für %s reservieren", size, mem_types[cat]);
}
return (void *)ptr;
}
void *mem_zeros(ulong size, byte cat) {
byte *ptr = calloc(size + sizeof(ulong), 1);
if(ptr) {
sys.mem_alloc += size;
sys.mem_blocks += 1;
sys.mem_peak = sys.mem_alloc > sys.mem_peak ? sys.mem_alloc : sys.mem_peak;
sys.mem_pool_sizes[cat] += size;
sys.mem_pool_blocks[cat] += 1;
*((ulong*)ptr) = ((ulong)size) | (((ulong)cat) << 56);
ptr += sizeof(ulong);
#ifdef MEM_TRACING
logt(LOG_MEM, STR_MEM_ALLOC, size, (ulong)ptr, sys.mem_alloc, mem_types[cat]);
#endif
}
else {
sys_panic("OUT_OF_MEMORY", "Konnte nicht %lld Bytes Speicher für %s reservieren", size, mem_types[cat]);
}
return (void *)ptr;
}
void mem_free(void *vptr) {
byte *ptr = (byte *)vptr;
ulong size;
byte cat;
if(ptr == NULL) {
return;
}
ptr -= sizeof(ulong);
size = (ulong)(((ulong)*((ulong*)ptr)) & 0x00ffffffffffffffULL);
cat = (byte)(((ulong)*((ulong*)ptr)) >> 56);
free(ptr);
sys.mem_alloc -= size;
sys.mem_blocks -= 1;
sys.mem_pool_sizes[cat] -= size;
sys.mem_pool_blocks[cat] -= 1;
#ifdef MEM_TRACING
logt(LOG_MEM, STR_MEM_FREE, size, (ulong)ptr, sys.mem_alloc, mem_types[cat]);
#endif
}
void *mem_realloc(void *vptr, ulong size, byte cat) {
byte *ptr = (byte *)vptr;
ulong psize;
byte ocat;
byte *nptr;
if(ptr == NULL) {
return mem_alloc(size, cat);
}
else if(size == 0) {
mem_free(ptr);
return NULL;
}
ptr -= sizeof(ulong);
psize = (ulong)(((ulong)*((ulong*)ptr)) & 0x00ffffffffffffffULL);
ocat = (byte)(((ulong)*((ulong*)ptr)) >> 56);
nptr = realloc(ptr, size + sizeof(ulong));
if(nptr) {
sys.mem_alloc -= psize;
sys.mem_alloc += size;
sys.mem_peak = sys.mem_alloc > sys.mem_peak ? sys.mem_alloc : sys.mem_peak;
sys.mem_pool_sizes[ocat] -= psize;
sys.mem_pool_sizes[cat] += size;
*((ulong*)nptr) = ((ulong)size) | (((ulong)cat) << 56);
nptr += sizeof(ulong);
#ifdef MEM_TRACING
logt(LOG_MEM, STR_MEM_REALLOC, psize, size, (ulong)nptr, sys.mem_alloc, mem_types[cat]);
#endif
}
else {
sys_panic("OUT_OF_MEMORY", "Konnte nicht %lld auf %lld Bytes Speicher bei $%llx für %s neu reservieren", psize, size, (ulong)ptr, mem_types[cat]);
}
return (void *)nptr;
}