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; }