Android培训班(18)
通上面的函数就可以把服务和事件触发的命令添加队列里。其实是在文件parser.c头部,就声明了下面三个链表,如下:
static list_declare(service_list);
static list_declare(action_list);
static list_declare(action_queue);
service_list是定义添加分析所有资源文件里的服务,action_list是定义添加分析所有资源文件里的事件触发的命令列表,action_queue是定义添加当前需要执行操作的命令动作或者服务等。
那么又有下面一个问题了,init进程是在那里添加这些服务或命令到运行队列呢?在init.c文件看到下面的代码:
action_for_each_trigger("early-init", action_add_queue_tail);
drain_action_queue();
原来是通过函数action_for_each_trigger来把所有需要按事件触发运行的命令添加到队列里,函数action_add_queue_tail把需要执行命令放到队列,函数drain_action_queue把添加到队列里的命令进行运行。
#001 void action_for_each_trigger(const char *trigger,
#002 void (*func)(struct action *act))
#003 {
#004 struct listnode *node;
#005 struct action *act;
#006 list_for_each(node, &action_list) {
这行代码是遍历链表所有项。
#007 act = node_to_item(node, struct action, alist);
这行代码是把动作节点转换为动作项。
#008 if (!strcmp(act->name, trigger)) {
#009 func(act);
这段代码是当找到与用户输入相同事件触发的动作,比如上面是查找“early-init”事件。这时就把动作项添加到将要运行的队列里。
#010 }
#011 }
#012 }
相关新闻>>
- 发表评论
-
- 最新评论 更多>>