static apt_bool_t mrcp_server_agent_task_run(apt_task_t *task) { mrcp_connection_agent_t *agent = apt_task_object_get(task); apt_bool_t running = TRUE; apr_status_t status; apr_int32_t num; const apr_pollfd_t *ret_pfd; int i; if(!agent) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Start MRCPv2 Agent"); return FALSE; } if(mrcp_server_agent_pollset_create(agent) == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Pollset"); return FALSE; } /* explicitly indicate task is ready to process messages */ apt_task_ready(agent->task); while(running) { status = apt_pollset_poll(agent->pollset, -1, &num, &ret_pfd); if(status != APR_SUCCESS) { continue; } for(i = 0; i < num; i++) { if(ret_pfd[i].desc.s == agent->listen_sock) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Accept MRCPv2 Connection"); mrcp_server_agent_connection_accept(agent); continue; } if(apt_pollset_is_wakeup(agent->pollset,&ret_pfd[i])) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Control Message"); if(mrcp_server_agent_control_process(agent) == FALSE) { running = FALSE; break; } continue; } apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process MRCPv2 Message"); mrcp_server_agent_messsage_receive(agent,ret_pfd[i].client_data); } } mrcp_server_agent_pollset_destroy(agent); apt_task_child_terminate(agent->task); return TRUE; }
static apt_bool_t mrcp_client_agent_task_run(apt_task_t *task) { mrcp_connection_agent_t *agent = apt_task_object_get(task); apt_bool_t running = TRUE; apr_status_t status; apr_int32_t num; const apr_pollfd_t *ret_pfd; int i; if(!agent) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Start MRCPv2 Agent"); return FALSE; } agent->pollset = apt_pollset_create((apr_uint32_t)agent->max_connection_count,agent->pool); if(!agent->pollset) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Pollset"); return FALSE; } while(running) { status = apt_pollset_poll(agent->pollset, -1, &num, &ret_pfd); if(status != APR_SUCCESS) { continue; } for(i = 0; i < num; i++) { if(apt_pollset_is_wakeup(agent->pollset,&ret_pfd[i])) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Control Message"); if(mrcp_client_agent_control_process(agent) == FALSE) { running = FALSE; break; } continue; } mrcp_client_agent_messsage_receive(agent,ret_pfd[i].client_data); } } apt_pollset_destroy(agent->pollset); agent->pollset = NULL; apt_task_child_terminate(agent->task); return TRUE; }
static apt_bool_t apt_net_client_task_run(apt_task_t *base) { apt_net_client_task_t *task = apt_task_object_get(base); apt_bool_t running = TRUE; apr_status_t status; apr_int32_t num; const apr_pollfd_t *ret_pfd; int i; if(!task) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Start Network Client Task"); return FALSE; } if(apt_net_client_task_pollset_create(task) == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Pollset"); return FALSE; } while(running) { status = apt_pollset_poll(task->pollset, -1, &num, &ret_pfd); if(status != APR_SUCCESS) { continue; } for(i = 0; i < num; i++) { if(apt_pollset_is_wakeup(task->pollset,&ret_pfd[i])) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Control Message"); if(apt_net_client_task_process(task) == FALSE) { running = FALSE; break; } continue; } apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Message"); task->client_vtable->on_receive(task,ret_pfd[i].client_data); } } apt_net_client_task_pollset_destroy(task); apt_task_child_terminate(task->base); return TRUE; }
static apt_bool_t apt_poller_task_run(apt_task_t *base) { apt_poller_task_t *task = apt_task_object_get(base); apt_bool_t running = TRUE; apr_status_t status; apr_int32_t num; const apr_pollfd_t *ret_pfd; apr_interval_time_t timeout; apr_uint32_t queue_timeout; apr_time_t time_now, time_last = 0; int i; const char *task_name; if(!task) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Start Poller Task"); return FALSE; } task_name = apt_task_name_get(task->base), /* explicitly indicate task is ready to process messages */ apt_task_ready(task->base); while(running) { if(apt_timer_queue_timeout_get(task->timer_queue,&queue_timeout) == TRUE) { timeout = queue_timeout * 1000; time_last = apr_time_now(); apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Wait for Messages [%s] timeout [%lu]", task_name, queue_timeout); } else { timeout = -1; apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Wait for Messages [%s]",task_name); } status = apt_pollset_poll(task->pollset, timeout, &num, &ret_pfd); if(status != APR_SUCCESS && status != APR_TIMEUP) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Poll status: %d",status); continue; } for(i = 0; i < num; i++) { if(apt_pollset_is_wakeup(task->pollset,&ret_pfd[i])) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Poller Wakeup [%s]",task_name); if(apt_poller_task_wakeup_process(task) == FALSE) { running = FALSE; break; } continue; } apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Signalled Descriptor [%s]",task_name); task->signal_handler(task->obj,&ret_pfd[i]); } if(timeout != -1) { time_now = apr_time_now(); if(time_now > time_last) { apt_timer_queue_advance(task->timer_queue,(apr_uint32_t)((time_now - time_last)/1000)); } } } return TRUE; }