X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fwebcc.git;a=blobdiff_plain;f=src%2Fapc%2Firmem.c;h=3716d59f4f2c55a8428ccbde973096ebdf172f77;hp=67068d970df760567acf33dee459cce6cc44d7f3;hb=c5aa6d0763078cf697ecb8c2b561a2cc521dfbd6;hpb=e5054c6c4d93c47e798ee59d73e232e436a00855 diff --git a/src/apc/irmem.c b/src/apc/irmem.c index 67068d9..3716d59 100644 --- a/src/apc/irmem.c +++ b/src/apc/irmem.c @@ -26,7 +26,7 @@ curr_vdat(void); struct set* curr_set(void); struct ref* -prev_ref(void); +curr_ref(void); struct model* curr_model(void); void @@ -34,7 +34,6 @@ inc_posts(void); #define PAGES_PER_CHUNK 16 -#define CURR_CDAT (*cdat_stackp) //"type free" chunk stacking struct chunk_stack { void* chunks[MAX_CHUNKS]; @@ -47,6 +46,8 @@ struct chunk_stack //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 CHUNKS_FULL(STACK) ( (STACK).csp >= \ + (STACK).chunks + MAX_CHUNKS * (STACK).chunk_size) #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)) @@ -54,32 +55,47 @@ struct chunk_stack #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; \ +#define INIT_STACK(STACK,TYPE) \ + { int i; \ + (STACK).chunk_size = PAGES_PER_CHUNK * pagesize; \ (STACK).max_dats = (STACK).chunk_size / sizeof (TYPE); \ - CSP_PUSH(STACK); \ - } while (0) + CSP_PUSH(STACK); \ + for( i = 0; i < MAX_CHUNKS; i++){ \ + (STACK).dsp[i] += pagesize; \ + } \ + } //Stack-specific macros (called directly from code (safety enforcement) +#define INIT_ODAT() (INIT_STACK(ocs, struct odat)) #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 OCS_FULL() (CHUNKS_FULL(ocs)) +#define INIT_VDAT() (INIT_STACK(vcs, struct vdat)) #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 VCS_FULL() (CHUNKS_FULL(vcs)) +#define INIT_CDAT() (INIT_STACK(ccs, struct cdat)) #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 CCS_FULL() (CHUNKS_FULL(ccs)) +#define INIT_LINK() (INIT_STACK(lcs, struct link)) #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 LCS_FULL() (CHUNKS_FULL(lcs)) +#define INIT_POST() (INIT_STACK(rcs, struct ref)) #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 PCS_FULL() (CHUNKS_FULL(pcs)) +#define INIT_REF() (INIT_STACK(rcs, 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)) +#define RCS_FULL() (CHUNKS_FULL(rcs)) //Metadata #define CURRENT_SET() (CURRENT_CDAT()->set_list[CURRENT_CDAT()->num_sets]) #define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models]) @@ -89,13 +105,9 @@ struct chunk_stack long pagesize; -int pages_per_chunk = 10; - int num_cdats = 0; -int curr_max_cdats = PTRS_IN_PAGE; -struct cdat* cdat_buf[PTRS_IN_PAGE]; -struct cdat* cdat_stack[PTRS_IN_PAGE]; +struct cdat* cdat_stack[MAX_CLASSES]; struct cdat** cdat_stackp; int num_odats = 0; @@ -105,14 +117,9 @@ int num_vdats = 0; int num_refs = 0; uint64_t ss_ref_id = 0x00FFFFFF; /* system space for ref_ids */ -int num_posts = -1; -int curr_max_posts = PTRS_IN_PAGE; -struct ref* post_buf[PTRS_IN_PAGE]; - +int num_posts = 0; -int num_links = -1; -int curr_max_links = PTRS_IN_PAGE; -struct link* link_buf[PTRS_IN_PAGE]; +int num_links = 0; /* The initalization function of the IR. */ @@ -120,21 +127,20 @@ int ir_init() { - /* Init root cdat and stack */ char root[4] = "root"; - if( (cdat_buf[num_cdats] = (struct cdat*) malloc(sizeof(struct cdat))) == NULL) - { - perror("malloc root class failed\n"); - return -1; - } - cdat_buf[num_cdats]->idx = num_cdats; - memmove(cdat_buf[num_cdats]->name, root, 4); + pagesize = sysconf(_SC_PAGESIZE); - cdat_stackp = cdat_stack; - *cdat_stackp++ = cdat_buf[num_cdats++]; + INIT_CDAT(); + *cdat_stackp = CURRENT_CDAT(); + memmove((*cdat_stackp)->name, root, 32); + + INIT_ODAT(); + INIT_VDAT(); + INIT_LINK(); + INIT_REF(); + INIT_POST(); - pagesize = sysconf(_SC_PAGESIZE); return 0; @@ -145,54 +151,68 @@ ir_quit() { int i; - for(i = 0; i <= num_odats ; i++) + for(i = 0; i < CHUNKS_LEN(ccs) ; i++) { + free(ccs.chunks[i]); } - for(i = 0; i <= num_cdats; i++) + for(i = 0; i < CHUNKS_LEN(ocs); i++) { + free(ocs.chunks[i]); } - for(i = 0; i <= num_vdats; i++) + for(i = 0; i < CHUNKS_LEN(vcs) ; i++) { + free(vcs.chunks[i]); } - for(i = 0; i <= num_refs; i++) + for(i = 0; i < CHUNKS_LEN(rcs); i++) { + free(rcs.chunks[i]); } - for(i = 0; i<= num_links; i++) + for(i = 0; i < CHUNKS_LEN(lcs); i++) { + free(lcs.chunks[i]); } - for(i = 0; i<= num_posts; i++) + for(i = 0; i < CHUNKS_LEN(pcs); i++) { + free(pcs.chunks[i]); } } -//TODO: FREE MEMORY! struct cdat* alloc_cdat() { num_cdats++; - if(curr_max_cdats <= num_cdats) - { if( (realloc((void*) cdat_buf, PTRS_IN_PAGE * 4)) == NULL) - perror("realloc cdat_buf failed"); - curr_max_cdats += PTRS_IN_PAGE; - if( (realloc( (void*) cdat_stack, PTRS_IN_PAGE * 4)) == NULL) //increase cdat_stack also - perror("realloc cdat_stack failed"); + if(CDAT_FULL()) + { if(CCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) cdats ", num_cdats); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(ccs); } - if( (CURR_CDAT = (struct cdat*) malloc(sizeof (struct cdat)) ) == NULL ) - perror("malloc cdat failed"); - - return CURR_CDAT; + else + CDAT_ALLOC(); + return CURRENT_CDAT(); } //these should probably be inline struct odat* alloc_odat () -{ if(ODAT_FULL()) - CSP_PUSH(ocs); +{ + num_odats++; + if(ODAT_FULL()) + { if(!OCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) odats ", num_odats); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(ocs); + } else ODAT_ALLOC(); + return CURRENT_ODAT(); } @@ -201,7 +221,13 @@ alloc_vdat () { num_vdats++; if(VDAT_FULL()) - CSP_PUSH(vcs); + { if(!VCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) vdats ", num_vdats); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(vcs); + } else VDAT_ALLOC(); } @@ -211,10 +237,18 @@ alloc_link () { num_links++; if(LDAT_FULL()) - CSP_PUSH(lcs); + { if(!LCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) links ", num_links); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(lcs); + } else LDAT_ALLOC(); + return CURRENT_LINK(); + } struct ref* @@ -222,10 +256,17 @@ alloc_ref () { num_refs++; if(REF_FULL()) - CSP_PUSH(rcs); + { if(!RCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) refs ", num_refs); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(rcs); + } else REF_ALLOC(); + if(num_refs % 16 == 0) { CURRENT_POST() = CURRENT_REF(); inc_posts(); @@ -238,16 +279,23 @@ void inc_posts() { num_posts++; if(POST_FULL()) - CSP_PUSH(pcs); + { if(!PCS_FULL()) + { fprintf(stderr, "You have allocated to many (%d) refs ", num_posts); + exit(EXIT_FAILURE); + } + else + CSP_PUSH(pcs); + } else POST_ALLOC(); + } struct cdat* curr_cdat () { - return CURR_CDAT; + return (*cdat_stackp); } struct odat* @@ -269,10 +317,10 @@ curr_set return &CURRENT_SET(); } struct ref* -prev_ref +curr_ref () { - return PREVIOUS_REF(); + return CURRENT_REF(); } struct model* curr_model