static tb_bool_t tb_transfer_pool_work_kill(tb_iterator_ref_t iterator, tb_pointer_t item, tb_cpointer_t priv) { // the task tb_transfer_task_t* task = (tb_transfer_task_t*)item; tb_check_return_val(task, tb_false); // check tb_assert_and_check_return_val(task->transfer, tb_false); // kill it tb_async_transfer_kill(task->transfer); // ok return tb_true; }
tb_bool_t tb_async_transfer_exit(tb_async_transfer_ref_t transfer) { // chec:w tb_async_transfer_impl_t* impl = (tb_async_transfer_impl_t*)transfer; tb_assert_and_check_return_val(impl, tb_false); // trace tb_trace_d("exit: .."); // kill it first tb_async_transfer_kill(transfer); // try closing it tb_size_t tryn = 30; tb_bool_t ok = tb_false; while (!(ok = tb_async_transfer_clos_try(transfer)) && tryn--) { // wait some time tb_msleep(200); } // close failed? if (!ok) { // trace tb_trace_e("exit: failed!"); return tb_false; } // exit istream if (impl->istream && impl->iowner) tb_async_stream_exit(impl->istream); impl->istream = tb_null; // exit ostream if (impl->ostream && impl->oowner) tb_async_stream_exit(impl->ostream); impl->ostream = tb_null; // exit impl tb_free(impl); // trace tb_trace_d("exit: ok"); // ok return tb_true; }