code for efficient monitoring of many remote processes. BugzID 10096

diff --git a/ebin/rexi.app b/ebin/rexi.app
index c705898..e8145c6 100644
--- a/ebin/rexi.app
+++ b/ebin/rexi.app
@@ -1,7 +1,7 @@
 {application, rexi, [
     {description, "lightweight RPC server"},
     {vsn, "1.0"},
-    {modules, [rexi, rexi_app, rexi_sup, rexi_server]},
+    {modules, [rexi, rexi_app, rexi_sup, rexi_monitor, rexi_server]},
     {registered, [rexi_sup, rexi_server]},
     {applications, [kernel, stdlib]},
     {mod, {rexi_app,[]}},
diff --git a/src/rexi_monitor.erl b/src/rexi_monitor.erl
new file mode 100644
index 0000000..b4c00f2
--- /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.