From 6214c19346095b775ecf9c7d007fedba38aabd47 Mon Sep 17 00:00:00 2001 From: Adam Kocoloski Date: Mon, 10 May 2010 20:16:22 -0400 Subject: code for efficient monitoring of many remote processes. BugzID 10096 --- src/rexi_monitor.erl | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/rexi_monitor.erl (limited to 'src') diff --git a/src/rexi_monitor.erl b/src/rexi_monitor.erl new file mode 100644 index 00000000..b4c00f23 --- /dev/null +++ b/src/rexi_monitor.erl @@ -0,0 +1,39 @@ +-module(rexi_monitor). +-export([start/1, stop/1]). + +-include_lib("eunit/include/eunit.hrl"). + +%% @doc spawn_links a process which monitors the supplied list of items and +%% returns the process ID. +-spec start([pid() | atom() | {atom(),atom()}]) -> pid(). +start(Procs) -> + Parent = self(), + spawn_link(fun() -> + [erlang:monitor(process, P) || P <- Procs], + wait_monitors(Parent) + end). + +%% @doc Cleanly shut down the monitoring process and flush all rexi_DOWN +%% messages from our mailbox. +-spec stop(pid()) -> ok. +stop(MonitoringPid) -> + MonitoringPid ! {self(), shutdown}, + flush_down_messages(). + +%% internal functions %% + +wait_monitors(Parent) -> + receive + {'DOWN', _, process, Pid, Reason} -> + Parent ! {rexi_DOWN, self(), Pid, Reason}, + wait_monitors(Parent); + {Parent, shutdown} -> + ok + end. + +flush_down_messages() -> + receive {rexi_DOWN, _, _, _} -> + flush_down_messages() + after 0 -> + ok + end. -- cgit v1.2.3