git.iko.soy/distributed-process
on master help sign in
Better 'copy' in payloadToMessage
2aaabdcEdsko de Vries
distributed-process/src/Control/Distributed/Process/Internal/Types.hs+12−4
@@ -69,14 +69,14 @@ import Data.Map (Map)
69import Data.Int (Int32)
69import Data.Int (Int32)
70import Data.Typeable (Typeable)
70import Data.Typeable (Typeable)
71import Data.Binary (Binary(put, get), putWord8, getWord8, encode)
71import Data.Binary (Binary(put, get), putWord8, getWord8, encode)
72−import qualified Data.ByteString as BSS (ByteString, concat)
72+import qualified Data.ByteString as BSS (ByteString, concat, copy)
73import qualified Data.ByteString.Lazy as BSL
73import qualified Data.ByteString.Lazy as BSL
74 ( ByteString
74 ( ByteString
75 , toChunks
75 , toChunks
76 , splitAt
76 , splitAt
77 , fromChunks
77 , fromChunks
78− , copy
79 )
78 )
79+import qualified Data.ByteString.Lazy.Internal as BSL (ByteString(..))
80import Data.Accessor (Accessor, accessor)
80import Data.Accessor (Accessor, accessor)
81import Control.Category ((>>>))
81import Control.Category ((>>>))
82import Control.Exception (Exception)
82import Control.Exception (Exception)
@@ -294,12 +294,20 @@ messageToPayload (Message fp enc) = encodeFingerprint fp : BSL.toChunks enc
294
294
295-- | Deserialize a message
295-- | Deserialize a message
296payloadToMessage :: [BSS.ByteString] -> Message
296payloadToMessage :: [BSS.ByteString] -> Message
297−payloadToMessage payload = Message fp (BSL.copy msg)
297+payloadToMessage payload = Message fp (copy msg)
298 where
298 where
299+ encFp :: BSL.ByteString
300+ msg :: BSL.ByteString
299 (encFp, msg) = BSL.splitAt (fromIntegral sizeOfFingerprint)
301 (encFp, msg) = BSL.splitAt (fromIntegral sizeOfFingerprint)
300 $ BSL.fromChunks payload
302 $ BSL.fromChunks payload
303+
304+ fp :: Fingerprint
301 fp = decodeFingerprint . BSS.concat . BSL.toChunks $ encFp
305 fp = decodeFingerprint . BSS.concat . BSL.toChunks $ encFp
302
306
307+ copy :: BSL.ByteString -> BSL.ByteString
308+ copy (BSL.Chunk bs BSL.Empty) = BSL.Chunk (BSS.copy bs) BSL.Empty
309+ copy bsl = BSL.fromChunks . return . BSS.concat . BSL.toChunks $ bsl
310+
303--------------------------------------------------------------------------------
311--------------------------------------------------------------------------------
304-- Node controller user-visible data types --
312-- Node controller user-visible data types --
305--------------------------------------------------------------------------------
313--------------------------------------------------------------------------------
@@ -410,7 +418,7 @@ data ProcessSignal =
410 | Died Identifier !DiedReason
418 | Died Identifier !DiedReason
411 | Spawn !(Closure (Process ())) !SpawnRef
419 | Spawn !(Closure (Process ())) !SpawnRef
412 | WhereIs !String
420 | WhereIs !String
413− | Register !String !(Maybe ProcessId) -- Nothing to unregister
421+ | Register !String !(Maybe ProcessId) -- Use 'Nothing' to unregister
414 | NamedSend !String !Message
422 | NamedSend !String !Message
415 deriving Show
423 deriving Show
416
424