gen_fsm module Callback module
-------------- ---------------
gen_fsm:start_link -----> Module:init/1
gen_fsm:send_event -----> Module:StateName/2
gen_fsm:send_all_state_event -----> Module:handle_event/3
gen_fsm:sync_send_event -----> Module:StateName/3
gen_fsm:sync_send_all_state_event -----> Module:handle_sync_event/4
- -----> Module:handle_info/3
- -----> Module:terminate/3
- -----> Module:code_change/4
1:gen_fsm 可以应用状态机,看了yourihua的
gen_fsm:start_link -> gen:start ->gen:do_spawn ->proc_lib_start_link -> 其实都是通过apply(M,F,A) 最后这是mod:init(Arg) ,所以gen_fsm:start_link 里面代码就有mod:init .
gen_fsm:start_link -----> Module:init/1
gen_fsm:send_event -----> Module:StateName/2 是init 通过初始化 {ok,static,State }, static 就是StateName, 所以就调用调了 Module:StateName/2 再次调用就可以改变状态了。
其实是通过下面实现的,Event这是 gen_fsm:send_event/2 向gen_fsm 发送的状态
dispatch({'$gen_event', Event}, Mod, StateName, StateData) ->
Mod:StateName(Event, StateData);
dispatch({'$gen_all_state_event', Event}, Mod, StateName, StateData) ->
Mod:handle_event(Event, StateName, StateData);
dispatch({'$gen_sync_event', From, Event}, Mod, StateName, StateData) ->
Mod:StateName(Event, From, StateData);
dispatch({'$gen_sync_all_state_event', From, Event},
Mod, StateName, StateData) ->
Mod:handle_sync_event(Event, From, StateName, StateData);
dispatch({timeout, Ref, {'$gen_timer', Msg}}, Mod, StateName, StateData) ->
Mod:StateName({timeout, Ref, Msg}, StateData);
dispatch({timeout, _Ref, {'$gen_event', Event}}, Mod, StateName, StateData) ->
Mod:StateName(Event, StateData);
dispatch(Info, Mod, StateName, StateData) ->
Mod:handle_info(Info, StateName, StateData).