git.iko.soy/distributed-process
on master help sign in
use vectored IO rather than mapM to send size header with message
32e3b04Adam C. Foltzer
network-transport/src/Network/Transport/TCP.hs+3−8
@@ -115,18 +115,13 @@ mkSourceEnd host service chanId = withSocketsDo $ do
115 sock <- socket (addrFamily serverAddr) Stream defaultProtocol
115 sock <- socket (addrFamily serverAddr) Stream defaultProtocol
116 setSocketOption sock ReuseAddr 1
116 setSocketOption sock ReuseAddr 1
117 N.connect sock (addrAddress serverAddr)
117 N.connect sock (addrAddress serverAddr)
118−-- let sink = sinkSocket sock :: Sink ByteString IO ()
119 NBS.sendAll sock $ encode (fromIntegral chanId :: Int64)
118 NBS.sendAll sock $ encode (fromIntegral chanId :: Int64)
120 return SourceEnd
119 return SourceEnd
121 { send = {-# SCC "send" #-} \bss -> do
120 { send = {-# SCC "send" #-} \bss -> do
122 let size = fromIntegral (sum . map BS.length $ bss) :: Int64
121 let size = fromIntegral (sum . map BS.length $ bss) :: Int64
123− if size < 255
124− then
125− NBS.sendAll sock (encode (fromIntegral size :: Word8))
122+ sizeStr | size < 255 = encode (fromIntegral size :: Word8)
126− else do
123+ | otherwise = BS.cons 255 (encode size)
127− NBS.sendAll sock (encode (255 :: Word8))
128− NBS.sendAll sock (encode size)
129− mapM_ (NBS.sendAll sock) bss
124+ NBS.sendMany sock (sizeStr:bss)
130 , closeSourceEnd = {-# SCC "closeSourceEnd" #-} sClose sock
125 , closeSourceEnd = {-# SCC "closeSourceEnd" #-} sClose sock
131 }
126 }
132
127