Exemple #1
0
/* //////////////////////////////////////////////////////////////////////////////////////
 * implementation
 */
static tb_void_t tb_circle_queue_put_and_pop_test()
{
    // init
    tb_circle_queue_ref_t queue = tb_circle_queue_init(10, tb_element_long());
    tb_assert_and_check_return(queue);

    // make queue
    tb_circle_queue_put(queue, (tb_pointer_t)0);
    tb_circle_queue_put(queue, (tb_pointer_t)1);
    tb_circle_queue_put(queue, (tb_pointer_t)2);
    tb_circle_queue_put(queue, (tb_pointer_t)3);
    tb_circle_queue_put(queue, (tb_pointer_t)4);
    tb_circle_queue_put(queue, (tb_pointer_t)5);
    tb_circle_queue_put(queue, (tb_pointer_t)6);
    tb_circle_queue_put(queue, (tb_pointer_t)7);
    tb_circle_queue_put(queue, (tb_pointer_t)8);
    tb_circle_queue_put(queue, (tb_pointer_t)9);

    // done
    __tb_volatile__ tb_size_t i = 0;
    __tb_volatile__ tb_size_t n = 10000;
    tb_hong_t t = tb_mclock();
    for (i = 0; i < n; i++) 
    {
        tb_circle_queue_pop(queue);
        tb_circle_queue_put(queue, (tb_pointer_t)0xf);
    }
    t = tb_mclock() - t;

    // trace
    tb_trace_i("tb_circle_queue_put_and_pop(%lu): %lld ms, size: %lu, maxn: %lu", n, t, tb_circle_queue_size(queue), tb_circle_queue_maxn(queue));

    // check
    tb_assert(tb_circle_queue_size(queue) == 10);
    tb_assert(tb_circle_queue_head(queue) == (tb_pointer_t)0xf);
    tb_assert(tb_circle_queue_last(queue) == (tb_pointer_t)0xf);

    // clear it
    tb_circle_queue_clear(queue);
    tb_assert(!tb_circle_queue_size(queue));

    // exit
    tb_circle_queue_exit(queue);
}
Exemple #2
0
static tb_void_t tb_circle_queue_iterator_next_test()
{
    // init
    tb_size_t n = 1000000;
    tb_circle_queue_ref_t queue = tb_circle_queue_init(n, tb_element_long());
    tb_assert_and_check_return(queue);

    // make queue
    while (n--) tb_circle_queue_put(queue, (tb_pointer_t)0xf);

    // done
    tb_hong_t t = tb_mclock();
    tb_for_all (tb_char_t*, item, queue) tb_used(item);
    t = tb_mclock() - t;

    // trace
    tb_trace_i("tb_circle_queue_iterator_next(%lu): %lld ms, size: %lu, maxn: %lu", 1000000, t, tb_circle_queue_size(queue), tb_circle_queue_maxn(queue));

    // exit
    tb_circle_queue_exit(queue);
}
Exemple #3
0
static tb_void_t tb_demo_spider_parser_exit(tb_thread_pool_worker_ref_t worker, tb_cpointer_t priv)
{
    // check
    tb_demo_spider_parser_t* parser = (tb_demo_spider_parser_t*)priv;
    tb_assert_and_check_return(parser);

    // exit stream
    if (parser->stream) tb_stream_exit(parser->stream);
    parser->stream = tb_null;

    // exit reader
    if (parser->reader) tb_xml_reader_exit(parser->reader);
    parser->reader = tb_null;

    // exit cache
    if (parser->cache) tb_circle_queue_exit(parser->cache);
    parser->cache = tb_null;

    // exit iurl
    tb_url_exit(&parser->iurl);

    // exit it
    tb_free(parser);
}
Exemple #4
0
/* //////////////////////////////////////////////////////////////////////////////////////
 * implementation
 */
tb_circle_queue_ref_t tb_circle_queue_init(tb_size_t maxn, tb_element_t element)
{
    // check
    tb_assert_and_check_return_val(element.size && element.dupl && element.data, tb_null);

    // done
    tb_bool_t           ok = tb_false;
    tb_circle_queue_t*  queue = tb_null;
    do
    {
        // make queue
        queue = tb_malloc0_type(tb_circle_queue_t);
        tb_assert_and_check_break(queue);

        // using the default maxn
        if (!maxn) maxn = TB_CIRCLE_QUEUE_SIZE_DEFAULT;

        // init queue, + tail
        queue->maxn      = maxn + 1;
        queue->element   = element;

        // init operation
        static tb_iterator_op_t op = 
        {
            tb_circle_queue_itor_size
        ,   tb_circle_queue_itor_head
        ,   tb_circle_queue_itor_last
        ,   tb_circle_queue_itor_tail
        ,   tb_circle_queue_itor_prev
        ,   tb_circle_queue_itor_next
        ,   tb_circle_queue_itor_item
        ,   tb_circle_queue_itor_comp
        ,   tb_circle_queue_itor_copy
        ,   tb_null
        ,   tb_null
        };

        // init iterator
        queue->itor.priv = tb_null;
        queue->itor.step = element.size;
        queue->itor.mode = TB_ITERATOR_MODE_FORWARD | TB_ITERATOR_MODE_REVERSE | TB_ITERATOR_MODE_MUTABLE;
        queue->itor.op   = &op;

        // make data
        queue->data = (tb_byte_t*)tb_nalloc0(queue->maxn, element.size);
        tb_assert_and_check_break(queue->data);

        // ok
        ok = tb_true;

    } while (0);

    // failed?
    if (!ok)
    {
        if (queue) tb_circle_queue_exit((tb_circle_queue_ref_t)queue);
        queue = tb_null;
    }

    // ok?
    return (tb_circle_queue_ref_t)queue;
}