From e5054c6c4d93c47e798ee59d73e232e436a00855 Mon Sep 17 00:00:00 2001 From: ken Date: Tue, 4 Oct 2016 13:45:33 -0700 Subject: [PATCH] macro fixes +comments --- src/apc/irmem.c | 109 ++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 50 deletions(-) diff --git a/src/apc/irmem.c b/src/apc/irmem.c index 6089f91..67068d9 100644 --- a/src/apc/irmem.c +++ b/src/apc/irmem.c @@ -38,30 +38,50 @@ inc_posts(void); //"type free" chunk stacking struct chunk_stack { void* chunks[MAX_CHUNKS]; - void* csp; //chunk stack pointer + void* *csp; //chunk stack pointer void* dsp[MAX_CHUNKS]; //dat stack pointer (per chunk) - int max_dats; //num dats in a chunk -} ocs, vcs, ccs, rcs, lcs, pcs; //odat, vdat, and cdat, ref, link, post stacks - -//type safety handled by macro expansion -#define CURRENT_CHUNK(STACK) ( (void*) (STACK).csp - (void*) (STACK).chunks - 1) -#define CHUNKS_LEN(STACK) ( (void*) (STACK).csp - (void*) (STACK).chunks) -#define CHUNK_FULL(STACK, TYPE) ( (CURRENT_DAT(STACK,TYPE) - (TYPE) CURRENT_CHUNK(STACK)) \ - >= (STACK).max_dats ) -#define CSP_PUSH(STACK) (++(STACK).csp = malloc(pagesize * PAGES_PER_CHUNK)) -#define CURRENT_DAT(STACK,TYPE) ((TYPE) (STACK).dsp[CHUNKS_LEN(STACK)]) -#define PREVIOUS_DAT(STACK,TYPE) ((TYPE) (STACK).dsp[CHUNKS_LEN(STACK)]-1) -#define INCREMENT_DAT(STACK,TYPE) (++CURRENT_DAT(STACK,TYPE)) -//Stack-specific macros -#define CURRENT_ODAT() (CURRENT_DAT(ocs,struct odat*)) -#define CURRENT_VDAT() (CURRENT_DAT(vcs,struct vdat*)) -#define CURRENT_CDAT() (CURRENT_DAT(ccs,struct cdat*)) -#define CURRENT_LINK() (CURRENT_DAT(lcs,struct link*)) -#define CURRENT_POST() (CURRENT_DAT(pcs,struct ref*)) -#define CURRENT_REF() (CURRENT_DAT(rcs,struct ref*)) -#define PREVIOUS_REF() (PREVIOUS_DAT(rcs, struct ref*)) + int chunk_size; //size of a chunk (including its forfeited page) + int max_dats; //number of dats per chunk for this stack +} ocs, vcs, ccs, rcs, lcs, pcs; //odat, vdat, and cdat, ref, link, post stacks + +//type safety handled by macro expansion (do not call these directly from code, make dependent macros for access to these) +#define CHUNKS_LEN(STACK) ((STACK).csp - (STACK).chunks) +#define CURRENT_CHUNK(STACK) ((STACK).chunks[CHUNKS_LEN(STACK) - 1]) +#define CURRENT_DSP(STACK,TYPE) ((TYPE*) ((STACK).dsp[CHUNKS_LEN(STACK) - 1])) +#define DATA_FULL(STACK,TYPE) ((void*) CURRENT_DSP(STACK,TYPE) >= \ + (CURRENT_CHUNK(STACK) + (STACK).chunk_size)) +#define CSP_PUSH(STACK) (*(++(STACK).csp) = malloc((STACK).chunk_size)) +#define CURRENT_DATP(STACK,TYPE) (((TYPE**)(STACK).dsp)[CHUNKS_LEN(STACK) - 1]) +#define PREVIOUS_DATP(STACK,TYPE) (((TYPE**)(STACK).dsp)[CHUNKS_LEN(STACK) - 2]) +#define ALLOC_DAT(STACK,TYPE) (++CURRENT_DATP(STACK,TYPE)) +#define INIT_STACK(STACK,TYPE) \ + do { \ + (STACK).chunk_size = PAGES_PER_CHUNK; \ + (STACK).max_dats = (STACK).chunk_size / sizeof (TYPE); \ + CSP_PUSH(STACK); \ + } while (0) +//Stack-specific macros (called directly from code (safety enforcement) +#define CURRENT_ODAT() (CURRENT_DATP(ocs,struct odat)) +#define ODAT_FULL() (DATA_FULL(ocs,struct odat)) +#define ODAT_ALLOC() (ALLOC_DAT(ocs,struct odat)) +#define CURRENT_VDAT() (CURRENT_DATP(vcs,struct vdat)) +#define VDAT_FULL() (DATA_FULL(vcs,struct vdat)) +#define VDAT_ALLOC() (ALLOC_DAT(vcs,struct vdat)) +#define CURRENT_CDAT() (CURRENT_DATP(ccs,struct cdat)) +#define CDAT_FULL() (DATA_FULL(ccs, struct cdat)) +#define CDAT_ALLOC() (ALLOC_DAT(ccs, struct cdat)) +#define CURRENT_LINK() (CURRENT_DATP(lcs,struct link)) +#define LDAT_FULL() (DATA_FULL(lcs, struct link)) +#define LDAT_ALLOC() (ALLOC_DAT(lcs, struct link)) +#define CURRENT_POST() (CURRENT_DATP(pcs,struct ref)) +#define POST_FULL() (DATA_FULL(pcs,struct ref)) +#define POST_ALLOC() (ALLOC_DAT(pcs,struct ref)) +#define CURRENT_REF() (CURRENT_DATP(rcs,struct ref)) +#define PREVIOUS_REF() (PREVIOUS_DATP(rcs, struct ref)) +#define REF_FULL() (DATA_FULL(rcs,struct ref)) +#define REF_ALLOC() (ALLOC_DAT(rcs,struct ref)) //Metadata -#define CURRENT_SET() (CURRENT_CDAT()->set_list[CURRENT_CDAT()->num_sets]) +#define CURRENT_SET() (CURRENT_CDAT()->set_list[CURRENT_CDAT()->num_sets]) #define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models]) @@ -164,54 +184,47 @@ alloc_cdat() return CURR_CDAT; } + +//these should probably be inline struct odat* alloc_odat () -{ - if(CHUNK_FULL(ocs, struct odat*)) +{ if(ODAT_FULL()) CSP_PUSH(ocs); else - INCREMENT_DAT(ocs, struct odat*); - + ODAT_ALLOC(); return CURRENT_ODAT(); } void alloc_vdat () -{ - num_vdats++; - - if(CHUNK_FULL(vcs, struct vdat*)) +{ num_vdats++; + if(VDAT_FULL()) CSP_PUSH(vcs); else - INCREMENT_DAT(vcs, struct vdat*); - + VDAT_ALLOC(); } struct link* alloc_link () -{ - num_links++; - - if(CHUNK_FULL(lcs, struct link*)) +{ num_links++; + if(LDAT_FULL()) CSP_PUSH(lcs); else - INCREMENT_DAT(lcs, struct link*); - + LDAT_ALLOC(); return CURRENT_LINK(); } struct ref* alloc_ref () -{ - num_refs++; - if(CHUNK_FULL(rcs, struct link*)) +{ num_refs++; + if(REF_FULL()) CSP_PUSH(rcs); else - INCREMENT_DAT(rcs, struct link*); + REF_ALLOC(); if(num_refs % 16 == 0) { CURRENT_POST() = CURRENT_REF(); @@ -223,15 +236,11 @@ alloc_ref void inc_posts() -{ - num_posts++; - - if(CHUNK_FULL(pcs, struct ref*)) - {CSP_PUSH(pcs);} +{ num_posts++; + if(POST_FULL()) + CSP_PUSH(pcs); else - INCREMENT_DAT(pcs, struct ref*); - - + POST_ALLOC(); } struct cdat* -- 2.18.0