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