static tb_ifaddrs_interface_ref_t tb_ifaddrs_interface_find(tb_iterator_ref_t iterator, tb_char_t const* name) { // check tb_assert_and_check_return_val(iterator && name, tb_null); // find it tb_size_t itor = tb_find_all_if(iterator, tb_ifaddrs_interface_pred, name); tb_check_return_val(itor != tb_iterator_tail(iterator), tb_null); // ok return (tb_ifaddrs_interface_ref_t)tb_iterator_item(iterator, itor); }
tb_void_t tb_timer_task_kill(tb_timer_ref_t timer, tb_timer_task_ref_t task) { // check tb_timer_impl_t* impl = (tb_timer_impl_t*)timer; tb_timer_task_impl_t* task_impl = (tb_timer_task_impl_t*)task; tb_assert_and_check_return(impl && impl->pool && task_impl); // trace tb_trace_d("kill: when: %lld, period: %u, refn: %u", task_impl->when, task_impl->period, task_impl->refn); // enter tb_spinlock_enter(&impl->lock); // done do { // expired or removed? tb_check_break(task_impl->refn == 2); // find it tb_size_t itor = tb_find_all_if(impl->heap, tb_timer_comp_by_task, task_impl); tb_assert_and_check_break(itor != tb_iterator_tail(impl->heap)); // del this task_impl tb_heap_del(impl->heap, itor); // killed task_impl->killed = 1; // no repeat task_impl->repeat = 0; // modify when => now task_impl->when = tb_timer_now(impl); // re-add task_impl tb_heap_put(impl->heap, task_impl); } while (0); // leave tb_spinlock_leave(&impl->lock); }
tb_size_t tb_find_all(tb_iterator_ref_t iterator, tb_cpointer_t value) { return tb_find_all_if(iterator, tb_predicate_eq, value); }