Guest User

Untitled

a guest
Apr 25th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. -module(observer).
  2. -behaviour(gen_server).
  3. % API
  4. -export([start_link/1, register/3, unregister/3, register/2, unregister/2,
  5. notify/3]).
  6. % gen_server callbacks
  7. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
  8. code_change/3]).
  9.  
  10. handle_cast({notify, Event, Data}, Table) ->
  11. Recipients = ets:lookup(Table, Event),
  12. lists:foreach(fun({_, P, _}) -> P ! {Event, Data} end, Recipients),
  13. {noreply, Table}.
  14.  
  15. handle_call({register, Event, Pid}, _From, Table) ->
  16. Mon = erlang:monitor(process, Pid),
  17. ets:insert(Table, {Event, Pid, Mon}),
  18. {reply, ok, Table};
  19. handle_call({unregister, Event, Pid}, _From, Table) ->
  20. Monitors = ets:match(Table, {Event, Pid, '$1'}),
  21. lists:foreach(fun([X|[]]) -> io:format("~p~n", [X]) end, Monitors),
  22. lists:foreach(fun([X|[]]) -> erlang:demonitor(X) end, Monitors),
  23. ets:match_delete(Table, {Event, Pid, '_'}),
  24. {reply, ok, Table}.
  25.  
  26. start_link(Name) -> gen_server:start_link({local, Name}, ?MODULE, [], []).
  27.  
  28. register(Name, Event) ->
  29. gen_server:call(Name, {register, Event, self()}).
  30.  
  31. register(Name, Event, Pid) ->
  32. gen_server:call(Name, {register, Event, Pid}).
  33.  
  34. unregister(Name, Event) ->
  35. gen_server:call(Name, {unregister, Event, self()}).
  36.  
  37. unregister(Name, Event, Pid) ->
  38. gen_server:call(Name, {unregister, Event, Pid}).
  39.  
  40. notify(Name, Event, Data) ->
  41. gen_server:cast(Name, {notify, Event, Data}).
  42.  
  43. init(_) -> {ok, ets:new(observer, [private, duplicate_bag])}.
  44.  
  45. handle_info({'DOWN', _, _, Pid, _}, Table) ->
  46. io:format("~p died. removing registrations~n", [Pid]),
  47. ets:match_delete(Table, {'_', Pid, '_'}),
  48. {noreply, Table}.
  49.  
  50. terminate(_Reason, _Table) -> ok.
  51.  
  52. code_change(_OldVersion, Table, _Extra) -> {ok, Table}.
Add Comment
Please, Sign In to add comment