| Safe Haskell | None |
|---|
Control.Distributed.Process.Internal.Primitives
Contents
Description
Cloud Haskell primitives
We define these in a separate module so that we don't have to rely on the closure combinators
- send :: Serializable a => ProcessId -> a -> Process ()
- expect :: forall a. Serializable a => Process a
- newChan :: Serializable a => Process (SendPort a, ReceivePort a)
- sendChan :: Serializable a => SendPort a -> a -> Process ()
- receiveChan :: Serializable a => ReceivePort a -> Process a
- mergePortsBiased :: Serializable a => [ReceivePort a] -> Process (ReceivePort a)
- mergePortsRR :: Serializable a => [ReceivePort a] -> Process (ReceivePort a)
- data Match b
- receiveWait :: [Match b] -> Process b
- receiveTimeout :: Int -> [Match b] -> Process (Maybe b)
- match :: forall a b. Serializable a => (a -> Process b) -> Match b
- matchIf :: forall a b. Serializable a => (a -> Bool) -> (a -> Process b) -> Match b
- matchUnknown :: Process b -> Match b
- terminate :: Process a
- data ProcessTerminationException = ProcessTerminationException
- getSelfPid :: Process ProcessId
- getSelfNode :: Process NodeId
- link :: ProcessId -> Process ()
- unlink :: ProcessId -> Process ()
- monitor :: ProcessId -> Process MonitorRef
- unmonitor :: MonitorRef -> Process ()
- say :: String -> Process ()
- register :: String -> ProcessId -> Process ()
- unregister :: String -> Process ()
- whereis :: String -> Process (Maybe ProcessId)
- nsend :: Serializable a => String -> a -> Process ()
- registerRemote :: NodeId -> String -> ProcessId -> Process ()
- unregisterRemote :: NodeId -> String -> Process ()
- whereisRemote :: NodeId -> String -> Process (Maybe ProcessId)
- whereisRemoteAsync :: NodeId -> String -> Process ()
- nsendRemote :: Serializable a => NodeId -> String -> a -> Process ()
- unClosure :: forall a. Typeable a => Closure a -> Process a
- catch :: Exception e => Process a -> (e -> Process a) -> Process a
- mask :: ((forall a. Process a -> Process a) -> Process b) -> Process b
- onException :: Process a -> Process b -> Process a
- bracket :: Process a -> (a -> Process b) -> (a -> Process c) -> Process c
- bracket_ :: Process a -> Process b -> Process c -> Process c
- finally :: Process a -> Process b -> Process a
- expectTimeout :: forall a. Serializable a => Int -> Process (Maybe a)
- spawnAsync :: NodeId -> Closure (Process ()) -> Process SpawnRef
- linkNode :: NodeId -> Process ()
- linkPort :: SendPort a -> Process ()
- unlinkNode :: NodeId -> Process ()
- unlinkPort :: SendPort a -> Process ()
- monitorNode :: NodeId -> Process MonitorRef
- monitorPort :: forall a. Serializable a => SendPort a -> Process MonitorRef
Basic messaging
expect :: forall a. Serializable a => Process aSource
Wait for a message of a specific type
Channels
newChan :: Serializable a => Process (SendPort a, ReceivePort a)Source
Create a new typed channel
receiveChan :: Serializable a => ReceivePort a -> Process aSource
Wait for a message on a typed channel
mergePortsBiased :: Serializable a => [ReceivePort a] -> Process (ReceivePort a)Source
Merge a list of typed channels.
The result port is left-biased: if there are messages available on more than one port, the first available message is returned.
mergePortsRR :: Serializable a => [ReceivePort a] -> Process (ReceivePort a)Source
Like mergePortsBiased, but with a round-robin scheduler (rather than
left-biased)
Advanced messaging
Opaque type used in receiveWait and receiveTimeout
receiveWait :: [Match b] -> Process bSource
Test the matches in order against each message in the queue
receiveTimeout :: Int -> [Match b] -> Process (Maybe b)Source
Like receiveWait but with a timeout.
If the timeout is zero do a non-blocking check for matching messages. A non-zero timeout is applied only when waiting for incoming messages (that is, after we have checked the messages that are already in the mailbox).
match :: forall a b. Serializable a => (a -> Process b) -> Match bSource
Match against any message of the right type
matchIf :: forall a b. Serializable a => (a -> Bool) -> (a -> Process b) -> Match bSource
Match against any message of the right type that satisfies a predicate
matchUnknown :: Process b -> Match bSource
Remove any message from the queue
Process management
getSelfPid :: Process ProcessIdSource
Our own process ID
getSelfNode :: Process NodeIdSource
Get the node ID of our local node
Monitoring and linking
link :: ProcessId -> Process ()Source
Link to a remote process (asynchronous)
Note that link provides unidirectional linking (see spawnSupervised).
Linking makes no distinction between normal and abnormal termination of
the remote process.
monitor :: ProcessId -> Process MonitorRefSource
Monitor another process (asynchronous)
unmonitor :: MonitorRef -> Process ()Source
Remove a monitor (synchronous)
Logging
say :: String -> Process ()Source
Log a string
say message sends a message (time, pid of the current process, message)
to the process registered as logger. By default, this process simply
sends the string to stderr. Individual Cloud Haskell backends might
replace this with a different logger process, however.
Registry
register :: String -> ProcessId -> Process ()Source
Register a process with the local registry (asynchronous).
The process to be registered does not have to be local itself.
unregister :: String -> Process ()Source
Remove a process from the local registry (asynchronous).
nsend :: Serializable a => String -> a -> Process ()Source
Named send to a process in the local registry (asynchronous)
registerRemote :: NodeId -> String -> ProcessId -> Process ()Source
Register a process with a remote registry (asynchronous).
The process to be registered does not have to live on the same remote node.
unregisterRemote :: NodeId -> String -> Process ()Source
Remove a process from a remote registry (asynchronous).
whereisRemote :: NodeId -> String -> Process (Maybe ProcessId)Source
Query a remote process registry (synchronous)
whereisRemoteAsync :: NodeId -> String -> Process ()Source
Query a remote process registry (asynchronous)
Reply will come in the form of a WhereIsReply message
nsendRemote :: Serializable a => NodeId -> String -> a -> Process ()Source
Named send to a process in a remote registry (asynchronous)
Closures
Exception handling
onException :: Process a -> Process b -> Process aSource
Lift onException
Auxiliary API
expectTimeout :: forall a. Serializable a => Int -> Process (Maybe a)Source
Like expect but with a timeout
spawnAsync :: NodeId -> Closure (Process ()) -> Process SpawnRefSource
Asynchronous version of spawn
(spawn is defined in terms of spawnAsync and expect)
unlinkNode :: NodeId -> Process ()Source
Remove a node link (synchronous)
unlinkPort :: SendPort a -> Process ()Source
Remove a channel (send port) link (synchronous)
monitorNode :: NodeId -> Process MonitorRefSource
Monitor a node
monitorPort :: forall a. Serializable a => SendPort a -> Process MonitorRefSource
Monitor a typed channel