first and last commit
This commit is contained in:
commit
c9e78fd810
381 changed files with 37141 additions and 0 deletions
94
mem.h
Normal file
94
mem.h
Normal file
|
@ -0,0 +1,94 @@
|
|||
|
||||
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;
|
||||
}
|
Reference in a new issue