static tb_bool_t tb_aiop_rtor_poll_delo(tb_aiop_rtor_impl_t* rtor, tb_aioo_impl_t const* aioo) { // check tb_aiop_rtor_poll_impl_t* impl = (tb_aiop_rtor_poll_impl_t*)rtor; tb_assert_and_check_return_val(impl && impl->pfds && impl->cfds && aioo && aioo->sock, tb_false); // the aiop tb_aiop_impl_t* aiop = rtor->aiop; tb_assert_and_check_return_val(aiop, tb_false); // delo it, TODO: delo by binary search tb_spinlock_enter(&impl->lock.pfds); tb_remove_first_if(impl->pfds, tb_poll_walk_delo, (tb_pointer_t)(((tb_long_t)aioo->sock) - 1)); tb_spinlock_leave(&impl->lock.pfds); // del sock => aioo tb_spinlock_enter(&impl->lock.hash); if (impl->hash) tb_hash_del(impl->hash, aioo->sock); tb_spinlock_leave(&impl->lock.hash); // spak it if (aiop->spak[0]) tb_socket_send(aiop->spak[0], (tb_byte_t const*)"p", 1); // ok return tb_true; }
tb_bool_t tb_poller_remove(tb_poller_ref_t self, tb_socket_ref_t sock) { // check tb_poller_poll_ref_t poller = (tb_poller_poll_ref_t)self; tb_assert_and_check_return_val(poller && poller->pfds && sock, tb_false); // remove this socket and events, TODO uses binary search tb_remove_first_if(poller->pfds, tb_poller_walk_remove, (tb_cpointer_t)(tb_long_t)tb_sock2fd(sock)); // remove user private data from this socket tb_poller_hash_del(poller, sock); // ok return tb_true; }
/* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ tb_void_t tb_remove_first(tb_iterator_ref_t iterator, tb_cpointer_t value) { // remove it tb_remove_first_if(iterator, tb_predicate_eq, value); }