distributed-process-extras 0.2.1.2 → 0.3.0
raw patch · 12 files changed
+220/−240 lines, 12 filesdep +distributed-process-systestdep +exceptionsdep +old-localedep −derivedep −distributed-process-testsdep −template-haskelldep ~basedep ~distributed-processdep ~mtlPVP ok
version bump matches the API change (PVP)
Dependencies added: distributed-process-systest, exceptions, old-locale
Dependencies removed: derive, distributed-process-tests, template-haskell, uniplate
Dependency ranges changed: base, distributed-process, mtl, time, transformers
API changes (from Hackage documentation)
- Control.Concurrent.Utils: acquire :: (Exclusive a, MonadIO m) => a -> m ()
- Control.Concurrent.Utils: class Exclusive a
- Control.Concurrent.Utils: class Synchronised e m where synchronized = synchronised
- Control.Concurrent.Utils: instance Control.Concurrent.Utils.Exclusive Control.Concurrent.Utils.Lock
- Control.Concurrent.Utils: instance Control.Concurrent.Utils.Synchronised Control.Concurrent.Utils.Lock Control.Distributed.Process.Internal.Types.Process
- Control.Concurrent.Utils: instance Control.Concurrent.Utils.Synchronised Control.Concurrent.Utils.Lock GHC.Types.IO
- Control.Concurrent.Utils: new :: Exclusive a => IO a
- Control.Concurrent.Utils: release :: (Exclusive a, MonadIO m) => a -> m ()
- Control.Concurrent.Utils: synchronised :: (Synchronised e m, Exclusive e, Monad m) => e -> m b -> m b
- Control.Concurrent.Utils: synchronized :: (Synchronised e m, Exclusive e, Monad m) => e -> m b -> m b
- Control.Distributed.Process.Extras: sendToRecipient :: (Serializable m) => Recipient -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: instance (Control.DeepSeq.NFData a, Control.Distributed.Process.Serializable.Serializable a) => Control.Distributed.Process.Extras.Internal.Types.NFSerializable a
- Control.Distributed.Process.Extras.Internal.Types: instance (Control.Distributed.Process.Extras.Internal.Types.Resolvable a, Control.Distributed.Process.Extras.Internal.Types.Routable a) => Control.Distributed.Process.Extras.Internal.Types.Addressable a
- Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.Killable Control.Distributed.Process.Internal.Types.ProcessId
- Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.Resolvable a => Control.Distributed.Process.Extras.Internal.Types.Routable a
- Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.Resolvable r => Control.Distributed.Process.Extras.Internal.Types.Killable r
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0CancelWait
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0ExitReason
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0Recipient
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0RegisterSelf
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0ServerDisconnected
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_0Shutdown
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_1ExitReason
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_1Recipient
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_2ExitReason
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Types.C1_2Recipient
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1CancelWait
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1ExitReason
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1Recipient
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1RegisterSelf
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1ServerDisconnected
- Control.Distributed.Process.Extras.Internal.Types: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Types.D1Shutdown
- Control.Distributed.Process.Extras.Internal.Types: sendToRecipient :: (Serializable m) => Recipient -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Unsafe: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Unsafe.C1_0NullInputStream
- Control.Distributed.Process.Extras.Internal.Unsafe: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Internal.Unsafe.C1_0PCopy
- Control.Distributed.Process.Extras.Internal.Unsafe: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Unsafe.D1NullInputStream
- Control.Distributed.Process.Extras.Internal.Unsafe: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Internal.Unsafe.D1PCopy
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Monitoring.C1_0NodeDown
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Monitoring.C1_0NodeUp
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Monitoring.C1_0Register
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Monitoring.C1_0UnRegister
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Monitoring.D1NodeDown
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Monitoring.D1NodeUp
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Monitoring.D1Register
- Control.Distributed.Process.Extras.Monitoring: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Monitoring.D1UnRegister
- Control.Distributed.Process.Extras.SystemLog: LogText :: !String -> LogText
- Control.Distributed.Process.Extras.SystemLog: [txt] :: LogText -> !String
- Control.Distributed.Process.Extras.SystemLog: data LogText
- Control.Distributed.Process.Extras.SystemLog: instance Control.Distributed.Process.Serializable.Serializable a => Control.Distributed.Process.Extras.SystemLog.ToLog a
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_0AddFormatter
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_0LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_0LogMessage
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_0SetLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_1LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_1LogMessage
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_2LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_3LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_4LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_5LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_6LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.SystemLog.C1_7LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.SystemLog.D1AddFormatter
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.SystemLog.D1LogLevel
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.SystemLog.D1LogMessage
- Control.Distributed.Process.Extras.SystemLog: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.SystemLog.D1SetLevel
- Control.Distributed.Process.Extras.SystemLog: type LogChan = ()
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_0Delay
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_0TimeInterval
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_0TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_1Delay
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_1TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_2Delay
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_2TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_3TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_4TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Time.C1_5TimeUnit
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Time.D1Delay
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Time.D1TimeInterval
- Control.Distributed.Process.Extras.Time: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Time.D1TimeUnit
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Timer.C1_0SleepingPill
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Timer.C1_0Tick
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Timer.C1_0TimerConfig
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Constructor Control.Distributed.Process.Extras.Timer.C1_1TimerConfig
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Timer.D1SleepingPill
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Timer.D1Tick
- Control.Distributed.Process.Extras.Timer: instance GHC.Generics.Datatype Control.Distributed.Process.Extras.Timer.D1TimerConfig
+ Control.Concurrent.Utils: mkExclusiveLock :: IO Lock
+ Control.Concurrent.Utils: mkQLock :: Int -> IO Lock
+ Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.Addressable Control.Distributed.Process.Internal.Types.ProcessId
+ Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable Control.Distributed.Process.Internal.Types.Message
+ Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable Control.Distributed.Process.Internal.Types.ProcessId
+ Control.Distributed.Process.Extras.Internal.Types: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable a => Control.Distributed.Process.Extras.Internal.Types.NFSerializable (Control.Distributed.Process.Internal.Types.SendPort a)
+ Control.Distributed.Process.Extras.SystemLog: data LogChan
+ Control.Distributed.Process.Extras.SystemLog: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable Control.Distributed.Process.Extras.SystemLog.LogText
+ Control.Distributed.Process.Extras.SystemLog: instance Control.Distributed.Process.Extras.Internal.Types.Routable Control.Distributed.Process.Extras.SystemLog.LogClient
+ Control.Distributed.Process.Extras.SystemLog: type LogText = String
+ Control.Distributed.Process.Extras.Timer: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable Control.Distributed.Process.Extras.Timer.Tick
+ Control.Distributed.Process.Extras.Timer: instance Control.Distributed.Process.Extras.Internal.Types.NFSerializable Control.Distributed.Process.Extras.Timer.TimerConfig
- Control.Concurrent.Utils: withLock :: (Exclusive e) => e -> IO a -> IO a
+ Control.Concurrent.Utils: withLock :: (MonadMask m, MonadIO m) => Lock -> m a -> m a
- Control.Distributed.Process.Extras: class Killable a
+ Control.Distributed.Process.Extras: class Killable p where killProc r s = resolve r >>= traverse_ (flip kill $ s) exitProc r m = resolve r >>= traverse_ (flip exit $ m)
- Control.Distributed.Process.Extras: class Linkable a
+ Control.Distributed.Process.Extras: class Linkable a where linkTo r = resolve r >>= traverse_ link
- Control.Distributed.Process.Extras: class Resolvable a
+ Control.Distributed.Process.Extras: class Resolvable a where unresolvableMessage = baseAddressableErrorMessage
- Control.Distributed.Process.Extras: class Routable a where unresolvableMessage = baseAddressableErrorMessage
+ Control.Distributed.Process.Extras: class Routable a where sendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> send p m) mPid } unsafeSendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> unsafeSend p $!! m) mPid }
- Control.Distributed.Process.Extras: exitProc :: (Killable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras: exitProc :: (Killable p, Resolvable p, Serializable m) => p -> m -> Process ()
- Control.Distributed.Process.Extras: killProc :: Killable a => a -> String -> Process ()
+ Control.Distributed.Process.Extras: killProc :: (Killable p, Resolvable p) => p -> String -> Process ()
- Control.Distributed.Process.Extras: linkTo :: Linkable a => a -> Process ()
+ Control.Distributed.Process.Extras: linkTo :: (Linkable a, Resolvable a) => a -> Process ()
- Control.Distributed.Process.Extras: sendTo :: (Routable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras: sendTo :: (Routable a, Serializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras: unresolvableMessage :: Routable a => a -> String
+ Control.Distributed.Process.Extras: unresolvableMessage :: (Resolvable a, Resolvable a) => a -> String
- Control.Distributed.Process.Extras: unsafeSendTo :: (Routable a, NFSerializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras: unsafeSendTo :: (Routable a, NFSerializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras.Call: multicall :: (Serializable a, Serializable b) => [ProcessId] -> a -> Tag -> Timeout -> Process [Maybe b]
+ Control.Distributed.Process.Extras.Call: multicall :: forall a b. (Serializable a, Serializable b) => [ProcessId] -> a -> Tag -> Timeout -> Process [Maybe b]
- Control.Distributed.Process.Extras.Internal.Containers.MultiMap: filter :: (Insertable k) => (v -> Bool) -> MultiMap k v -> MultiMap k v
+ Control.Distributed.Process.Extras.Internal.Containers.MultiMap: filter :: forall k v. (Insertable k) => (v -> Bool) -> MultiMap k v -> MultiMap k v
- Control.Distributed.Process.Extras.Internal.Containers.MultiMap: filterWithKey :: (Insertable k) => (k -> v -> Bool) -> MultiMap k v -> MultiMap k v
+ Control.Distributed.Process.Extras.Internal.Containers.MultiMap: filterWithKey :: forall k v. (Insertable k) => (k -> v -> Bool) -> MultiMap k v -> MultiMap k v
- Control.Distributed.Process.Extras.Internal.Containers.MultiMap: insert :: (Insertable k, Insertable v) => k -> v -> MultiMap k v -> MultiMap k v
+ Control.Distributed.Process.Extras.Internal.Containers.MultiMap: insert :: forall k v. (Insertable k, Insertable v) => k -> v -> MultiMap k v -> MultiMap k v
- Control.Distributed.Process.Extras.Internal.Primitives: class Killable a
+ Control.Distributed.Process.Extras.Internal.Primitives: class Killable p where killProc r s = resolve r >>= traverse_ (flip kill $ s) exitProc r m = resolve r >>= traverse_ (flip exit $ m)
- Control.Distributed.Process.Extras.Internal.Primitives: class Linkable a
+ Control.Distributed.Process.Extras.Internal.Primitives: class Linkable a where linkTo r = resolve r >>= traverse_ link
- Control.Distributed.Process.Extras.Internal.Primitives: class Resolvable a
+ Control.Distributed.Process.Extras.Internal.Primitives: class Resolvable a where unresolvableMessage = baseAddressableErrorMessage
- Control.Distributed.Process.Extras.Internal.Primitives: class Routable a where unresolvableMessage = baseAddressableErrorMessage
+ Control.Distributed.Process.Extras.Internal.Primitives: class Routable a where sendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> send p m) mPid } unsafeSendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> unsafeSend p $!! m) mPid }
- Control.Distributed.Process.Extras.Internal.Primitives: exitProc :: (Killable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Primitives: exitProc :: (Killable p, Resolvable p, Serializable m) => p -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Primitives: killProc :: Killable a => a -> String -> Process ()
+ Control.Distributed.Process.Extras.Internal.Primitives: killProc :: (Killable p, Resolvable p) => p -> String -> Process ()
- Control.Distributed.Process.Extras.Internal.Primitives: linkTo :: Linkable a => a -> Process ()
+ Control.Distributed.Process.Extras.Internal.Primitives: linkTo :: (Linkable a, Resolvable a) => a -> Process ()
- Control.Distributed.Process.Extras.Internal.Primitives: sendTo :: (Routable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Primitives: sendTo :: (Routable a, Serializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Primitives: unresolvableMessage :: Routable a => a -> String
+ Control.Distributed.Process.Extras.Internal.Primitives: unresolvableMessage :: (Resolvable a, Resolvable a) => a -> String
- Control.Distributed.Process.Extras.Internal.Primitives: unsafeSendTo :: (Routable a, NFSerializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Primitives: unsafeSendTo :: (Routable a, NFSerializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: class Killable a
+ Control.Distributed.Process.Extras.Internal.Types: class Killable p where killProc r s = resolve r >>= traverse_ (flip kill $ s) exitProc r m = resolve r >>= traverse_ (flip exit $ m)
- Control.Distributed.Process.Extras.Internal.Types: class Linkable a
+ Control.Distributed.Process.Extras.Internal.Types: class Linkable a where linkTo r = resolve r >>= traverse_ link
- Control.Distributed.Process.Extras.Internal.Types: class Resolvable a
+ Control.Distributed.Process.Extras.Internal.Types: class Resolvable a where unresolvableMessage = baseAddressableErrorMessage
- Control.Distributed.Process.Extras.Internal.Types: class Routable a where unresolvableMessage = baseAddressableErrorMessage
+ Control.Distributed.Process.Extras.Internal.Types: class Routable a where sendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> send p m) mPid } unsafeSendTo a m = do { mPid <- resolve a; maybe (die (unresolvableMessage a)) (\ p -> unsafeSend p $!! m) mPid }
- Control.Distributed.Process.Extras.Internal.Types: exitProc :: (Killable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Types: exitProc :: (Killable p, Resolvable p, Serializable m) => p -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: killProc :: Killable a => a -> String -> Process ()
+ Control.Distributed.Process.Extras.Internal.Types: killProc :: (Killable p, Resolvable p) => p -> String -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: linkTo :: Linkable a => a -> Process ()
+ Control.Distributed.Process.Extras.Internal.Types: linkTo :: (Linkable a, Resolvable a) => a -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: resolveOrDie :: (Routable a, Resolvable a) => a -> String -> Process ProcessId
+ Control.Distributed.Process.Extras.Internal.Types: resolveOrDie :: (Resolvable a) => a -> String -> Process ProcessId
- Control.Distributed.Process.Extras.Internal.Types: sendTo :: (Routable a, Serializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Types: sendTo :: (Routable a, Serializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Types: unresolvableMessage :: Routable a => a -> String
+ Control.Distributed.Process.Extras.Internal.Types: unresolvableMessage :: (Resolvable a, Resolvable a) => a -> String
- Control.Distributed.Process.Extras.Internal.Types: unsafeSendTo :: (Routable a, NFSerializable m) => a -> m -> Process ()
+ Control.Distributed.Process.Extras.Internal.Types: unsafeSendTo :: (Routable a, NFSerializable m, Resolvable a) => a -> m -> Process ()
- Control.Distributed.Process.Extras.Internal.Unsafe: newInputStream :: (Typeable a) => Either (ReceivePort a) (STM a) -> InputStream a
+ Control.Distributed.Process.Extras.Internal.Unsafe: newInputStream :: forall a. (Typeable a) => Either (ReceivePort a) (STM a) -> InputStream a
- Control.Distributed.Process.Extras.SystemLog: addFormatter :: (Routable r) => r -> Closure (Message -> Process (Maybe String)) -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: addFormatter :: (Addressable r) => r -> Closure (Message -> Process (Maybe String)) -> Process ()
- Control.Distributed.Process.Extras.SystemLog: alert :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: alert :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: class ToLog m
+ Control.Distributed.Process.Extras.SystemLog: class ToLog m where toLog = return . LogData . unsafeWrapMessage
- Control.Distributed.Process.Extras.SystemLog: critical :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: critical :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: debug :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: debug :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: emergency :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: emergency :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: error :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: error :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: info :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: info :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: notice :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: notice :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
- Control.Distributed.Process.Extras.SystemLog: sendLog :: (Logger l, ToLog m) => l -> m -> LogLevel -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: sendLog :: (Logger l, Serializable m, ToLog m) => l -> m -> LogLevel -> Process ()
- Control.Distributed.Process.Extras.SystemLog: toLog :: ToLog m => m -> Process (LogLevel -> LogMessage)
+ Control.Distributed.Process.Extras.SystemLog: toLog :: (ToLog m, Serializable m) => m -> Process (LogLevel -> LogMessage)
- Control.Distributed.Process.Extras.SystemLog: warning :: (Logger l, ToLog m) => l -> m -> Process ()
+ Control.Distributed.Process.Extras.SystemLog: warning :: (Logger l, Serializable m, ToLog m) => l -> m -> Process ()
Files
- ChangeLog +6/−9
- distributed-process-extras.cabal +40/−35
- src/Control/Concurrent/Utils.hs +27/−50
- src/Control/Distributed/Process/Extras.hs +0/−3
- src/Control/Distributed/Process/Extras/Internal/Types.hs +103/−109
- src/Control/Distributed/Process/Extras/SystemLog.hs +27/−23
- src/Control/Distributed/Process/Extras/Time.hs +1/−1
- src/Control/Distributed/Process/Extras/Timer.hs +5/−1
- tests/TestLog.hs +3/−3
- tests/TestPrimitives.hs +1/−1
- tests/TestQueues.hs +2/−2
- tests/TestTimer.hs +5/−3
ChangeLog view
@@ -1,3 +1,9 @@+2017-02-05 Tim Watson <watson.timothy @ google mail service dot com> 0.3.0++* Update dependency bounds - drop support for distributed-process < 0.6.6+* Drop support for GHC < 7.10+* Fixes for testing with latest stack and CI changes+ 2016-02-16 Facundo Domínguez <facundo.dominguez@tweag.io> 0.2.1.2 * Update dependency bounds.@@ -8,12 +14,3 @@ * Add compatibility with ghc-7.10. * Fix dependency bounds. * Add missing NFData instances.--# HEAD--* Added initial GenServer module-* Added Timer Module-* Moved time functions into Time.hs-* Added Async API-* Added GenProcess API (subsumes lower level GenServer API)-
distributed-process-extras.cabal view
@@ -1,21 +1,21 @@ name: distributed-process-extras-version: 0.2.1.2+version: 0.3.0 cabal-version: >=1.8 build-type: Simple license: BSD3 license-file: LICENCE stability: experimental-Copyright: Tim Watson 2012 - 2013+Copyright: Tim Watson 2012 - 2017 Author: Tim Watson-Maintainer: Facundo Domínguez <facundo.dominguez@tweag.io>+Maintainer: Tim Watson <watson.timothy@gmail.com> Stability: experimental Homepage: http://github.com/haskell-distributed/distributed-process-extras-Bug-Reports: https://cloud-haskell.atlassian.net+Bug-Reports: http://github.com/haskell-distributed/distributed-process-extras/issues synopsis: Cloud Haskell Extras description: Supporting library, providing common types and utilities used by the- various components that make up the distributed-process-platform package.+ various libraries built on top of distributed-process category: Control-tested-with: GHC == 7.4.2 GHC == 7.6.2+Tested-With: GHC==7.10.3 GHC==8.0.1 GHC==8.0.2 data-dir: "" extra-source-files: ChangeLog @@ -23,29 +23,34 @@ type: git location: https://github.com/haskell-distributed/distributed-process-extras +flag old-locale+ description: If false then depend on time >= 1.5.+ .+ If true then depend on time < 1.5 together with old-locale.+ default: False+ library- build-depends:- base >= 4.4 && < 5,+ build-depends: base >= 4.6 && < 5, data-accessor >= 0.2.2.3,- distributed-process >= 0.5.3 && < 0.7,- binary >= 0.6.3.0 && < 0.8,+ distributed-process >= 0.6.6 && < 0.7,+ binary >= 0.6.3.0 && < 0.9, deepseq >= 1.3.0.1 && < 1.6,- mtl,+ mtl >= 2.0 && < 2.4, containers >= 0.4 && < 0.6,+ exceptions >= 0.5, hashable >= 1.2.0.5 && < 1.3, unordered-containers >= 0.2.3.0 && < 0.3, fingertree < 0.2, stm >= 2.4 && < 2.5,- time > 1.4 && < 1.6,- transformers- if impl(ghc <= 7.5)- Build-Depends: template-haskell == 2.7.0.0,- derive == 2.5.5,- uniplate == 1.6.12,- ghc-prim+ transformers >= 0.2 && < 0.6+ if flag(old-locale)+ Build-Depends: time < 1.5, old-locale >= 1.0 && <1.1+ else+ Build-Depends: time >= 1.5 extensions: CPP- hs-source-dirs: src+ other-extensions: ExistentialQuantification ghc-options: -Wall+ HS-Source-Dirs: src exposed-modules: Control.Distributed.Process.Extras, Control.Distributed.Process.Extras.Call,@@ -66,11 +71,11 @@ type: exitcode-stdio-1.0 x-uses-tf: true build-depends:- base >= 4.4 && < 5,+ base >= 4.6 && < 5, ansi-terminal >= 0.5 && < 0.7,- distributed-process >= 0.5.3 && < 0.7,+ distributed-process >= 0.6.6 && < 0.7, distributed-process-extras,- distributed-process-tests >= 0.4.2 && < 0.5,+ distributed-process-systest >= 0.1.0 && < 0.2.0, HUnit >= 1.2 && < 2, test-framework >= 0.6 && < 0.9, test-framework-hunit,@@ -89,16 +94,16 @@ type: exitcode-stdio-1.0 x-uses-tf: true build-depends:- base >= 4.4 && < 5,+ base >= 4.6 && < 5, ansi-terminal >= 0.5 && < 0.7,- distributed-process >= 0.5.3 && < 0.7,+ distributed-process >= 0.6.6 && < 0.7, distributed-process-extras,- distributed-process-tests >= 0.4.2 && < 0.5,+ distributed-process-systest >= 0.1.0 && < 0.2.0, network-transport >= 0.4 && < 0.5, mtl, containers >= 0.4 && < 0.6, network-transport-tcp >= 0.4 && < 0.6,- binary >= 0.6.3.0 && < 0.8,+ binary >= 0.6.3.0 && < 0.9, deepseq >= 1.3.0.1 && < 1.6, network >= 2.3 && < 2.7, HUnit >= 1.2 && < 2,@@ -117,12 +122,12 @@ type: exitcode-stdio-1.0 x-uses-tf: true build-depends:- base >= 4.4 && < 5,+ base >= 4.6 && < 5, ansi-terminal >= 0.5 && < 0.7, deepseq >= 1.3.0.1 && < 1.6,- distributed-process >= 0.5.3 && < 0.7,+ distributed-process >= 0.6.6 && < 0.7, distributed-process-extras,- distributed-process-tests >= 0.4.2 && < 0.5,+ distributed-process-systest >= 0.1.0 && < 0.2.0, network-transport >= 0.4 && < 0.5, network-transport-tcp >= 0.4 && < 0.6, HUnit >= 1.2 && < 2,@@ -143,14 +148,14 @@ type: exitcode-stdio-1.0 -- x-uses-tf: true build-depends:- base >= 4.4 && < 5,+ base >= 4.6 && < 5, ansi-terminal >= 0.5 && < 0.7, containers, hashable, unordered-containers >= 0.2.3.0 && < 0.3,- distributed-process >= 0.5.3 && < 0.7,+ distributed-process >= 0.6.6 && < 0.7, distributed-process-extras,- distributed-process-tests >= 0.4.2 && < 0.5,+ distributed-process-systest >= 0.1.0 && < 0.2.0, distributed-static, bytestring, data-accessor,@@ -159,11 +164,11 @@ deepseq >= 1.3.0.1 && < 1.6, mtl, network-transport-tcp >= 0.4 && < 0.6,- binary >= 0.6.3.0 && < 0.8,+ binary >= 0.6.3.0 && < 0.9, network >= 2.3 && < 2.7, HUnit >= 1.2 && < 2, stm >= 2.3 && < 2.5,- time > 1.4 && < 1.6,+ time > 1.4 && < 1.8, test-framework >= 0.6 && < 0.9, test-framework-hunit, transformers,@@ -171,6 +176,6 @@ ghc-prim hs-source-dirs: tests- ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N -fno-warn-unused-do-bind -eventlog+ ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N -fno-warn-unused-do-bind extensions: CPP main-is: TestLog.hs
src/Control/Concurrent/Utils.hs view
@@ -1,65 +1,42 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-+{-# LANGUAGE ExistentialQuantification #-} module Control.Concurrent.Utils ( Lock()- , Exclusive(..)- , Synchronised(..)+ , mkExclusiveLock+ , mkQLock , withLock ) where -import Control.Distributed.Process- ( Process- )-import qualified Control.Distributed.Process as Process (catch)-import Control.Exception (SomeException, throw)-import qualified Control.Exception as Exception (catch)+import Control.Monad.Catch (MonadMask)+import qualified Control.Monad.Catch as Catch import Control.Concurrent.MVar- ( MVar- , tryPutMVar- , newMVar+ ( newMVar , takeMVar+ , putMVar )+import Control.Concurrent.QSem import Control.Monad.IO.Class (MonadIO, liftIO) -newtype Lock = Lock { mvar :: MVar () }--class Exclusive a where- new :: IO a- acquire :: (MonadIO m) => a -> m ()- release :: (MonadIO m) => a -> m ()--instance Exclusive Lock where- new = return . Lock =<< newMVar ()- acquire = liftIO . takeMVar . mvar- release l = liftIO (tryPutMVar (mvar l) ()) >> return ()--class Synchronised e m where- synchronised :: (Exclusive e, Monad m) => e -> m b -> m b+-- | Opaque lock.+data Lock = forall l . Lock l (l -> IO ()) (l -> IO ()) - synchronized :: (Exclusive e, Monad m) => e -> m b -> m b- synchronized = synchronised+-- | Take a lock.+acquire :: MonadIO m => Lock -> m ()+acquire (Lock l acq _) = liftIO $ acq l -instance Synchronised Lock IO where- synchronised = withLock+-- | Release lock.+release :: MonadIO m => Lock -> m ()+release (Lock l _ rel) = liftIO $ rel l -instance Synchronised Lock Process where- synchronised = withLockP+-- | Create exclusive lock. Only one process could take such lock.+mkExclusiveLock :: IO Lock+mkExclusiveLock = Lock <$> newMVar () <*> pure takeMVar <*> pure (flip putMVar ()) -withLockP :: (Exclusive e) => e -> Process a -> Process a-withLockP excl act = do- Process.catch (do { liftIO $ acquire excl- ; result <- act- ; liftIO $ release excl- ; return result- })- (\(e :: SomeException) -> (liftIO $ release excl) >> throw e)+-- | Create quantity lock. A fixed number of processes can take this lock simultaniously.+mkQLock :: Int -> IO Lock+mkQLock n = Lock <$> newQSem n <*> pure waitQSem <*> pure signalQSem -withLock :: (Exclusive e) => e -> IO a -> IO a-withLock excl act = do- Exception.catch (do { acquire excl- ; result <- act- ; release excl- ; return result- })- (\(e :: SomeException) -> release excl >> throw e)+-- | Run action under a held lock.+withLock :: (MonadMask m, MonadIO m) => Lock -> m a -> m a+withLock excl =+ Catch.bracket_ (acquire excl)+ (release excl)
src/Control/Distributed/Process/Extras.hs view
@@ -51,7 +51,6 @@ ( -- * Exported Types Addressable- , sendToRecipient , Resolvable(..) , Routable(..) , Linkable(..)@@ -97,8 +96,6 @@ import Control.Distributed.Process (RemoteTable) import Control.Distributed.Process.Extras.Internal.Types ( NFSerializable- , sendToRecipient- , NFSerializable , Recipient(..) , Shutdown(..) , ExitReason(..)
src/Control/Distributed/Process/Extras/Internal/Types.hs view
@@ -3,10 +3,9 @@ {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE OverlappingInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-} -- | Types used throughout the Extras package --@@ -22,7 +21,6 @@ , Resolvable(..) , Routable(..) , Addressable- , sendToRecipient , Recipient(..) , RegisterSelf(..) -- * Interactions@@ -58,6 +56,7 @@ import Control.Distributed.Process.Serializable import Data.Binary+import Data.Foldable (traverse_) import Data.Typeable (Typeable) import GHC.Generics @@ -74,8 +73,11 @@ -- behaviour by using /unsafe/ primitives in this way. -- class (NFData a, Serializable a) => NFSerializable a-instance (NFData a, Serializable a) => NFSerializable a +instance NFSerializable ProcessId+instance (NFSerializable a) => NFSerializable (SendPort a)+instance NFSerializable Message+ -- | Tags provide uniqueness for messages, so that they can be -- matched with their response. type Tag = Int@@ -96,6 +98,15 @@ getTag :: TagPool -> Process Tag getTag tp = liftIO $ modifyMVar tp (\tag -> return (tag+1,tag)) +$(remotable ['whereis])++-- | A synchronous version of 'whereis', this relies on 'call'+-- to perform the relevant monitoring of the remote node.+whereisRemote :: NodeId -> String -> Process (Maybe ProcessId)+whereisRemote node name =+ call $(functionTDict 'whereis) node ($(mkClosure 'whereis) name)++ -- | Wait cancellation message. data CancelWait = CancelWait deriving (Eq, Show, Typeable, Generic)@@ -128,154 +139,137 @@ instance Binary ExitReason where instance NFData ExitReason where --- | A simple means of mapping to a receiver.-data Recipient =- Pid !ProcessId- | Registered !String- | RemoteRegistered !String !NodeId--- | ProcReg !ProcessId !String--- | RemoteProcReg NodeId String--- | GlobalReg String- deriving (Typeable, Generic, Show, Eq)-instance Binary Recipient where-instance NFData Recipient where- rnf (Pid p) = rnf p `seq` ()- rnf (Registered s) = rnf s `seq` ()- rnf (RemoteRegistered s n) = rnf s `seq` rnf n `seq` ()---- useful exit reasons---- | Given when a server is unobtainable.-data ServerDisconnected = ServerDisconnected !DiedReason- deriving (Typeable, Generic)-instance Binary ServerDisconnected where-instance NFData ServerDisconnected where--$(remotable ['whereis])---- | A synchronous version of 'whereis', this relies on 'call'--- to perform the relevant monitoring of the remote node.-whereisRemote :: NodeId -> String -> Process (Maybe ProcessId)-whereisRemote node name =- call $(functionTDict 'whereis) node ($(mkClosure 'whereis) name)--sendToRecipient :: (Serializable m) => Recipient -> m -> Process ()-sendToRecipient (Pid p) m = P.send p m-sendToRecipient (Registered s) m = nsend s m-sendToRecipient (RemoteRegistered s n) m = nsendRemote n s m--unsafeSendToRecipient :: (NFSerializable m) => Recipient -> m -> Process ()-unsafeSendToRecipient (Pid p) m = P.unsafeSend p $!! m-unsafeSendToRecipient (Registered s) m = P.unsafeNSend s $!! m-unsafeSendToRecipient (RemoteRegistered s n) m = nsendRemote n s m--baseAddressableErrorMessage :: (Routable a) => a -> String+baseAddressableErrorMessage :: (Resolvable a) => a -> String baseAddressableErrorMessage _ = "CannotResolveAddressable" -- | Class of things to which a @Process@ can /link/ itself. class Linkable a where -- | Create a /link/ with the supplied object.- linkTo :: a -> Process ()+ linkTo :: (Resolvable a) => a -> Process ()+ linkTo r = resolve r >>= traverse_ link +-- | Class of things that can be killed (or instructed to exit).+class Killable p where+ -- | Kill (instruct to exit) generic process, using 'kill' primitive.+ killProc :: Resolvable p => p -> String -> Process ()+ killProc r s = resolve r >>= traverse_ (flip kill $ s)++ -- | Kill (instruct to exit) generic process, using 'exit' primitive.+ exitProc :: (Resolvable p, Serializable m) => p -> m -> Process ()+ exitProc r m = resolve r >>= traverse_ (flip exit $ m)++-- | resolve the Resolvable or die with specified msg plus details of what didn't resolve+resolveOrDie :: (Resolvable a) => a -> String -> Process ProcessId+resolveOrDie resolvable failureMsg = do+ result <- resolve resolvable+ case result of+ Nothing -> die $ failureMsg ++ " " ++ unresolvableMessage resolvable+ Just pid -> return pid+ -- | Class of things that can be resolved to a 'ProcessId'. -- class Resolvable a where -- | Resolve the reference to a process id, or @Nothing@ if resolution fails resolve :: a -> Process (Maybe ProcessId) --- | Class of things that can be killed (or instructed to exit).-class Killable a where- killProc :: a -> String -> Process ()- exitProc :: (Serializable m) => a -> m -> Process ()+ -- | Unresolvable @Addressable@ Message+ unresolvableMessage :: (Resolvable a) => a -> String+ unresolvableMessage = baseAddressableErrorMessage -instance Killable ProcessId where- killProc = kill- exitProc = exit+instance Resolvable ProcessId where+ resolve p = return (Just p)+ unresolvableMessage p = "CannotResolvePid[" ++ (show p) ++ "]" -instance Resolvable r => Killable r where- killProc r s = resolve r >>= maybe (return ()) (flip kill $ s)- exitProc r m = resolve r >>= maybe (return ()) (flip exit $ m)+instance Resolvable String where+ resolve = whereis+ unresolvableMessage s = "CannotResolveRegisteredName[" ++ s ++ "]" --- | Provides a unified API for addressing processes.----class Routable a where- -- | Send a message to the target asynchronously- sendTo :: (Serializable m) => a -> m -> Process ()+instance Resolvable (NodeId, String) where+ resolve (nid, pname) = whereisRemote nid pname+ unresolvableMessage (n, s) =+ "CannotResolveRemoteRegisteredName[name: " ++ s ++ ", node: " ++ (show n) ++ "]" - -- | Send some @NFData@ message to the target asynchronously,- -- forcing evaluation (i.e., @deepseq@) beforehand.- unsafeSendTo :: (NFSerializable m) => a -> m -> Process ()+-- Provide a unified API for addressing processes. - -- | Unresolvable @Addressable@ Message- unresolvableMessage :: a -> String- unresolvableMessage = baseAddressableErrorMessage+-- | Class of things that you can route/send serializable message to+class Routable a where -instance (Resolvable a) => Routable a where+ -- | Send a message to the target asynchronously+ sendTo :: (Serializable m, Resolvable a) => a -> m -> Process () sendTo a m = do mPid <- resolve a maybe (die (unresolvableMessage a)) (\p -> P.send p m) mPid + -- | Send some @NFData@ message to the target asynchronously,+ -- forcing evaluation (i.e., @deepseq@) beforehand.+ unsafeSendTo :: (NFSerializable m, Resolvable a) => a -> m -> Process () unsafeSendTo a m = do mPid <- resolve a maybe (die (unresolvableMessage a)) (\p -> P.unsafeSend p $!! m) mPid - -- | Unresolvable Addressable Message- unresolvableMessage = baseAddressableErrorMessage--instance Resolvable Recipient where- resolve (Pid p) = return (Just p)- resolve (Registered n) = whereis n- resolve (RemoteRegistered s n) = whereisRemote n s--instance Routable Recipient where- sendTo = sendToRecipient- unsafeSendTo = unsafeSendToRecipient-- unresolvableMessage (Pid p) = unresolvableMessage p- unresolvableMessage (Registered n) = unresolvableMessage n- unresolvableMessage (RemoteRegistered s n) = unresolvableMessage (n, s)--instance Resolvable ProcessId where- resolve p = return (Just p)- instance Routable ProcessId where sendTo = P.send unsafeSendTo pid msg = P.unsafeSend pid $!! msg- unresolvableMessage p = "CannotResolvePid[" ++ (show p) ++ "]" -instance Resolvable String where- resolve = whereis- instance Routable String where sendTo = nsend unsafeSendTo name msg = P.unsafeNSend name $!! msg- unresolvableMessage s = "CannotResolveRegisteredName[" ++ s ++ "]" -instance Resolvable (NodeId, String) where- resolve (nid, pname) = whereisRemote nid pname- instance Routable (NodeId, String) where sendTo (nid, pname) msg = nsendRemote nid pname msg unsafeSendTo = sendTo -- because serialisation *must* take place- unresolvableMessage (n, s) =- "CannotResolveRemoteRegisteredName[name: " ++ s ++ ", node: " ++ (show n) ++ "]" instance Routable (Message -> Process ()) where sendTo f = f . wrapMessage unsafeSendTo f = f . unsafeWrapMessage class (Resolvable a, Routable a) => Addressable a-instance (Resolvable a, Routable a) => Addressable a+instance Addressable ProcessId --- TODO: this probably belongs somewhere other than in ..Types.--- | resolve the Resolvable or die with specified msg plus details of what didn't resolve-resolveOrDie :: (Routable a, Resolvable a) => a -> String -> Process ProcessId-resolveOrDie resolvable failureMsg = do- result <- resolve resolvable- case result of- Nothing -> die $ failureMsg ++ " " ++ unresolvableMessage resolvable- Just pid -> return pid+-- | A simple means of mapping to a receiver.+data Recipient =+ Pid !ProcessId+ | Registered !String+ | RemoteRegistered !String !NodeId+-- | ProcReg !ProcessId !String+-- | RemoteProcReg NodeId String+-- | GlobalReg String+ deriving (Typeable, Generic, Show, Eq)+instance Binary Recipient where+instance NFData Recipient where+ rnf (Pid p) = rnf p `seq` ()+ rnf (Registered s) = rnf s `seq` ()+ rnf (RemoteRegistered s n) = rnf s `seq` rnf n `seq` ()++instance Resolvable Recipient where+ resolve (Pid p) = return (Just p)+ resolve (Registered n) = whereis n+ resolve (RemoteRegistered s n) = whereisRemote n s++ unresolvableMessage (Pid p) = unresolvableMessage p+ unresolvableMessage (Registered n) = unresolvableMessage n+ unresolvableMessage (RemoteRegistered s n) = unresolvableMessage (n, s)++-- although we have an instance of Routable for Resolvable, it really+-- makes no sense to do remote lookups on a pid, only to then send to it!+instance Routable Recipient where++ sendTo (Pid p) m = P.send p m+ sendTo (Registered s) m = nsend s m+ sendTo (RemoteRegistered s n) m = nsendRemote n s m++ unsafeSendTo (Pid p) m = P.unsafeSend p $!! m+ unsafeSendTo (Registered s) m = P.unsafeNSend s $!! m+ unsafeSendTo (RemoteRegistered s n) m = nsendRemote n s m++-- useful exit reasons++-- | Given when a server is unobtainable.+data ServerDisconnected = ServerDisconnected !DiedReason+ deriving (Typeable, Generic)+instance Binary ServerDisconnected where+instance NFData ServerDisconnected where
src/Control/Distributed/Process/Extras/SystemLog.hs view
@@ -4,9 +4,8 @@ {-# LANGUAGE PatternGuards #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE OverlappingInstances #-}-{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE ConstrainedClassMethods #-} ----------------------------------------------------------------------------- -- |@@ -44,7 +43,7 @@ , LogFormat , LogClient , LogChan- , LogText(..)+ , LogText , ToLog(..) , Logger(..) -- * Mx Agent Configuration / Startup@@ -69,7 +68,7 @@ ) where import Control.DeepSeq (NFData(..))-import Control.Distributed.Process+import Control.Distributed.Process hiding (catch) import Control.Distributed.Process.Management ( MxEvent(MxConnected, MxDisconnected, MxLog, MxUser) , MxAgentId(..)@@ -86,9 +85,12 @@ import Control.Distributed.Process.Extras ( Resolvable(..) , Routable(..)+ , Addressable+ , NFSerializable ) import Control.Distributed.Process.Serializable import Control.Exception (SomeException)+import Control.Monad.Catch (catch) import Data.Accessor ( Accessor , accessor@@ -156,25 +158,27 @@ type LogFormat = String -> Process String -type LogChan = ()+type LogChanT = ()++newtype LogChan = LogChan LogChanT instance Routable LogChan where sendTo _ = mxNotify unsafeSendTo _ = mxNotify -data LogText = LogText { txt :: !String }+type LogText = String+instance NFSerializable LogText newtype LogClient = LogClient { agent :: ProcessId } instance Resolvable LogClient where resolve = return . Just . agent+instance Routable LogClient class ToLog m where- toLog :: m -> Process (LogLevel -> LogMessage)+ toLog :: (Serializable m) => m -> Process (LogLevel -> LogMessage)+ toLog = return . LogData . unsafeWrapMessage instance ToLog LogText where- toLog = return . LogMessage . txt--instance (Serializable a) => ToLog a where- toLog = return . LogData . unsafeWrapMessage+ toLog = return . LogMessage instance ToLog Message where toLog = return . LogData@@ -195,46 +199,46 @@ mxLogId = MxAgentId logProcessName logChannel :: LogChan-logChannel = ()+logChannel = LogChan () report :: (Logger l) => (l -> LogText -> Process ()) -> l -> String -> Process ()-report f l = f l . LogText+report f l = f l client :: Process (Maybe LogClient) client = resolve logProcessName >>= return . maybe Nothing (Just . LogClient) -debug :: (Logger l, ToLog m) => l -> m -> Process ()+debug :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () debug l m = sendLog l m Debug -info :: (Logger l, ToLog m) => l -> m -> Process ()+info :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () info l m = sendLog l m Info -notice :: (Logger l, ToLog m) => l -> m -> Process ()+notice :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () notice l m = sendLog l m Notice -warning :: (Logger l, ToLog m) => l -> m -> Process ()+warning :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () warning l m = sendLog l m Warning -error :: (Logger l, ToLog m) => l -> m -> Process ()+error :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () error l m = sendLog l m Error -critical :: (Logger l, ToLog m) => l -> m -> Process ()+critical :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () critical l m = sendLog l m Critical -alert :: (Logger l, ToLog m) => l -> m -> Process ()+alert :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () alert l m = sendLog l m Alert -emergency :: (Logger l, ToLog m) => l -> m -> Process ()+emergency :: (Logger l, Serializable m, ToLog m) => l -> m -> Process () emergency l m = sendLog l m Emergency -sendLog :: (Logger l, ToLog m) => l -> m -> LogLevel -> Process ()+sendLog :: (Logger l, Serializable m, ToLog m) => l -> m -> LogLevel -> Process () sendLog a m lv = toLog m >>= \m' -> logMessage a $ m' lv -addFormatter :: (Routable r)+addFormatter :: (Addressable r) => r -> Closure (Message -> Process (Maybe String)) -> Process ()
src/Control/Distributed/Process/Extras/Time.hs view
@@ -155,7 +155,7 @@ {-# INLINE hoursPerDay #-} hoursPerDay :: Int-hoursPerDay = 60+hoursPerDay = 24 {-# INLINE minutesPerHour #-} minutesPerHour :: Int
src/Control/Distributed/Process/Extras/Timer.hs view
@@ -36,7 +36,7 @@ , flushTimer ) where -import Control.DeepSeq (NFData)+import Control.DeepSeq (NFData(..)) import Control.Distributed.Process hiding (send) import Control.Distributed.Process.Serializable import Control.Distributed.Process.Extras.UnsafePrimitives (send)@@ -56,12 +56,16 @@ deriving (Typeable, Generic, Eq, Show) instance Binary TimerConfig where instance NFData TimerConfig where+ rnf tc = tc `seq` ()+instance NFSerializable TimerConfig -- | represents a 'tick' event that timers can generate data Tick = Tick deriving (Typeable, Generic, Eq, Show) instance Binary Tick where instance NFData Tick where+ rnf t = t `seq` ()+instance NFSerializable Tick data SleepingPill = SleepingPill deriving (Typeable, Generic, Eq, Show)
tests/TestLog.hs view
@@ -13,7 +13,7 @@ import Control.Distributed.Process.Extras hiding (__remoteTable) import qualified Control.Distributed.Process.Extras.SystemLog as Log (Logger, error) import Control.Distributed.Process.Extras.SystemLog hiding (Logger, error)-import Control.Distributed.Process.Tests.Internal.Utils+import Control.Distributed.Process.SysTest.Utils import Control.Distributed.Process.Extras.Time import Control.Distributed.Process.Extras.Timer import Control.Monad (void)@@ -59,7 +59,7 @@ where writeLog chan = liftIO . atomically . writeTChan chan -testLogLevels :: (Log.Logger logger, ToLog tL)+testLogLevels :: (Log.Logger logger, NFSerializable tL, ToLog tL) => MVar () -> TChan String -> logger@@ -126,7 +126,7 @@ testCase l (delayedAssertion ("Expected up to " ++ l) ln True $ testLogLevels lck chan ch' Debug lvl rdr) - simpleShowToLog = (LogText . show)+ simpleShowToLog = show messageToLog = unsafeWrapMessage . show messageRaw = unsafeWrapMessage
tests/TestPrimitives.hs view
@@ -27,7 +27,7 @@ import Test.Framework.Providers.HUnit (testCase) import Network.Transport.TCP import qualified Network.Transport as NT-import Control.Distributed.Process.Tests.Internal.Utils+import Control.Distributed.Process.SysTest.Utils testLinkingWithNormalExits :: TestResult DiedReason -> Process () testLinkingWithNormalExits result = do
tests/TestQueues.hs view
@@ -47,8 +47,8 @@ Just (a', q2) = FIFO.dequeue q1 Just (b', q3) = FIFO.dequeue q2 Just (c', q4) = FIFO.dequeue q3- Nothing = FIFO.dequeue q4- in q4 `seq` [a',b',c'] == [a,b,c] -- why seq here? to shut the compiler up.+ d = FIFO.dequeue q4+ in (d == Nothing) && (q4 `seq` [a',b',c'] == [a,b,c]) -- why seq here? to shut the compiler up. prop_enqueue_empty :: String -> Bool prop_enqueue_empty s =
tests/TestTimer.hs view
@@ -16,9 +16,10 @@ import Control.Distributed.Process import Control.Distributed.Process.Node import Control.Distributed.Process.Serializable()+import Control.Distributed.Process.Extras (NFSerializable) import Control.Distributed.Process.Extras.Time import Control.Distributed.Process.Extras.Timer-import Control.Distributed.Process.Tests.Internal.Utils+import Control.Distributed.Process.SysTest.Utils import Test.Framework (Test, testGroup, defaultMain) import Test.Framework.Providers.HUnit (testCase)@@ -29,6 +30,7 @@ -- orphan instance instance NFData Ping where+instance NFSerializable Ping testSendAfter :: TestResult Bool -> Process () testSendAfter result =@@ -63,8 +65,8 @@ let delay = milliSeconds 50 pid <- periodically delay noop ref <- monitor pid-- sleep $ seconds 1+ _ <- getProcessInfo pid+ cancelTimer pid _ <- receiveWait [