Esempio n. 1
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);
}
Esempio n. 2
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);
}
Esempio n. 3
0
static tb_void_t tb_demo_spider_parser_task_done(tb_thread_pool_worker_ref_t worker, tb_cpointer_t priv)
{
    // check
    tb_demo_spider_task_t* task = (tb_demo_spider_task_t*)priv;
    tb_assert_and_check_return(worker && task && task->spider);

    // init parser
    tb_demo_spider_parser_t* parser = tb_demo_spider_parser_init(worker);
    tb_assert_and_check_return(parser && parser->stream && parser->reader && parser->cache);

    // open stream
    if (tb_demo_spider_parser_open_html(parser->stream, task->ourl))
    {
        // open reader
        if (tb_xml_reader_open(parser->reader, parser->stream, tb_false))
        {
            // trace
            tb_trace_d("parser: open: %s", task->ourl);

            // init url
            tb_url_set(&parser->iurl, task->iurl);

            // parse url
            while (     TB_STATE_OK == tb_atomic_get(&task->spider->state)
                    &&  tb_demo_spider_parser_get_url(parser->reader, &parser->iurl))
            {
                // trace
                tb_trace_d("parser: done: %s", tb_url_get(&parser->iurl));

                // done task
                tb_bool_t full = tb_false;
                if (!tb_demo_spider_task_done(task->spider, tb_url_get(&parser->iurl), &full))
                {
                    // full?
                    tb_assert_and_check_break(full);

                    // cache url
                    if (!tb_circle_queue_full(parser->cache)) tb_circle_queue_put(parser->cache, tb_url_get(&parser->iurl));

                    // trace
                    tb_trace_d("parser: cache: save: %s, size: %lu", tb_url_get(&parser->iurl), tb_circle_queue_size(parser->cache));
                }
            }

            // clos reader
            tb_xml_reader_clos(parser->reader);
        }

        // clos stream
        tb_stream_clos(parser->stream);
    }

    // done task from the cache
    while (!tb_circle_queue_null(parser->cache))
    {
        // the url
        tb_char_t const* url = (tb_char_t const*)tb_circle_queue_get(parser->cache);
        tb_assert_and_check_break(url);

        // done task
        if (!tb_demo_spider_task_done(task->spider, url, tb_null)) break;

        // trace
        tb_trace_d("parser: cache: load: %s, size: %lu", url, tb_circle_queue_size(parser->cache));

        // pop it
        tb_circle_queue_pop(parser->cache);
    }
}