static tb_bool_t tb_demo_task_func(tb_aice_ref_t aice) { // check tb_assert_and_check_return_val(aice && aice->code == TB_AICE_CODE_RUNTASK, tb_false); // ok? if (aice->state == TB_STATE_OK) { // trace tb_trace_i("task[%p]: now: %lld", aice->aico, tb_cache_time_mclock()); // run task if (!tb_aico_task_run(aice->aico, 1001, tb_demo_task_func, aice->priv)) return tb_false; } // failed? else { // trace tb_trace_i("task[%p]: state: %s", aice->aico, tb_state_cstr(aice->state)); // clos aico if (aice->aico) tb_aico_clos(aice->aico, tb_demo_aico_clos, tb_null); } // ok return tb_true; }
static tb_void_t tb_demo_context_exit(tb_demo_context_t* context) { if (context) { // exit aico if (context->aico[0]) tb_aico_clos(context->aico[0], tb_demo_aico_clos, tb_null); context->aico[0] = tb_null; // exit aico if (context->aico[1]) tb_aico_clos(context->aico[1], tb_demo_aico_clos, tb_null); context->aico[1] = tb_null; // exit data if (context->data) tb_free(context->data); context->data = tb_null; // exit tb_free(context); } }
static tb_void_t tb_demo_context_exit(tb_demo_context_t* context) { if (context) { // exit aico if (context->file) tb_aico_clos(context->file, tb_demo_file_aico_clos, context); context->file = tb_null; // exit data if (context->data) tb_free(context->data); context->data = tb_null; } }
tb_void_t tb_aicp_dns_exit(tb_aicp_dns_ref_t dns) { // check tb_aicp_dns_impl_t* impl = (tb_aicp_dns_impl_t*)dns; tb_assert_and_check_return(impl); // trace tb_trace_d("exit: aico: %p ..", impl->aico); // clos aico if (impl->aico) tb_aico_clos(impl->aico, tb_aicp_dns_clos_func, tb_null); impl->aico = tb_null; // exit it tb_free(impl); }
static tb_bool_t tb_demo_file_aico_clos(tb_aice_t const* aice) { // check tb_assert_and_check_return_val(aice && aice->aico && aice->code == TB_AICE_CODE_CLOS, tb_false); // the context tb_demo_context_t* context = (tb_demo_context_t*)aice->priv; tb_assert_and_check_return_val(context, tb_false); // trace tb_trace_d("aico[%p]: clos: %s", aice->aico, tb_state_cstr(aice->state)); // exit aico tb_aico_exit(aice->aico); // exit sock aico if (context->sock) tb_aico_clos(context->sock, tb_demo_sock_aico_clos, tb_null); context->sock = tb_null; // ok return tb_true; }
static tb_bool_t tb_demo_sock_acpt_func(tb_aice_ref_t aice) { // check tb_assert_and_check_return_val(aice && aice->code == TB_AICE_CODE_ACPT, tb_false); // the file path tb_char_t const* path = (tb_char_t const*)aice->priv; tb_assert_and_check_return_val(path, tb_false); // the aicp tb_aicp_ref_t aicp = tb_aico_aicp(aice->aico); tb_assert_and_check_return_val(aicp, tb_false); // acpt ok? if (aice->state == TB_STATE_OK) { // trace tb_trace_i("acpt[%p]: %p", aice->aico, aice->u.acpt.aico); // done tb_bool_t ok = tb_false; tb_demo_context_t* context = tb_null; do { // make context context = tb_malloc0_type(tb_demo_context_t); tb_assert_and_check_break(context); #ifdef TB_DEMO_MODE_SENDF // init file context->file = tb_file_init(path, TB_FILE_MODE_RO | TB_FILE_MODE_ASIO); tb_assert_and_check_break(context->file); // init sock aico context->aico[0] = aice->u.acpt.aico; tb_assert_and_check_break(context->aico[0]); // post sendf from file if (!tb_aico_sendf(context->aico[0], context->file, 0ULL, tb_file_size(context->file), tb_demo_sock_sendf_func, context)) break; #else // init data context->data = tb_malloc_bytes(TB_DEMO_FILE_READ_MAXN); tb_assert_and_check_break(context->file && context->data); // init sock aico context->aico[0] = aice->u.acpt.aico; tb_assert_and_check_break(context->aico[0]); // init file aico context->aico[1] = tb_aico_init(aicp); tb_assert_and_check_break(context->aico[1]); // open file aico if (!tb_aico_open_file_from_path(context->aico[1], path, TB_FILE_MODE_RO)) break; // post read from file if (!tb_aico_read(context->aico[1], context->size, context->data, TB_DEMO_FILE_READ_MAXN, tb_demo_file_read_func, context)) break; #endif // ok ok = tb_true; } while (0); // failed? if (!ok) { // exit context if (context) tb_demo_context_exit(context); } } // failed? else { // exit loop tb_trace_i("acpt[%p]: state: %s", aice->aico, tb_state_cstr(aice->state)); // clos aico if (aice->aico) tb_aico_clos(aice->aico, tb_demo_aico_clos, tb_null); } // ok return tb_true; }