94 lines
2.7 KiB
C
94 lines
2.7 KiB
C
|
|
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;
|
|
}
|