Exemplo n.º 1
0
/* Updates segment information:
 * - Calculate number of stored sc-elements
 * - Free unused cells in segments
 */
void sc_storage_update_segments()
{
    sc_uint32 idx = 0;
    sc_uint32 elements_count = 0;
    sc_uint32 element_free_count = 0;
    sc_uint32 oldest_time_stamp = 0;
    sc_segment *seg = 0;

    stored_elements_count = 0;

    oldest_time_stamp = sc_iterator_get_oldest_timestamp();
    if (oldest_time_stamp == 0)
        oldest_time_stamp = sc_storage_get_time_stamp();

    for (idx = 0; idx < segments_num; ++idx)
    {
        seg = segments[idx];
        if (seg == 0) continue; // @todo segments load
        elements_count = sc_segment_get_elements_count(seg);
        stored_elements_count += elements_count;
        // @todo oldest timestamp
        element_free_count = sc_segment_free_garbage(seg, oldest_time_stamp);

        if (elements_count < SEGMENT_SIZE || element_free_count > 0)
            _sc_storage_append_segment_to_queue(idx);
    }
}
Exemplo n.º 2
0
sc_iterator5* sc_iterator5_new(sc_iterator5_type type, sc_iterator_param p1, sc_iterator_param p2, sc_iterator_param p3, sc_iterator_param p4, sc_iterator_param p5)
{

    // check params with template
    switch (type)
    {
    case sc_iterator5_f_a_a_a_f:
        if (p1.is_type || !p2.is_type || !p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_a_a_f_a_f:
        if (!p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_f_a_f:
        if (p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_f_a_a:
        if (p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_a_a_a:
        if (p1.is_type || !p2.is_type || !p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_a_a_f_a_a:
        if (!p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    };

    sc_iterator5 *it = g_new0(sc_iterator5, 1);

    it->params[0] = p1;
    it->params[1] = p2;
    it->params[2] = p3;
    it->params[3] = p4;
    it->params[4] = p5;

    it->type = type;
    it->time_stamp = sc_storage_get_time_stamp();

    // create main cycle iterator
    switch (type)
    {
    case sc_iterator5_f_a_a_a_f:
        it->it_main = sc_iterator3_f_a_a_new(p1.addr ,p2.type, p3.type);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_a_a_f_a_f:
        it->it_main = sc_iterator3_a_a_f_new(p1.type, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[2] = p3.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_f_a_f_a_f:
        it->it_main = sc_iterator3_f_a_f_new(p1.addr, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[2] = p3.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_f_a_f_a_a:
        it->it_main = sc_iterator3_f_a_f_new(p1.addr, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[2] = p3.addr;
        break;
    case sc_iterator5_a_a_f_a_a:
        it->it_main = sc_iterator3_a_a_f_new(p1.type,p2.type,p3.addr);
        it->it_attr = nullptr;
        it->results[2] = p3.addr;
        break;
    case sc_iterator5_f_a_a_a_a:
        it->it_main = sc_iterator3_f_a_a_new(p1.addr, p2.type, p3.type);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        break;
    };

    sc_iterator_add_used_timestamp(it->time_stamp);

    return it;
}