*** /opt/rcs/5.0.2.5/lib/stdlib-1.9.4/src/gen_fsm.erl Thu Jun 7 15:04:40 2001 --- gen_fsm.erl Wed Jul 11 16:09:29 2001 *************** *** 110,115 **** --- 110,117 ---- sync_send_all_state_event/2, sync_send_all_state_event/3, reply/2]). + -export([start_timer/2, send_after/2, cancel_timer/1]). + %% Internal exports -export([init_it/6, print_event/3, system_continue/3, *************** *** 199,204 **** --- 201,228 ---- [Name, Event, Timeout]}}) end. + %% Designed to be only callable within one of the callbacks + %% hence using the self() of this instance of the process. + %% This is to ensure that timers don't go astray in global + %% e.g. when straddling a failover, or turn up in a restarted + %% instance of the process. + start_timer(Time, Msg) -> + erlang:start_timer(Time, self(), {'$gen_fsm_timer', Msg}). + + send_after(Time, Msg) -> + erlang:start_timer(Time, self(), {'$gen_fsm_send_after_timer', Msg}). + + cancel_timer(Ref) -> + erlang:cancel_timer(Ref), + receive + {timeout, Ref, _} -> + ok + after 0 -> + ok + end. + + + %%% --------------------------------------------------- %%% Initiate the new process. %%% Register the name using the Rfunc function *************** *** 288,293 **** --- 312,325 ---- io:format(Dev, "*DBG* ~p got all_state_event ~p in state ~w~n", [Name, Event, StateName]); + {timeout, Ref, {'$gen_fsm_send_after_timer', Event}} -> + io:format(Dev, + "*DBG* ~p got timer ~p in state ~w~n", + [Name, Event, StateName]); + {timeout, Ref, {'$gen_fsm_timer', Event}} -> + io:format(Dev, + "*DBG* ~p got timer ~p in state ~w~n", + [Name, {timeout, Ref, Event}, StateName]); _ -> io:format(Dev, "*DBG* ~p got ~p in state ~w~n", [Name, Msg, StateName]) *************** *** 367,372 **** --- 399,408 ---- dispatch({'$gen_sync_all_state_event', From, Event}, Mod, StateName, StateData) -> apply(Mod, handle_sync_event, [Event, From, StateName, StateData]); + dispatch({timeout, Ref, {'$gen_fsm_send_after_timer', Event}}, Mod, StateName, StateData) -> + apply(Mod, StateName, [Event, StateData]); + dispatch({timeout, Ref, {'$gen_fsm_timer', Event}}, Mod, StateName, StateData) -> + apply(Mod, StateName, [{timeout, Ref, Event}, StateData]); dispatch(Info, Mod, StateName, StateData) -> apply(Mod, handle_info, [Info, StateName, StateData]). *************** *** 423,428 **** --- 459,468 ---- "** Last event in was ~p (for all states)~n"; get_msg_str({'$gen_sync_all_state_event', Event}) -> "** Last sync event in was ~p (for all states)~n"; + get_msg_str({timeout, Ref, {'$gen_fsm_send_after_timer', Event}}) -> + "** Last timer event in was ~p~n"; + get_msg_str({timeout, Ref, {'$gen_fsm_timer', Event}}) -> + "** Last timer event in was ~p~n"; get_msg_str(Msg) -> "** Last message in was ~p~n". *************** *** 430,435 **** --- 470,477 ---- get_msg({'$gen_sync_event', Event}) -> Event; get_msg({'$gen_all_state_event', Event}) -> Event; get_msg({'$gen_sync_all_state_event', Event}) -> Event; + get_msg({timeout, Ref, {'$gen_fsm_send_after_timer', Event}}) -> Event; + get_msg({timeout, Ref, {'$gen_fsm_timer', Event}}) -> {timeout, Ref, Event}; get_msg(Msg) -> Msg. %%-----------------------------------------------------------------