2013-08-02 31 views
0

这里是应用程序主代码的一部分源代码,它是管理erlang应用程序的模块。application_master.erl源代码中退出/ 1后的过量代码

348 loop_it(Parent, Child, Mod, AppState) -> 
349  receive 
350   {Parent, get_child} -> 
351    Parent ! {self(), Child, Mod}, 
352    loop_it(Parent, Child, Mod, AppState); 
353   {Parent, terminate} -> 
354    NewAppState = prep_stop(Mod, AppState), 
355    exit(Child, shutdown), 
356    receive 
357     {'EXIT', Child, _} -> ok 
358    end, 
359    catch Mod:stop(NewAppState), 
360    exit(normal); 
361   {'EXIT', Parent, Reason} -> 
362    NewAppState = prep_stop(Mod, AppState), 
363    exit(Child, Reason), 
364    receive 
365     {'EXIT', Child, Reason2} -> 
366      exit(Reason2) 
367    end, 
368    catch Mod:stop(NewAppState); 
369   {'EXIT', Child, Reason} -> % forward *all* exit reasons (inc. normal) 
370    NewAppState = prep_stop(Mod, AppState), 
371    catch Mod:stop(NewAppState), 
372    exit(Reason); 
373   _ -> 
374    loop_it(Parent, Child, Mod, AppState) 
375  end. 

我的问题是:

  1. 为什么申请硕士的行为不同,当它接收{家长,终止}和{ 'EXIT',家长,原因}?

  2. line 368是什么意思?应用程序主机必须先退出行366

回答

1

应用程序主控制器在执行受控关闭或重新启动时收到'terminate'。当它收到任何退出信号时,它会执行不受控制的关闭。

如果未受控制的关机发生,如果受到控制,则不会发出错误报告,则gen_servers,主管等将登录到错误记录器。

行368中的代码看起来像复制粘贴错误。该行永远不会执行。

+0

erlang的源代码中的复制粘贴错误...我从www.erlang.org下载它。 = _ = – Taotaotheripper

+0

但是,为什么只有当应用程序主服务器收到{'EXIT',Parent,Reason}时,才会调用Mod:stop/1?我们是否应该像其他条件一样在退出前(理由)移动368线? – Taotaotheripper

+0

如果应用程序主服务器从其父服务器中退出,那么系统中的某些事情发生了严重错误,所以我想没有任何调用来停止该节点来加速该节点的关闭。 – Lukas