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); }
/* ////////////////////////////////////////////////////////////////////////////////////// * 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); }
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); } }