Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}
Пример #4
0
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);
        }
    }
}
Пример #5
0
size_t
MemPool_Get_Consumed_IMP(MemoryPool *self) {
    return MemPool_IVARS(self)->consumed;
}
Пример #6
0
void
MemPool_Destroy_IMP(MemoryPool *self) {
    MemoryPoolIVARS *const ivars = MemPool_IVARS(self);
    DECREF(ivars->arenas);
    SUPER_DESTROY(self, MEMORYPOOL);
}
Пример #7
0
char*
MemPool_Get_Buf_IMP(MemoryPool *self) {
    return MemPool_IVARS(self)->buf;
}
Пример #8
0
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;
}