unimrcp apt task

  • TASK

apt_task_create(void *obj, apt_task_msg_pool_t *msg_pool, apr_pool_t *pool)

apt_task_destroy(apt_task_t *task)销毁任务及所有子任务

apt_task_add(apt_task_t *task, apt_task_t *child_task)加入一个子任务

apt_task_start(apt_task_t *task)如果vtable.start存在,则运行之,否则以apt_task_run()为线程入口创建并启动新的线程。apt_task_run()按照vtable.on_pre_run() /apt_task_child_start()/vtable.run()/vtable.on_post_run()的顺序来执行

apt_task_terminate(apt_task_t *task, apt_bool_t wait_till_complete) 执行vtable.terminate,如wait_till_complete则执行join

apt_task_delay(apr_size_t msec) sleep

apt_task_parent_get(const apt_task_t *task)

apt_task_pool_get(const apt_task_t *task)

apt_task_object_get(const apt_task_t *task)获得create()时传入的userdata

apt_task_vtable_get(apt_task_t *task)获得可写的vtable

apt_task_name_get(const apt_task_t *task)

apt_task_msg_get(apt_task_t *task)从task的message pool获得一个message,内部通过pool.acquire_msg()获得

apt_task_msg_release(apt_task_msg_t *task_msg)

apt_task_msg_signal(apt_task_t *task, apt_task_msg_t *msg)通过vtable.signal_msg发送消息

apt_task_msg_parent_signal(apt_task_t *task, apt_task_msg_t *msg)通过parent的vtable.signal_msg发送消息

apt_task_msg_process(apt_task_t *task, apt_task_msg_t *msg)处理TASK_MSG_CORE和TASK_MSG_USER消息,如果是TASK_MSG_USER消息,则用vtable.process_msg()处理

apt_task_child_start(apt_task_t *task) 执行vtable.on_start_request(),并对所有子任务调用apt_task_start(). 当所有子任务都跑起来以后,表示当前任务已经跑起来,执行vtable.on_start_complete(),并向自己的父任务发送启动完成消息(CORE_TASK_MSG_START_COMPLETE)。子任务通知父任务已启动是用apt_task_start_complete_raise()函数向父任务发送CORE_TASK_MSG_START_COMPLETE来达到的。

apt_task_child_terminate(apt_task_t *task) 执行vtable.on_terminate_request(),并对所有子任务调用apt_task_terminate(),当所有子任务结束后,执行vtable.on_terminate_complete()并向自己的父任务发送结束完成消息

 apt_task_auto_ready_set(apt_task_t *task, apt_bool_t auto_ready) 设置自动启动子任务开关

apt_task_running_flag_get(apt_task_t *task) 检查任务是否在running状态

apt_task_start_request_remove(apt_task_t *task) 应该是给自定义任务使用的工具函数,用于通知检查自己是否启动完成,如是,执行vtable.on_start_complete()以及通知父任务

apt_task_terminate_request_add(apt_task_t *task) 类上

apt_task_terminate_request_remove(apt_task_t *task)类上

  • Message

typedef enum {
    TASK_MSG_CORE,                   /**< core task message type */ 用于传递任务管理相关的消息,不应用于业务逻辑处理
    TASK_MSG_USER                    /**< user defined task messages start from here */
} apt_task_msg_type_e;

/** Task message is used for inter task communication */
struct apt_task_msg_t {
    /** Message pool the task message is allocated from */
    apt_task_msg_pool_t *msg_pool;
    /** Task msg type */
    int                  type;
    /** Task msg sub type */
    int                  sub_type;
    /** Context specific data */
    char                 data[1];
};

apt_task_msg_pool_create_dynamic(apr_size_t msg_size, apr_pool_t *pool); 创建一个以msg_size为message大小的message pool. 其内部空间还是用的参数中的pool,只是根据msg_size包装了一下acquire_msg()和release_msg

apt_task_msg_pool_destroy(apt_task_msg_pool_t *msg_pool);

apt_task_msg_acquire(apt_task_msg_pool_t *task_msg_pool);

apt_task_msg_release(apt_task_msg_t *task_msg);

  • consumer task

apt_consumer_task_create(void *obj, apt_task_msg_pool_t *msg_pool, apr_pool_t *pool) 创建一个apt_task,vtable.run = apt_consumer_task_run; vtable.signal_msg=apt_consumer_task_msg_signal. 同时会创建一个apr_queue用于放收到的消息(apr_queue是线程安全的)。

apt_consumer_task_base_get(const apt_consumer_task_t *task) 返回apt_task

apt_consumer_task_vtable_get(apt_consumer_task_t *task) 返回apt_task的vtable

apt_consumer_task_object_get(const apt_consumer_task_t *task) 获得创建时传入的userdata

apt_consumer_task_msg_signal(apt_task_t *task, apt_task_msg_t *msg) 从apt_task获得consumer_task,然后利用apr_queue_push()把message放到队列中

apt_consumer_task_run(apt_task_t *task)中队列中取出消息并执行apt_task_msg_process();

从中可以看出,consumer task只是增加了一个消息队列。而基础的apt_task的vtable.signal_msg()是没有实现的

原文地址:https://www.cnblogs.com/jan4984/p/3607104.html