diff options
Diffstat (limited to 'lib/stdlib/src')
| -rw-r--r-- | lib/stdlib/src/gen_event.erl | 80 | 
1 files changed, 58 insertions, 22 deletions
| diff --git a/lib/stdlib/src/gen_event.erl b/lib/stdlib/src/gen_event.erl index ccacf658e9..4839fe4f2c 100644 --- a/lib/stdlib/src/gen_event.erl +++ b/lib/stdlib/src/gen_event.erl @@ -32,7 +32,9 @@  %%% Modified by Martin - uses proc_lib, sys and gen! --export([start/0, start/1, start_link/0, start_link/1, stop/1, stop/3, +-export([start/0, start/1, start/2, +         start_link/0, start_link/1, start_link/2, +         stop/1, stop/3,  	 notify/2, sync_notify/2,  	 add_handler/3, add_sup_handler/3, delete_handler/3, swap_handler/3,  	 swap_sup_handler/3, which_handlers/1, call/3, call/4, wake_hib/4]). @@ -117,30 +119,64 @@  -type del_handler_ret()  :: ok | term() | {'EXIT',term()}.  -type emgr_name() :: {'local', atom()} | {'global', atom()} -		   | {'via', atom(), term()}. +                   | {'via', atom(), term()}. +-type debug_flag() :: 'trace' | 'log' | 'statistics' | 'debug' +                    | {'logfile', string()}. +-type option() :: {'timeout', timeout()} +                | {'debug', [debug_flag()]} +                | {'spawn_opt', [proc_lib:spawn_option()]}.  -type emgr_ref()  :: atom() | {atom(), atom()} |  {'global', atom()} -		   | {'via', atom(), term()} | pid(). +                   | {'via', atom(), term()} | pid().  -type start_ret() :: {'ok', pid()} | {'error', term()}.  %%---------------------------------------------------------------------------  -define(NO_CALLBACK, 'no callback module'). +%% ----------------------------------------------------------------- +%% Starts a generic event handler. +%% start() +%% start(MgrName | Options) +%% start(MgrName, Options) +%% start_link() +%% start_link(MgrName | Options) +%% start_link(MgrName, Options) +%%    MgrName ::= {local, atom()} | {global, atom()} | {via, atom(), term()} +%%    Options ::= [{timeout, Timeout} | {debug, [Flag]} | {spawn_opt,SOpts}] +%%       Flag ::= trace | log | {logfile, File} | statistics | debug +%%          (debug == log && statistics) +%% Returns: {ok, Pid} | +%%          {error, {already_started, Pid}} | +%%          {error, Reason} +%% ----------------------------------------------------------------- +  -spec start() -> start_ret().  start() ->      gen:start(?MODULE, nolink, ?NO_CALLBACK, [], []). --spec start(emgr_name()) -> start_ret(). -start(Name) -> -    gen:start(?MODULE, nolink, Name, ?NO_CALLBACK, [], []). +-spec start(emgr_name() | [option()]) -> start_ret(). +start(Name) when is_tuple(Name) -> +    gen:start(?MODULE, nolink, Name, ?NO_CALLBACK, [], []); +start(Options) when is_list(Options) -> +    gen:start(?MODULE, nolink, ?NO_CALLBACK, [], Options). + +-spec start(emgr_name(), [option()]) -> start_ret(). +start(Name, Options) -> +    gen:start(?MODULE, nolink, Name, ?NO_CALLBACK, [], Options).  -spec start_link() -> start_ret().  start_link() ->      gen:start(?MODULE, link, ?NO_CALLBACK, [], []). --spec start_link(emgr_name()) -> start_ret(). -start_link(Name) -> -    gen:start(?MODULE, link, Name, ?NO_CALLBACK, [], []). +-spec start_link(emgr_name() | [option()]) -> start_ret(). +start_link(Name) when is_tuple(Name) -> +    gen:start(?MODULE, link, Name, ?NO_CALLBACK, [], []); +start_link(Options) when is_list(Options) -> +    gen:start(?MODULE, link, ?NO_CALLBACK, [], Options). + +-spec start_link(emgr_name(), [option()]) -> start_ret(). +start_link(Name, Options) -> +    gen:start(?MODULE, link, Name, ?NO_CALLBACK, [], Options).  %% -spec init_it(pid(), 'self' | pid(), emgr_name(), module(), [term()], [_]) ->   init_it(Starter, self, Name, Mod, Args, Options) -> @@ -160,7 +196,7 @@ add_sup_handler(M, Handler, Args)  ->      rpc(M, {add_sup_handler, Handler, Args, self()}).  -spec notify(emgr_ref(), term()) -> 'ok'. -notify(M, Event) -> send(M, {notify, Event}).  +notify(M, Event) -> send(M, {notify, Event}).  -spec sync_notify(emgr_ref(), term()) -> 'ok'.  sync_notify(M, Event) -> rpc(M, {sync_notify, Event}). @@ -193,7 +229,7 @@ stop(M) ->  stop(M, Reason, Timeout) ->      gen:stop(M, Reason, Timeout). -rpc(M, Cmd) ->  +rpc(M, Cmd) ->      {ok, Reply} = gen:call(M, self(), Cmd, infinity),      Reply. @@ -421,7 +457,7 @@ server_add_handler({Mod,Id}, Args, MSL) ->      Handler = #handler{module = Mod,  		       id = Id},      server_add_handler(Mod, Handler, Args, MSL); -server_add_handler(Mod, Args, MSL) ->  +server_add_handler(Mod, Args, MSL) ->      Handler = #handler{module = Mod},      server_add_handler(Mod, Handler, Args, MSL). @@ -446,7 +482,7 @@ server_add_sup_handler({Mod,Id}, Args, MSL, Parent) ->  		       id = Id,  		       supervised = Parent},      server_add_handler(Mod, Handler, Args, MSL); -server_add_sup_handler(Mod, Args, MSL, Parent) ->  +server_add_sup_handler(Mod, Args, MSL, Parent) ->      link(Parent),      Handler = #handler{module = Mod,  		       supervised = Parent}, @@ -454,7 +490,7 @@ server_add_sup_handler(Mod, Args, MSL, Parent) ->  %% server_delete_handler(HandlerId, Args, MSL) -> {Ret, MSL'} -server_delete_handler(HandlerId, Args, MSL, SName) ->  +server_delete_handler(HandlerId, Args, MSL, SName) ->      case split(HandlerId, MSL) of  	{Mod, Handler, MSL1} ->  	    {do_terminate(Mod, Handler, Args, @@ -511,7 +547,7 @@ split_and_terminate(HandlerId, Args, MSL, SName, Handler2, Sup) ->  %% server_notify(Event, Func, MSL, SName) -> MSL' -server_notify(Event, Func, [Handler|T], SName) ->  +server_notify(Event, Func, [Handler|T], SName) ->      case server_update(Handler, Func, Event, SName) of  	{ok, Handler1} ->  	    {Hib, NewHandlers} = server_notify(Event, Func, T, SName), @@ -531,9 +567,9 @@ server_update(Handler1, Func, Event, SName) ->      Mod1 = Handler1#handler.module,      State = Handler1#handler.state,      case catch Mod1:Func(Event, State) of -	{ok, State1} ->  +	{ok, State1} ->  	    {ok, Handler1#handler{state = State1}}; -	{ok, State1, hibernate} ->  +	{ok, State1, hibernate} ->  	    {hibernate, Handler1#handler{state = State1}};  	{swap_handler, Args1, State1, Handler2, Args2} ->  	    do_swap(Mod1, Handler1, Args1, State1, Handler2, Args2, SName); @@ -644,14 +680,14 @@ server_call_update(Handler1, Query, SName) ->      Mod1 = Handler1#handler.module,      State = Handler1#handler.state,      case catch Mod1:handle_call(Query, State) of -	{ok, Reply, State1} ->  +	{ok, Reply, State1} ->  	    {{ok, Handler1#handler{state = State1}}, Reply}; -	{ok, Reply, State1, hibernate} ->  -	    {{hibernate, Handler1#handler{state = State1}},  +	{ok, Reply, State1, hibernate} -> +	    {{hibernate, Handler1#handler{state = State1}},  	     Reply};  	{swap_handler, Reply, Args1, State1, Handler2, Args2} ->  	    {do_swap(Mod1,Handler1,Args1,State1,Handler2,Args2,SName), Reply}; -	{remove_handler, Reply} ->  +	{remove_handler, Reply} ->  	    do_terminate(Mod1, Handler1, remove_handler, State,  			 remove, SName, normal),  	    {no, Reply}; @@ -686,7 +722,7 @@ report_error(_Handler, normal, _, _, _)             -> ok;  report_error(_Handler, shutdown, _, _, _)           -> ok;  report_error(_Handler, {swapped,_,_}, _, _, _)      -> ok;  report_error(Handler, Reason, State, LastIn, SName) -> -    Reason1 =  +    Reason1 =  	case Reason of  	    {'EXIT',{undef,[{M,F,A,L}|MFAs]}} ->  		case code:is_loaded(M) of | 
