void MemPool_Release_All_IMP(MemoryPool *self) { MemoryPoolIVARS *const ivars = MemPool_IVARS(self); DECREF(ivars->arenas); ivars->arenas = Vec_new(16); ivars->tick = -1; ivars->buf = NULL; ivars->last_buf = NULL; ivars->limit = NULL; ivars->consumed = 0; }
MemoryPool* MemPool_init(MemoryPool *self, uint32_t arena_size) { MemoryPoolIVARS *const ivars = MemPool_IVARS(self); ivars->arena_size = arena_size == 0 ? DEFAULT_BUF_SIZE : arena_size; ivars->arenas = Vec_new(16); ivars->tick = -1; ivars->buf = NULL; ivars->limit = NULL; ivars->consumed = 0; return self; }
void* MemPool_Grab_IMP(MemoryPool *self, size_t amount) { MemoryPoolIVARS *const ivars = MemPool_IVARS(self); INCREASE_TO_WORD_MULTIPLE(amount); ivars->last_buf = ivars->buf; // Verify that we have enough stocked up, otherwise get more. ivars->buf += amount; if (ivars->buf >= ivars->limit) { // Get enough mem from system or die trying. S_init_arena(self, ivars, amount); ivars->last_buf = ivars->buf; ivars->buf += amount; } // Track bytes we've allocated from this pool. ivars->consumed += amount; return ivars->last_buf; }
void MemPool_Resize_IMP(MemoryPool *self, void *ptr, size_t new_amount) { MemoryPoolIVARS *const ivars = MemPool_IVARS(self); const size_t last_amount = (size_t)(ivars->buf - ivars->last_buf); INCREASE_TO_WORD_MULTIPLE(new_amount); if (ptr != ivars->last_buf) { THROW(ERR, "Not the last pointer allocated."); } else { if (new_amount <= last_amount) { const size_t difference = last_amount - new_amount; ivars->buf -= difference; ivars->consumed -= difference; } else { THROW(ERR, "Can't resize to greater amount: %u64 > %u64", (uint64_t)new_amount, (uint64_t)last_amount); } } }
size_t MemPool_Get_Consumed_IMP(MemoryPool *self) { return MemPool_IVARS(self)->consumed; }
void MemPool_Destroy_IMP(MemoryPool *self) { MemoryPoolIVARS *const ivars = MemPool_IVARS(self); DECREF(ivars->arenas); SUPER_DESTROY(self, MEMORYPOOL); }
char* MemPool_Get_Buf_IMP(MemoryPool *self) { return MemPool_IVARS(self)->buf; }
uint32_t PostPool_Refill_IMP(PostingPool *self) { PostingPoolIVARS *const ivars = PostPool_IVARS(self); Lexicon *const lexicon = ivars->lexicon; PostingList *const plist = ivars->plist; I32Array *const doc_map = ivars->doc_map; const uint32_t mem_thresh = ivars->mem_thresh; const int32_t doc_base = ivars->doc_base; uint32_t num_elems = 0; // number of items recovered String *term_text = NULL; if (ivars->lexicon == NULL) { return 0; } else { term_text = (String*)Lex_Get_Term(lexicon); } // Make sure buffer is empty. if (ivars->buf_max - ivars->buf_tick > 0) { THROW(ERR, "Refill called but buffer contains %u32 items", ivars->buf_max - ivars->buf_tick); } ivars->buf_max = 0; ivars->buf_tick = 0; // Ditch old MemoryPool and get another. DECREF(ivars->mem_pool); ivars->mem_pool = MemPool_new(0); MemoryPool *const mem_pool = ivars->mem_pool; MemoryPoolIVARS *const mem_pool_ivars = MemPool_IVARS(mem_pool); while (1) { if (ivars->post_count == 0) { // Read a term. if (Lex_Next(lexicon)) { ivars->post_count = Lex_Doc_Freq(lexicon); term_text = (String*)Lex_Get_Term(lexicon); if (term_text && !Obj_Is_A((Obj*)term_text, STRING)) { THROW(ERR, "Only String terms are supported for now"); } Posting *posting = PList_Get_Posting(plist); Post_Set_Doc_ID(posting, doc_base); ivars->last_doc_id = doc_base; } // Bail if we've read everything in this run. else { break; } } // Bail if we've hit the ceiling for this run's buffer. if (mem_pool_ivars->consumed >= mem_thresh && num_elems > 0) { break; } // Read a posting from the input stream. RawPosting *rawpost = PList_Read_Raw(plist, ivars->last_doc_id, term_text, mem_pool); RawPostingIVARS *const rawpost_ivars = RawPost_IVARS(rawpost); ivars->last_doc_id = rawpost_ivars->doc_id; ivars->post_count--; // Skip deletions. if (doc_map != NULL) { const int32_t remapped = I32Arr_Get(doc_map, rawpost_ivars->doc_id - doc_base); if (!remapped) { continue; } rawpost_ivars->doc_id = remapped; } // Add to the run's buffer. if (num_elems >= ivars->buf_cap) { size_t new_cap = Memory_oversize(num_elems + 1, sizeof(Obj*)); PostPool_Grow_Buffer(self, new_cap); } ivars->buffer[num_elems] = (Obj*)rawpost; num_elems++; } // Reset the buffer array position and length; remember file pos. ivars->buf_max = num_elems; ivars->buf_tick = 0; return num_elems; }