static tb_demo_spider_parser_t* tb_demo_spider_parser_init(tb_thread_pool_worker_ref_t worker) { // check tb_assert_and_check_return_val(worker, tb_null); // done tb_bool_t ok = tb_false; tb_demo_spider_parser_t* parser = tb_null; do { // attempt to get the parser parser = (tb_demo_spider_parser_t*)tb_thread_pool_worker_getp(worker, 0); if (!parser) { // make parser parser = tb_malloc0_type(tb_demo_spider_parser_t); tb_assert_and_check_break(parser); // save parser tb_thread_pool_worker_setp(worker, 0, tb_demo_spider_parser_exit, (tb_cpointer_t)parser); // init stream parser->stream = tb_stream_init_file(); tb_assert_and_check_break(parser->stream); // init reader parser->reader = tb_xml_reader_init(); tb_assert_and_check_break(parser->reader); // init cache parser->cache = tb_circle_queue_init(255, tb_item_func_str(tb_true)); tb_assert_and_check_break(parser->cache); // init iurl if (!tb_url_init(&parser->iurl)) break; } // ok ok = tb_true; } while (0); // failed? if (!ok) { // exit it if (parser) tb_demo_spider_parser_exit(worker, (tb_cpointer_t)parser); parser = tb_null; } // ok return parser; }
/* ////////////////////////////////////////////////////////////////////////////////////// * 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_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); }