try to gather scattered writes
git upload-pack makes some uncessary writes in sequence, this tries to gather them together to avoid needing to send multiple DATA packets when just one will do. In a small pull, this reduces the average number of DATA packets from 4.5 to 2.5.
This commit is contained in:
parent
9c311fb564
commit
ae69ebfc7c
1 changed files with 28 additions and 6 deletions
|
@ -5,7 +5,7 @@
|
||||||
- Licensed under the GNU GPL version 3 or higher.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
{-# LANGUAGE RankNTypes #-}
|
{-# LANGUAGE RankNTypes, CPP #-}
|
||||||
|
|
||||||
module Remote.Helper.P2P.IO
|
module Remote.Helper.P2P.IO
|
||||||
( RunProto
|
( RunProto
|
||||||
|
@ -179,9 +179,31 @@ relayReader :: MVar RelayData -> Handle -> IO ()
|
||||||
relayReader v hout = loop
|
relayReader v hout = loop
|
||||||
where
|
where
|
||||||
loop = do
|
loop = do
|
||||||
b <- B.hGetSome hout 65536
|
bs <- getsome []
|
||||||
if B.null b
|
case bs of
|
||||||
then return ()
|
[] -> return ()
|
||||||
else do
|
_ -> do
|
||||||
putMVar v $ RelayToPeer (L.fromChunks [b])
|
putMVar v $ RelayToPeer (L.fromChunks bs)
|
||||||
loop
|
loop
|
||||||
|
|
||||||
|
-- Waiit for the first available chunk. Then, without blocking,
|
||||||
|
-- try to get more chunks, in case a stream of chunks is being
|
||||||
|
-- written in close succession.
|
||||||
|
--
|
||||||
|
-- On Windows, hGetNonBlocking is broken, so avoid using it there.
|
||||||
|
getsome [] = do
|
||||||
|
b <- B.hGetSome hout chunk
|
||||||
|
if B.null b
|
||||||
|
then return []
|
||||||
|
#ifndef mingw32_HOST_OS
|
||||||
|
else getsome [b]
|
||||||
|
#else
|
||||||
|
else return [b]
|
||||||
|
#endif
|
||||||
|
getsome bs = do
|
||||||
|
b <- B.hGetNonBlocking hout chunk
|
||||||
|
if B.null b
|
||||||
|
then return (reverse bs)
|
||||||
|
else getsome (b:bs)
|
||||||
|
|
||||||
|
chunk = 65536
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue