@@ -1,9 +1,8 @@
1+{-# LANGUAGE DeriveGeneric #-}
1-- | Tracing/Debugging support - Types
3-- | Tracing/Debugging support - Types
2module Control.Distributed.Process.Management.Trace.Types
4module Control.Distributed.Process.Management.Trace.Types
5− , SetTrace(..)
5+ ( SetTrace(..)
7 , TraceSubject(..)
6 , TraceSubject(..)
8 , TraceFlags(..)
7 , TraceFlags(..)
9 , TraceArg(..)
8 , TraceArg(..)
@@ -27,6 +26,7 @@ import Control.Applicative ((<$>), (<*>))
27import Control.Distributed.Process.Internal.CQueue (enqueue)
26import Control.Distributed.Process.Internal.CQueue (enqueue)
28import Control.Distributed.Process.Internal.Types
27import Control.Distributed.Process.Internal.Types
29 ( MxEventBus(..)
28 ( MxEventBus(..)
31 , ProcessId
31 , ProcessId
32 , DiedReason
32 , DiedReason
@@ -35,7 +35,11 @@ import Control.Distributed.Process.Internal.Types
35 , unsafeCreateUnencodedMessage
35 , unsafeCreateUnencodedMessage
37import Control.Distributed.Process.Management.Bus
37import Control.Distributed.Process.Management.Bus
38− ( publishEvent
38+ ( enqueueEvent
40+import Control.Distributed.Process.Management.Types
40import Control.Distributed.Process.Serializable
44import Control.Distributed.Process.Serializable
41import Data.Binary
45import Data.Binary
@@ -44,6 +48,7 @@ import Data.List (intersperse)
44import Data.Set (Set)
48import Data.Set (Set)
45import qualified Data.Set as Set (fromList)
49import qualified Data.Set as Set (fromList)
46import Data.Typeable
50import Data.Typeable
47import System.Mem.Weak (deRefWeak)
52import System.Mem.Weak (deRefWeak)
48import Network.Transport
53import Network.Transport
49 ( ConnectionId
54 ( ConnectionId
@@ -55,51 +60,8 @@ import Network.Transport
55--------------------------------------------------------------------------------
60--------------------------------------------------------------------------------
57data SetTrace = TraceEnable !ProcessId | TraceDisable
62data SetTrace = TraceEnable !ProcessId | TraceDisable
58− deriving (Typeable, Eq, Show)
63+ deriving (Typeable, Generic, Eq, Show)
60−-- TODO: MOVE the whole Trace namespace into C.D.Process.Management
62−-- | An event that is fired when something /interesting/ happens.
63−-- Trace events are forwarded to a trace listener process, of which
64−-- at most one can be registered per-node.
67− -- ^ fired whenever a local process is spawned
68− | MxRegistered ProcessId String
69− -- ^ fired whenever a process/name is registered (locally)
70− | MxUnRegistered ProcessId String
71− -- ^ fired whenever a process/name is unregistered (locally)
72− | MxProcessDied ProcessId DiedReason
73− -- ^ fired whenever a process dies
74− | MxNodeDied NodeId DiedReason
75− -- ^ fired whenever a node /dies/ (i.e., the connection is broken/disconnected)
76− | MxSent ProcessId ProcessId Message
77− -- ^ fired whenever a message is sent from a local process
78− | MxReceived ProcessId Message
79− -- ^ fired whenever a message is received by a local process
80− | MxConnected ConnectionId EndPointAddress
81− -- ^ fired when a network-transport connection is first established
82− | MxDisconnected ConnectionId EndPointAddress
83− -- ^ fired when a network-transport connection is broken/disconnected
85− -- ^ a user defined trace event (see 'traceMessage')
87− -- ^ a /logging/ event - used for debugging purposes only
88− | MxTraceTakeover ProcessId
89− -- ^ notifies a trace listener that all subsequent traces will be sent to /pid/
91− -- ^ notifies a trace listener that it has been disabled/removed
92− deriving (Typeable, Show)
94−class Addressable a where
95− resolveToPid :: a -> Maybe ProcessId
97−instance Addressable MxEvent where
64+instance Binary SetTrace where
98− resolveToPid (MxSpawned p) = Just p
99− resolveToPid (MxProcessDied p _) = Just p
100− resolveToPid (MxSent _ p _) = Just p
101− resolveToPid (MxReceived p _) = Just p
102− resolveToPid _ = Nothing
104-- | Defines which processes will be traced by a given 'TraceFlag',
66-- | Defines which processes will be traced by a given 'TraceFlag',
105-- either by name, or @ProcessId@. Choosing @TraceAll@ is /by far/
67-- either by name, or @ProcessId@. Choosing @TraceAll@ is /by far/
@@ -110,7 +72,8 @@ data TraceSubject =
110 TraceAll -- enable tracing for all running processes
72 TraceAll -- enable tracing for all running processes
111 | TraceProcs !(Set ProcessId) -- enable tracing for a set of processes
73 | TraceProcs !(Set ProcessId) -- enable tracing for a set of processes
112 | TraceNames !(Set String) -- enable tracing for a set of named/registered processes
74 | TraceNames !(Set String) -- enable tracing for a set of named/registered processes
113− deriving (Show)
75+ deriving (Typeable, Generic, Show)
76+instance Binary TraceSubject where
115-- | Defines /what/ will be traced. Flags that control tracing of
78-- | Defines /what/ will be traced. Flags that control tracing of
116-- @Process@ events, take a 'TraceSubject' controlling which processes
79-- @Process@ events, take a 'TraceSubject' controlling which processes
@@ -124,7 +87,8 @@ data TraceFlags = TraceFlags {
124 , traceRecv :: !(Maybe TraceSubject) -- filter process/message tracing by receiver
87 , traceRecv :: !(Maybe TraceSubject) -- filter process/message tracing by receiver
125 , traceNodes :: !Bool -- enable node status trace events
88 , traceNodes :: !Bool -- enable node status trace events
126 , traceConnections :: !Bool -- enable connection status trace events
89 , traceConnections :: !Bool -- enable connection status trace events
127− } deriving (Typeable, Show)
90+ } deriving (Typeable, Generic, Show)
91+instance Binary TraceFlags where
129defaultTraceFlags :: TraceFlags
93defaultTraceFlags :: TraceFlags
130defaultTraceFlags =
94defaultTraceFlags =
@@ -145,16 +109,17 @@ data TraceArg =
146-- | A generic 'ok' response from the trace coordinator.
110-- | A generic 'ok' response from the trace coordinator.
147data TraceOk = TraceOk
111data TraceOk = TraceOk
148− deriving (Typeable)
112+ deriving (Typeable, Generic)
113+instance Binary TraceOk where
150--------------------------------------------------------------------------------
115--------------------------------------------------------------------------------
151-- Internal/Common API --
116-- Internal/Common API --
152--------------------------------------------------------------------------------
117--------------------------------------------------------------------------------
154−traceLog :: MxEventBus -> String -> IO ()
119+traceLog :: Tracer -> String -> IO ()
155−traceLog tr s = publishEvent tr (unsafeCreateUnencodedMessage $ MxLog s)
120+traceLog (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage $ MxLog s)
157−traceLogFmt :: MxEventBus
122+traceLogFmt :: Tracer
158 -> String
123 -> String
159 -> [TraceArg]
124 -> [TraceArg]
@@ -164,43 +129,43 @@ traceLogFmt t d ls =
164 toS (TraceStr s) = s
129 toS (TraceStr s) = s
165 toS (Trace a) = show a
130 toS (Trace a) = show a
167−traceEvent :: MxEventBus -> MxEvent -> IO ()
132+traceEvent :: Tracer -> MxEvent -> IO ()
168−traceEvent tr ev = publishEvent tr (unsafeCreateUnencodedMessage ev)
133+traceEvent (Tracer _ wqRef) ev = enqueueEvent wqRef (unsafeCreateUnencodedMessage ev)
170−traceMessage :: Serializable m => MxEventBus -> m -> IO ()
135+traceMessage :: Serializable m => Tracer -> m -> IO ()
171traceMessage tr msg = traceEvent tr (MxUser (unsafeCreateUnencodedMessage msg))
136traceMessage tr msg = traceEvent tr (MxUser (unsafeCreateUnencodedMessage msg))
173−enableTrace :: MxEventBus -> ProcessId -> IO ()
138+enableTrace :: Tracer -> ProcessId -> IO ()
174−enableTrace t p =
139+enableTrace (Tracer _ wqRef) p =
175− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
140+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
176− (TraceEnable p)))
141+ (TraceEnable p)))
178−enableTraceSync :: MxEventBus -> SendPort TraceOk -> ProcessId -> IO ()
143+enableTraceSync :: Tracer -> SendPort TraceOk -> ProcessId -> IO ()
179−enableTraceSync t s p =
144+enableTraceSync (Tracer _ wqRef) s p =
180− publishEvent t (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
145+ enqueueEvent wqRef (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
182−disableTrace :: MxEventBus -> IO ()
147+disableTrace :: Tracer -> IO ()
183−disableTrace t =
148+disableTrace (Tracer _ wqRef) =
184− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
149+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
185 TraceDisable))
150 TraceDisable))
187−disableTraceSync :: MxEventBus -> SendPort TraceOk -> IO ()
152+disableTraceSync :: Tracer -> SendPort TraceOk -> IO ()
188−disableTraceSync t s =
153+disableTraceSync (Tracer _ wqRef) s =
189− publishEvent t (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
154+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
191−setTraceFlags :: MxEventBus -> TraceFlags -> IO ()
156+setTraceFlags :: Tracer -> TraceFlags -> IO ()
192−setTraceFlags t f =
157+setTraceFlags (Tracer _ wqRef) f =
193− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
158+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
195−setTraceFlagsSync :: MxEventBus -> SendPort TraceOk -> TraceFlags -> IO ()
160+setTraceFlagsSync :: Tracer -> SendPort TraceOk -> TraceFlags -> IO ()
196−setTraceFlagsSync t s f =
161+setTraceFlagsSync (Tracer _ wqRef) s f =
197− publishEvent t (unsafeCreateUnencodedMessage ((Just s), f))
162+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), f))
199−getTraceFlags :: MxEventBus -> SendPort TraceFlags -> IO ()
164+getTraceFlags :: Tracer -> SendPort TraceFlags -> IO ()
200−getTraceFlags t s = publishEvent t (unsafeCreateUnencodedMessage s)
165+getTraceFlags (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
202−getCurrentTraceClient :: MxEventBus -> SendPort (Maybe ProcessId) -> IO ()
167+getCurrentTraceClient :: Tracer -> SendPort (Maybe ProcessId) -> IO ()
203−getCurrentTraceClient t s = publishEvent t (unsafeCreateUnencodedMessage s)
168+getCurrentTraceClient (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
205class Traceable a where
170class Traceable a where
206 uod :: [a] -> TraceSubject
171 uod :: [a] -> TraceSubject
@@ -211,74 +176,3 @@ instance Traceable ProcessId where
211instance Traceable String where
176instance Traceable String where
212 uod = TraceNames . Set.fromList
177 uod = TraceNames . Set.fromList
214−--------------------------------------------------------------------------------
215−-- Binary Instances --
216−--------------------------------------------------------------------------------
218−instance Binary SetTrace where
219− put (TraceEnable pid) = putWord8 1 >> put pid
220− put TraceDisable = putWord8 2
225− 1 -> TraceEnable <$> get
226− 2 -> return TraceDisable
227− _ -> error "SetTrace.get - invalid header"
229−instance Binary MxEvent where
230− put (MxSpawned pid) = putWord8 1 >> put pid
231− put (MxRegistered pid str) = putWord8 2 >> put pid >> put str
232− put (MxUnRegistered pid str) = putWord8 3 >> put pid >> put str
233− put (MxProcessDied pid res) = putWord8 4 >> put pid >> put res
234− put (MxNodeDied nid res) = putWord8 5 >> put nid >> put res
235− put (MxSent to from msg) = putWord8 6 >> put to >> put from >> put msg
236− put (MxReceived pid msg) = putWord8 7 >> put pid >> put msg
237− put (MxConnected cid epid) = putWord8 8 >> put cid >> put epid
238− put (MxDisconnected cid epid) = putWord8 9 >> put cid >> put epid
239− put (MxUser msg) = putWord8 10 >> put msg
240− put (MxLog msg) = putWord8 11 >> put msg
241− put (MxTraceTakeover pid) = putWord8 12 >> put pid
242− put MxTraceDisable = putWord8 13
247− 1 -> MxSpawned <$> get
248− 2 -> MxRegistered <$> get <*> get
249− 3 -> MxUnRegistered <$> get <*> get
250− 4 -> MxProcessDied <$> get <*> get
251− 5 -> MxNodeDied <$> get <*> get
252− 6 -> MxSent <$> get <*> get <*> get
253− 7 -> MxReceived <$> get <*> get
254− 8 -> MxConnected <$> get <*> get
255− 9 -> MxDisconnected <$> get <*> get
256− 10 -> MxUser <$> get
258− 12 -> MxTraceTakeover <$> get
259− 13 -> return MxTraceDisable
260− _ -> error "MxEvent.get - invalid header"
262−instance Binary TraceSubject where
263− put TraceAll = putWord8 1
264− put (TraceProcs pids) = putWord8 2 >> put pids
265− put (TraceNames names) = putWord8 3 >> put names
270− 1 -> return TraceAll
271− 2 -> TraceProcs <$> get
272− 3 -> TraceNames <$> get
273− _ -> error "TraceSubject.get - invalid header"
275−instance Binary TraceFlags where
276− put (TraceFlags s d g u m r n c) =
277− put s >> put d >> put g >> put u >> put m >> put r >> put n >> put c
279− TraceFlags <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
281−instance Binary TraceOk where
283− get = return TraceOk