@@ -77,6 +77,7 @@ module Control.Distributed.Process.Internal.Primitives
7777 , monitor
7878 , unmonitor
7979 , withMonitor
80+ , withMonitorRef
8081 -- * Logging
8182 , say
8283 -- * Registry
@@ -887,12 +888,21 @@ monitor = monitor' . ProcessIdentifier
887888-- messages in the queue.
888889--
889890withMonitor :: ProcessId -> Process a -> Process a
890−withMonitor pid code = bracket (monitor pid) unmonitor (\_ -> code)
891+withMonitor pid = withMonitorRef pid . const
891892 -- unmonitor blocks waiting for the response, so there's a possibility
892893 -- that an exception might interrupt withMonitor before the unmonitor
893894 -- has completed. I think that's better than making the unmonitor
894895 -- uninterruptible.
895896
897+-- | Establishes temporary monitoring of another process.
898+--
899+-- @withMonitorRef pid code@ sets up monitoring of @pid@ for the duration
900+-- of @code@. Note: although monitoring is no longer active when
901+-- @withMonitorRef@ returns, there might still be unreceived monitor
902+-- messages in the queue.
903+withMonitorRef :: ProcessId -> (MonitorRef -> Process a) -> Process a
904+withMonitorRef pid code = bracket (monitor pid) unmonitor code
905+
896906-- | Remove a link
897907--
898908-- This is synchronous in the sense that once it returns you are guaranteed