@@ -103,13 +103,13 @@ import Data.Int (Int32)
103import Data.Typeable (Typeable)
103import Data.Typeable (Typeable)
104import Data.Foldable (forM_)
104import Data.Foldable (forM_)
105import Data.Maybe (isJust)
105import Data.Maybe (isJust)
106−import Control.Monad (void, liftM2, liftM3, when, unless, forever)
106+import Control.Monad (void, when, unless, forever)
107import Control.Monad.Reader (MonadReader(..), ReaderT, runReaderT)
107import Control.Monad.Reader (MonadReader(..), ReaderT, runReaderT)
108import Control.Monad.IO.Class (MonadIO, liftIO)
108import Control.Monad.IO.Class (MonadIO, liftIO)
109import Control.Monad.State (MonadState, StateT, evalStateT, gets, modify)
109import Control.Monad.State (MonadState, StateT, evalStateT, gets, modify)
110−import Control.Applicative ((<$>))
110+import Control.Applicative ((<$>), (<*>))
111import Control.Category ((>>>))
111import Control.Category ((>>>))
112−import Control.Exception (Exception, throwIO, catch)
112+import Control.Exception (Exception, throwIO, catch, SomeException)
113import Control.Concurrent (forkIO)
113import Control.Concurrent (forkIO)
114import Control.Concurrent.MVar ( MVar
114import Control.Concurrent.MVar ( MVar
115 , newMVar
115 , newMVar
@@ -294,6 +294,7 @@ data MonitorReply = ProcessDied MonitorRef ProcessId DiedReason
295data DiedReason =
295data DiedReason =
296 DiedNormal
296 DiedNormal
297+ | DiedException String -- TODO: would prefer SomeException instead of String, but exceptions don't implement Binary
297 | DiedDisconnect
298 | DiedDisconnect
298 | DiedNodeDown
299 | DiedNodeDown
@@ -527,13 +528,24 @@ forkProcess node proc = do
529 void . forkIO $ do
530 void . forkIO $ do
530− runLocalProcess lproc proc
532+ runLocalProcess lproc proc
531− -- [Unified: Table 4]
533+ -- [Unified: Table 4]
532− let pid = processId lproc
534+ let pid = processId lproc
533− writeChan (localCtrlChan node) $ NodeCtrlMsg
535+ writeChan (localCtrlChan node) $ NodeCtrlMsg
534− { ctrlMsgSender = Left pid
536+ { ctrlMsgSender = Left pid
535− , ctrlMsgSignal = Died (Left pid) DiedNormal
537+ , ctrlMsgSignal = Died (Left pid) DiedNormal
541+ let pid = processId lproc
542+ err = show (ex :: SomeException)
543+ writeChan (localCtrlChan node) $ NodeCtrlMsg
544+ { ctrlMsgSender = Left pid
545+ , ctrlMsgSignal = Died (Left pid) (DiedException err)
537 return (processId lproc)
549 return (processId lproc)
539handleIncomingMessages :: LocalNode -> IO ()
551handleIncomingMessages :: LocalNode -> IO ()
@@ -727,19 +739,19 @@ runLocalProcess lproc proc = runReaderT (unProcess proc) lproc
728instance Binary LocalProcessId where
740instance Binary LocalProcessId where
729 put lpid = put (lpidUnique lpid) >> put (lpidCounter lpid)
741 put lpid = put (lpidUnique lpid) >> put (lpidCounter lpid)
730− get = liftM2 LocalProcessId get get
742+ get = LocalProcessId <$> get <*> get
732instance Binary ProcessId where
744instance Binary ProcessId where
733 put pid = put (processNodeId pid) >> put (processLocalId pid)
745 put pid = put (processNodeId pid) >> put (processLocalId pid)
734− get = liftM2 ProcessId get get
746+ get = ProcessId <$> get <*> get
736instance Binary MonitorReply where
748instance Binary MonitorReply where
737 put (ProcessDied ref pid reason) = put ref >> put pid >> put reason
749 put (ProcessDied ref pid reason) = put ref >> put pid >> put reason
738− get = liftM3 ProcessDied get get get
750+ get = ProcessDied <$> get <*> get <*> get
740instance Binary NodeCtrlMsg where
752instance Binary NodeCtrlMsg where
741 put msg = put (ctrlMsgSender msg) >> put (ctrlMsgSignal msg)
753 put msg = put (ctrlMsgSender msg) >> put (ctrlMsgSignal msg)
742− get = liftM2 NodeCtrlMsg get get
754+ get = NodeCtrlMsg <$> get <*> get
744instance Binary ProcessSignal where
756instance Binary ProcessSignal where
745 put (Monitor pid ref) = putWord8 0 >> put pid >> put ref
757 put (Monitor pid ref) = putWord8 0 >> put pid >> put ref
@@ -747,20 +759,22 @@ instance Binary ProcessSignal where
748 header <- getWord8
760 header <- getWord8
749 case header of
761 case header of
750− 0 -> liftM2 Monitor get get
762+ 0 -> Monitor <$> get <*> get
751− 1 -> liftM2 Died get get
763+ 1 -> Died <$> get <*> get
752 _ -> fail "ProcessSignal.get: invalid"
764 _ -> fail "ProcessSignal.get: invalid"
754instance Binary DiedReason where
766instance Binary DiedReason where
755− put DiedNormal = putWord8 0
767+ put DiedNormal = putWord8 0
768+ put (DiedException e) = putWord8 1 >> put e
756− put DiedDisconnect = putWord8 1
769+ put DiedDisconnect = putWord8 2
757− put DiedNodeDown = putWord8 2
770+ put DiedNodeDown = putWord8 3
759 header <- getWord8
772 header <- getWord8
760 case header of
773 case header of
761 0 -> return DiedNormal
774 0 -> return DiedNormal
762− 1 -> return DiedDisconnect
775+ 1 -> DiedException <$> get
776+ 2 -> return DiedDisconnect
763− 2 -> return DiedNodeDown
777+ 3 -> return DiedNodeDown
764 _ -> fail "DiedReason.get: invalid"
778 _ -> fail "DiedReason.get: invalid"
766--------------------------------------------------------------------------------
780--------------------------------------------------------------------------------