`
bachmozart
  • 浏览: 111637 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gen_server源码杂记

阅读更多
调用gen_server启动的方法
gen_server :start_link ( { local, ?MODULE } , ?MODULE , [ ] , [ ] ) .
参数分别是Name,Mod,Arg,Options

Options里可以设置timeout

gen.erl里的简单小函数取得timeout


timeout(Options) ->
    case opt(timeout, Options) of
	{ok, Time} ->
	    Time;
	_ ->
	    infinity
    end.

spawn_opts(Options) ->
    case opt(spawn_opt, Options) of
	{ok, Opts} ->
	    Opts;
	_ ->
	    []
    end.

opt(Op, [{Op, Value}|_]) ->
    {ok, Value};
opt(Op, [_|Options]) ->
    opt(Op, Options);
opt(_, []) ->
    false.



gen_server启动流程大体如下:
在我们的程序里启动一般调用如下:
gen_server :start_link ( { local, ?MODULE } , ?MODULE , [ ] , [ ] ) .


gen_server.erl 里
start_link(Name, Mod, Args, Options) ->
    gen:start(?MODULE, link, Name, Mod, Args, Options).


gen.erl里基本是这样
do_spawn(GenMod, link, Mod, Args, Options) ->
    Time = timeout(Options),
    proc_lib:start_link(?MODULE, init_it,
			[GenMod, self(), self(), Mod, Args, Options], 
			Time,...


proc_lib是一个关于进程的工具类,提供了同步启动进程的机制

start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) ->
    Pid = proc_lib:spawn_opt(M, F, A, ensure_link(SpawnOpts)),
    sync_wait(Pid, Timeout).

sync_wait(Pid, Timeout) ->
    receive
	{ack, Pid, Return} ->
	    Return;
	{'EXIT', Pid, Reason} ->
	    {error, Reason}
    after Timeout ->
	    unlink(Pid),
	    exit(Pid, kill),
	    flush(Pid),
	    {error, timeout}
    end.


spawn_opt系列大体就是erlang:spawn系里的一个,是异步的,先调用了本模块的init_p,存放些上下文信息到进程字典,最终会回调gen_server,一会再说

同步的关键在sync_wait这句,一看就懂了

上面的spawn经过fun的传来传去最终回到了gen_server.erl

init_it(Starter, self, Name, Mod, Args, Options) ->
    init_it(Starter, self(), Name, Mod, Args, Options);
init_it(Starter, Parent, Name0, Mod, Args, Options) ->
    Name = name(Name0),
    Debug = debug_options(Name, Options),
    case catch Mod:init(Args) of
	{ok, State} ->
	    proc_lib:init_ack(Starter, {ok, self()}), 	    
	    loop(Parent, Name, State, Mod, infinity, Debug);
	{ok, State, Timeout} ->
	    proc_lib:init_ack(Starter, {ok, self()}), 	    
	    loop(Parent, Name, State, Mod, Timeout, Debug);
	{stop, Reason} ->
	    %% For consistency, we must make sure that the
	    %% registered name (if any) is unregistered before
	    %% the parent process is notified about the failure.
	    %% (Otherwise, the parent process could get
	    %% an 'already_started' error if it immediately
	    %% tried starting the process again.)
	    unregister_name(Name0),
	    proc_lib:init_ack(Starter, {error, Reason}),
	    exit(Reason);
	ignore ->
	    unregister_name(Name0),
	    proc_lib:init_ack(Starter, ignore),
	    exit(normal);
	{'EXIT', Reason} ->
	    unregister_name(Name0),
	    proc_lib:init_ack(Starter, {error, Reason}),
	    exit(Reason);
	Else ->
	    Error = {bad_return_value, Else},
	    proc_lib:init_ack(Starter, {error, Error}),
	    exit(Error)
    end.


看见这句了吧
catch Mod:init(Args)

分享到:
评论
3 楼 bachmozart 2009-09-18  
mryufeng 写道
gen_server是个很复杂的模块 能挖掘的不止上面那么多


哈哈,慢慢挖掘,不着急
2 楼 mryufeng 2009-09-17  
gen_server是个很复杂的模块 能挖掘的不止上面那么多
1 楼 bachmozart 2009-09-17  
写完了才发现右上角,已经有一篇阿里的一位同学做出的深入分析,学习下

相关推荐

    gen_server tasting 之超简单名称服务(续)

    在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...

    gen_server tasting 之超简单名称服务

    在Erlang编程语言中,`gen_server`行为是一个强大的模块,用于构建具有状态的、容错的服务。这篇名为“gen_server tasting 之超简单名称服务”的博客文章可能介绍了如何利用`gen_server`来实现一个简单的命名服务。...

    gen_lex_hash_pc

    `gen_lex_hash`是MySQL源码树中的一个子程序,其主要功能是生成词法解析器所需的哈希表。在编译MySQL时,这个词法分析器用于处理SQL语句,识别关键字和标识符,是解析和执行SQL命令的基础。`gen_lex_hash`的运行结果...

    Gen_Signature_Android2

    标题"Gen_Signature_Android2"指的是一个特定的工具,它用于生成Android应用的签名,这通常是在发布应用到Google Play或其他第三方市场之前所必需的步骤。这个工具可能是为简化开发者的工作流程而设计的,使得他们...

    gen_server:Erlang 的 gen_server 的(不完整的)OcamlAsync 实现

    《Erlang gen_server在OcamlAsync中的实现探索》 Erlang的gen_server是其并发模型的核心组件,它提供了一种强大的状态管理和错误处理机制。而在OCaml语言中,尽管有着自己的并发库如Async,但直接移植或模仿Erlang...

    基于Erlang的gen_tcp聊天室代码,功能完整

    - 处理连接请求,为每个新连接创建一个新的进程(通常是一个gen_server或gen_fsm行为)。 - 注册和登录逻辑,处理用户认证请求。 - 监听和转发消息,确保消息在正确用户间传递。 - 错误处理和异常恢复,确保系统的...

    Gen_Signature_Android2.zip

    标题“Gen_Signature_Android2.zip”中的"Gen_Signature"指的是生成签名的过程,而"Android2"可能表示这是针对Android平台的第二个版本的工具或方法。这个压缩包文件包含一个名为"Gen_Signature_Android2.apk"的应用...

    Gen_Signature_Android 签名解析工具

    Gen_Signature_Android是一个专门用于Android应用签名解析的工具,它可以帮助开发者和安全研究人员深入理解APK文件的签名机制,以及验证APK的签名信息。下面将详细介绍Android应用的签名过程、签名的重要性以及如何...

    gen_tcp_server:Erlang 应用程序的通用 TCP 服务器

    通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...

    srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR

    标题 "srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR" 提到的是一个与SRIO(Serial RapidIO)相关的响应生成模块,它可能是一个硬件描述语言(如Verilog或VHDL)设计的源代码文件。SRIO是一种...

    gen_server tasting 之超简单名称服务(再续)

    在IT行业中,`gen_server` 是Erlang OTP(开放电信平台)框架中的一个核心行为模块,用于构建可靠且容错的服务。它提供了一种模式,使得开发者可以编写并发、状态管理和故障恢复的服务器进程。在"gen_server tasting...

    Gen_Signature_Android.apk

    《Android应用签名详解——以Gen_Signature_Android.apk为例》 在移动应用开发领域,尤其是Android系统中,应用的签名是确保软件安全性和完整性的关键环节。本篇文章将详细探讨Android应用签名的重要性、原理以及...

    MKS Gen_L主板 使用手册

    ### MKS Gen_L 主板关键知识点解析 #### 一、简介 MKS Gen_L 主板是针对原有 Ramps1.4 开源主板存在的问题而设计的一款优化产品。它结合了 Arduino 2560 和 Ramps1.4 的功能,旨在提供更为稳定且易于使用的解决方案...

    gen_funciones_arduino_code_源码.zip

    《Arduino编程:深入理解gen_funciones_arduino_code_源码》 Arduino编程是现代电子制作和物联网项目中不可或缺的一部分,它以其简洁易懂的语法和丰富的库资源深受开发者喜爱。"gen_funciones_arduino_code_源码....

    gen_tags.vim, 用来轻松使用 ctags/gtags的vim和neovim的异步插件.zip

    gen_tags.vim, 用来轻松使用 ctags/gtags的vim和neovim的异步插件 gen_tags.vim 为方便用户使用 Vim/ NeoVim,简化了 ctags/ gtags的使用。它用于为你生成和维护多个平台支持的标签,在 Windows/Linux/macOS. 上测试...

    crc16Gen_VC++源码_

    标题中的“crc16Gen_VC++源码_”暗示了这是一个关于CRC16(循环冗余校验)生成器的项目,使用Visual C++(VC++)编程语言实现。CRC是一种广泛用于数据通信和存储中检测错误的校验码技术。在给定的描述中,“project ...

    PyPI 官网下载 | gen_data_model-1.6.1.tar.gz

    本文将深入探讨一个名为“gen_data_model”的Python库,其最新版本为1.6.1,可以从PyPI官网上下载到的源码压缩包gen_data_model-1.6.1.tar.gz。 gen_data_model库的核心功能是生成数据模型,这在处理结构化数据时...

Global site tag (gtag.js) - Google Analytics