- 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()是没有实现的