proc_lib:spawn相关源码分析
来源:互联网 发布:阿里孙正义马云占股份 编辑:程序博客网 时间:2024/06/05 14:09
proc_lib中所有关于进程相关的方法都是在bif里的spawn相关方法上封装实现的。主要做进程字典'$ancestors' '$initial_call'的初始化和crash报告、退出处理。
一、proc_lib:spawn*相关函数实现
1、proc_lib:spawn* 相关函数通过调用相应的erlang:spawn*方法,执行proc_lib:init_p方法实现。
2、proc_lib_init_p进行'$ancestors' '$initial_call'进程字典初始化,并执行进程要执行的方法,如果执行异常,则执行proc_lib:exit_p处理异常,做crash报告,并执行exit退出。
-specinit_p(pid(), [pid()], function())->term().
init_p(Parent,Ancestors,Fun)whenis_function(Fun)->
put('$ancestors', [Parent|Ancestors]),
{module,Mod} = erlang:fun_info(Fun, module),
{name,Name} = erlang:fun_info(Fun, name),
{arity,Arity} = erlang:fun_info(Fun, arity),
put('$initial_call', {Mod,Name,Arity}),
try
Fun()
catch
Class:Reason->
exit_p(Class,Reason)
end.
-specinit_p(pid(), [pid()], atom(), atom(), [term()])->term().
init_p(Parent,Ancestors,M,F,A)whenis_atom(M), is_atom(F), is_list(A)->
put('$ancestors', [Parent|Ancestors]),
put('$initial_call', trans_init(M,F,A)),
init_p_do_apply(M,F,A).
init_p_do_apply(M,F,A)->
try
apply(M,F,A)
catch
Class:Reason->
exit_p(Class,Reason)
end.
exit_p(Class,Reason)->
caseget('$initial_call')of
{M,F,A}whenis_atom(M), is_atom(F), is_integer(A)->
MFA= {M,F,make_dummy_args(A, [])},
crash_report(Class,Reason,MFA),
exit(Reason);
_->
%% The process dictionary has been cleared or
%% possibly modified.
crash_report(Class,Reason, []),
exit(Reason)
end.
二、proc_lib:start*相关函数实现
1、proc_lib:start*相关函数通过调用proc_lib:spawn*相关方法实现进程创建,然后调用proc_lib:sync_wait等待ack消息,实现同步。
sync_wait(Pid,Timeout)->
receive
{ack,Pid,Return}->
Return;
{'EXIT',Pid,Reason}->
{error,Reason}
afterTimeout->
unlink(Pid),
exit(Pid, kill),
flush(Pid),
{error, timeout}
end.
-specflush(pid())->'true'.
flush(Pid)->
receive
{'EXIT',Pid,_}->
true
after0->
true
end.
阅读全文
1 0
- proc_lib:spawn相关源码分析
- spawn-fcgi 源码分析
- spawn-fcgi原理及源码分析
- spawn-fcgi原理及源码分析
- spawn分析
- MediaScanner源码相关分析
- Logging相关源码分析
- spawn
- 内核源码分析相关博客
- android JobService相关源码分析
- spawn-fcgi与fcgi的运行机制分析
- spawn-fcgi与fcgi的运行机制分析
- 结合源码分析HBase相关操作流程
- Hadoop RPC 源码分析- 相关类图
- 结合源码分析HBase相关操作流程
- FBReader中翻页方式相关源码分析
- Integer中的相关函数实现源码分析
- DOOM3源码分析相关文章集合
- javascript中阻塞和非阻塞,同步和非同步的区别
- 35. Search Insert Position
- 微信小程序实战篇-电商(二)
- 根据字段名称找到数据库和表的sql
- GCD(Grand Central Dispatch)的使用方法
- proc_lib:spawn相关源码分析
- I/O多路转接之epoll
- [Unity&Photon&代码问题&代码分析]右键移动 目标 位置偏差
- 解决下载的chm无法显示内容的问题
- 加载数据时先显示小圆圈不显示内容
- U3D 安卓通过openssl创建的电子证书进行HTTPS 加密访问
- 【Linux网络编程】I/O多路转接之 epoll 高性能简洁http服务器模型
- linux内核编程helloworld(中级)
- GOLANG最容易做测试MOCK