#include #include #include #include #include #include #include #include struct cdat* alloc_cdat(void); struct odat* alloc_odat(void); void alloc_vdat(void); struct link* alloc_link(void); struct ref* alloc_ref(void); struct cdat* curr_cdat(void); struct odat* curr_odat(void); struct vdat* curr_vdat(void); struct set* curr_set(void); struct ref* prev_ref(void); struct model curr_model(void); void inc_posts(void); #define CURR_CDAT (*cdat_stackp) #define CURR_SET set_list[CURR_CDAT->num_sets] #define REF_IDX (num_refs % (refs_per_page * pages_per_chunk)) #define PREV_REF (ref_buf[num_ref_chunks] + (REF_IDX * (sizeof (struct ref)) + pagesize - (sizeof (struct ref)))) #define CURR_REF (ref_buf[num_ref_chunks] + (REF_IDX * (sizeof (struct ref)) + pagesize)) #define ODAT_IDX (num_odats % (odats_per_page * pages_per_chunk)) #define CURR_ODAT (odat_buf[num_odat_chunks] + (ODAT_IDX * (sizeof (struct odat)) + pagesize)) #define VDAT_IDX (num_vdats % (vdats_per_page * pages_per_chunk)) #define CURR_VDAT (vdat_buf[num_vdat_chunks] + (VDAT_IDX * (sizeof (struct vdat)) + pagesize)) #define CURR_MODEL (CURR_VDAT.model_list[CURR_VDAT.num_models]) #define CURR_LINK (link_buf[num_links]) #define CURR_POST (post_buf[num_posts]) #define CURR_QUAD (CURR_ODAT->quad_file) 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_stackp; int num_odat_chunks = 0; int num_odats = 0; void* odat_buf[MAX_CHUNKS]; long odats_per_page; int num_vdat_chunks = 0; int num_vdats = 0; void* vdat_buf[MAX_CHUNKS]; long vdats_per_page; int num_ref_chunks = 0; int num_refs = 0; void* ref_buf[MAX_CHUNKS]; long refs_per_page; 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_links = -1; int curr_max_links = PTRS_IN_PAGE; struct link* link_buf[PTRS_IN_PAGE]; /* The initalization function of the IR. */ 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); cdat_stackp = cdat_stack; *cdat_stackp++ = cdat_buf[num_cdats++]; pagesize = sysconf(_SC_PAGESIZE); odats_per_page = (sizeof (struct odat)/pagesize); vdats_per_page = (sizeof (struct vdat)/pagesize); refs_per_page = (sizeof (struct ref)/pagesize); return 0; } void ir_quit() { int i; for(i = 0; i <= num_odats ; i++) { free(odat_buf[i]); } for(i = 0; i <= num_cdats; i++) { free(cdat_buf[i]); } for(i = 0; i <= num_vdats; i++) { free(vdat_buf[i]); } for(i = 0; i <= num_refs; i++) { free(ref_buf[i]); } for(i = 0; i<= num_links; i++) { free(link_buf[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( (CURR_CDAT = (struct cdat*) malloc(sizeof (struct cdat)) ) == NULL ) perror("malloc cdat failed"); return CURR_CDAT; } struct odat* alloc_odat () { num_odats++; if(!(num_odats % (odats_per_page * pages_per_chunk))) //chunk is full { num_odat_chunks++; if( ((odat_buf[num_odat_chunks] = malloc(odats_per_page * pages_per_chunk)) == NULL) ) perror("malloc odat chunk failed"); } return CURR_ODAT; } void alloc_vdat () { num_vdats++; if(!(num_vdats % (vdats_per_page * pages_per_chunk))) //chunk is full { num_vdat_chunks++; if( ((vdat_buf[num_vdat_chunks] = malloc(vdats_per_page * pages_per_chunk)) == NULL) ) perror("malloc vdat chunk failed"); } } struct link* alloc_link () { num_links++; if(num_links >= curr_max_links) { if( (realloc((void*) link_buf, PTRS_IN_PAGE * 4)) == NULL) perror("realloc vdat_buf failed"); curr_max_links += PTRS_IN_PAGE; } if((CURR_LINK = (struct link*) malloc(sizeof (struct link))) == NULL) perror("malloc link failed"); return CURR_LINK; } struct ref* alloc_ref () { num_refs++; if(num_refs % 16 == 0) { CURR_POST = CURR_REF; inc_posts(); } if(!(num_refs % (refs_per_page * pages_per_chunk))) //chunk is full { num_ref_chunks++; if( ((ref_buf[num_ref_chunks] = malloc(refs_per_page * pages_per_chunk)) == NULL) ) perror("malloc ref chunk failed"); } return CURR_REF; } void inc_posts() { if(num_posts >= curr_max_posts) { if( (realloc((void*) ref_buf, PTRS_IN_PAGE * 4)) == NULL) perror("realoc post_buf failed"); curr_max_posts += PTRS_IN_PAGE; } if ((CURR_POST = (struct ref*) malloc (sizeof (struct ref))) == NULL) perror("malloc post failed"); } struct cdat* curr_cdat () { return CURR_CDAT; } struct odat* curr_odat () { return CURR_ODAT; } struct vdat* curr_vdat () { return CURR_VDAT; } struct set* curr_set () { return &CURR_CDAT->CURR_SET; } struct ref* prev_ref () { return PREV_REF; } struct model curr_model () { return CURR_MODEL; }