Beispiel #1
0
void
BBSortEx_flush(BBSortEx *self)
{
    u32_t        cache_count = self->cache_max - self->cache_tick;
    VArray      *elems;
    BBSortExRun *run;
    u32_t        i;

    if (!cache_count) return;
    else elems = VA_new(cache_count);

    /* Sort, then create a new run. */
    BBSortEx_Sort_Cache(self);
    for (i = self->cache_tick; i < self->cache_max; i++) {
        VA_Push(elems, self->cache[i]);
    }
    run = BBSortExRun_new(elems);
    DECREF(elems);
    BBSortEx_Add_Run(self, (SortExRun*)run);
    DECREF(run);

    /* Blank the cache vars. */
    self->cache_tick += cache_count;
    SortEx_Clear_Cache(self);
}
Beispiel #2
0
void
SortEx_Destroy_IMP(SortExternal *self) {
    SortExternalIVARS *const ivars = SortEx_IVARS(self);
    FREEMEM(ivars->scratch);
    FREEMEM(ivars->slice_sizes);
    FREEMEM(ivars->slice_starts);
    if (ivars->cache) {
        SortEx_Clear_Cache(self);
        FREEMEM(ivars->cache);
    }
    DECREF(ivars->runs);
    SUPER_DESTROY(self, SORTEXTERNAL);
}
Beispiel #3
0
static void
S_refill_cache(SortExternal *self, SortExternalIVARS *ivars) {
    // Reset cache vars.
    SortEx_Clear_Cache(self);

    // Make sure all runs have at least one item in the cache.
    uint32_t i = 0;
    while (i < VA_Get_Size(ivars->runs)) {
        SortExternal *const run = (SortExternal*)VA_Fetch(ivars->runs, i);
        if (SortEx_Cache_Count(run) > 0 || SortEx_Refill(run) > 0) {
            i++; // Run has some elements, so keep.
        }
        else {
            VA_Excise(ivars->runs, i, 1);
        }
    }

    // Absorb as many elems as possible from all runs into main cache.
    if (VA_Get_Size(ivars->runs)) {
        uint8_t *endpost = S_find_endpost(self, ivars);
        S_absorb_slices(self, ivars, endpost);
    }
}