コード例 #1
0
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;
}
コード例 #2
0
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;
}