Application and Includeed Application

今天MailList中一个问题,在Application和Includeed Application中调用application:get_application/0,返回都是Primary Applicaion Name,为什么是这样呢?

在Erlang OTP中Application可以包其他Application,也就是Included Application。我前阵子在项目中也尝试使用Includeed App,可是等我认真看OTP doc的时候,发现我也理解偏差了。

Primary Application启动时,会Load所有的Included Application,但是不会Start他们,需要在Primary App的Supervisor Tree中启动Inclued Application的Top Superior Tree,所以Included Application其实是作为Primary的一部分,他们运行在一个Supervisor Tree中。

当我们调用application:get_applicaion/0时,调用application_controller:get_application(group_leader()).
而group_leader()此时为Primary Application的Top Supervisor Tree的pid,included Application通过Primary启动,因此其两者group_leader相同。

继续向下进行, application_controller负责管理所有的Applications,其内部通过ets维护所有的Applications信息。application_controller:get_application/1调用:
ets:match(ac_tab, {{application_master, '$1'}, Master}),从ac_tab中获取Application对应的Application Master Name,此Name即是我们的Name.app中的Name。

让我们看清楚Application启动的过程:

application:start/2
application:load/1
application_controller:start_application/2
application_controller:handle_call/3
application_controller:check_start_cond/4
application_controller:spawn_starter/4
(spawn a new process:{M, F} = {application_controller, init_starter})


the new process(In application_controller):
application_controller:init_starter/4
application_controller:start_appl/3
application_master:start_link/2
(spawn a new process :{M, F} = {application_master, init})
application_master创建成功
gen_server:cast application_started
reply_to_requester/3通知application:start/2 caller返回ok


new process(In applicaiton_master):

application_master:init/4
group_leader(self(), self()),
(修改group_leader为自身,即每个Application的gourp leader为对应的application_master)
ets:insert(ac_tab, {{application_master, Name}, self()}),
start_it/2
(spawn a new process: {M,F} = {application_master, start_it})
main_loop/2


new process(In applicaiton_master):

application_master:start_it
start_it_new/7
start_the_app/5
start_supervisor/3
Mod:start/2(即Application Callback Module)
loop_it/4


Wow,经过上面复杂痛苦的过程,我们的Application终于启动了。。
main_loop是application_master对应的loop,其Parent为application_controller
loop_it用来管理top supervisor tree,其Parent为application_master
休息一会,回头说main_loop和loop_it
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值