tb_aioo_ref_t tb_aiop_addo(tb_aiop_ref_t aiop, tb_socket_ref_t sock, tb_size_t code, tb_cpointer_t priv) { // check tb_aiop_impl_t* impl = (tb_aiop_impl_t*)aiop; tb_assert_and_check_return_val(impl && impl->rtor && impl->rtor->addo && sock, tb_null); tb_assert(tb_aiop_have(aiop, code)); // done tb_bool_t ok = tb_false; tb_aioo_ref_t aioo = tb_null; do { // init aioo aioo = tb_aiop_aioo_init(impl, sock, code, priv); tb_assert_and_check_break(aioo); // addo aioo if (!impl->rtor->addo(impl->rtor, (tb_aioo_impl_t*)aioo)) break; // ok ok = tb_true; } while (0); // failed? remove aioo if (!ok && aioo) { tb_aiop_aioo_exit(impl, aioo); aioo = tb_null; } // ok? return aioo; }
tb_void_t tb_aiop_delo(tb_aiop_ref_t aiop, tb_aioo_ref_t aioo) { // check tb_aiop_impl_t* impl = (tb_aiop_impl_t*)aiop; tb_assert_and_check_return(impl && impl->rtor && impl->rtor->delo && aioo); // delo aioo if (impl->rtor->delo(impl->rtor, (tb_aioo_impl_t*)aioo)) tb_aiop_aioo_exit(impl, aioo); }
tb_void_t tb_aiop_delo(tb_aiop_ref_t aiop, tb_aioo_ref_t aioo) { // check tb_aiop_impl_t* impl = (tb_aiop_impl_t*)aiop; tb_assert_and_check_return(impl && impl->rtor && impl->rtor->delo && aioo); // delete aioo from aiop if (!impl->rtor->delo(impl->rtor, (tb_aioo_impl_t*)aioo)) { // trace tb_trace_e("delo: aioo[%p] failed!", aioo); } // exit aioo tb_aiop_aioo_exit(impl, aioo); }