ref: 1da09c81867fc8416f99b8d7a24d73b2e3acf6e6
dir: /memory.c/
#include <u.h> #include <libc.h> #include <fcall.h> #include <thread.h> #include <9p.h> #include "dat.h" #include "fns.h" /* This version of the memory manager is very stupid, * but it allows us to get started.. */ typedef struct Allocation Allocation; struct Allocation { usize size; int tag; int root; void *buf; void *extra; }; uvlong nallocs; static Allocation **allocations; /* all allocations */ DataSpec dataspecs[DataMax] = { /* DataAux: setup in fs.c */ [DataSession] = {.size = sizeof(Session) }, /* DataSessionList: setup in session.c */ [DataModule] = {.size = sizeof(Module) }, [DataModuleList] = {.size = sizeof(ModuleList) }, [DataSymtab] = {.size = sizeof(Symtab) }, [DataSymbol] = {.size = sizeof(Symbol) }, [DataEnumeration] = {.size = sizeof(Enumeration) }, [DataTokenList] = {.size = sizeof(TokenList) }, [DataAst] = {.size = sizeof(Ast) }, [DataByteCode] = {.size = sizeof(ByteCode) }, [DataValueStack] = {.size = sizeof(ValueStack) }, [DataCallStack] = {.size = sizeof(CallStack) }, [DataFunction] = {.size = sizeof(Function) }, [DataLocalList] = {.size = sizeof(LocalList) }, [DataErrorCtx] = {.size = sizeof(ErrorCtx) }, [DataErrorTrap] = {.size = sizeof(ErrorTrap) }, }; void * alloc(int tag) { usize size = dataspecs[tag].size; Allocation *a = emalloc9p(sizeof(Allocation) + size); a->size = size; a->tag = tag; a->root = 0; a->buf = ((uchar*)a)+sizeof(Allocation); a->extra = nil; memset(a->buf, 0, size); nallocs++; allocations = erealloc9p(allocations, nallocs * sizeof(Allocation*)); allocations[nallocs-1] = a; return a->buf; } static Allocation * allocptr(void *v) { uchar *p = v; p -= sizeof(Allocation); return (Allocation*)p; } int getalloctag(void *d) { Allocation *a = allocptr(d); return a->tag; } void setroot(void *d, int v) { Allocation *a = allocptr(d); a->root = v; } void * dataptr(void *d) { Allocation *a = allocptr(d); return a->buf; } void * allocextra(void *d, usize size) { Allocation *a = allocptr(d); a->extra = erealloc9p(a->extra, size); return a->extra; }