network-conduit 1.0.1 → 1.0.1.1
raw patch · 2 files changed
+29/−3 lines, 2 files
Files
- Data/Conduit/Network.hs +28/−2
- network-conduit.cabal +1/−1
Data/Conduit/Network.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Data.Conduit.Network ( -- * Basic utilities sourceSocket@@ -48,12 +49,31 @@ import Control.Monad (forever) import Control.Monad.Trans.Control (MonadBaseControl, control) import Control.Monad.Trans.Class (lift)-import Control.Concurrent (forkIO, threadDelay)+import Control.Concurrent (forkIO, threadDelay, newEmptyMVar, putMVar, takeMVar) import Data.Conduit.Network.Internal import Data.Conduit.Network.Utils (HostPreference) import qualified Data.Conduit.Network.Utils as Utils +#if defined(__GLASGOW_HASKELL__) && defined(mingw32_HOST_OS)+-- Socket recv and accept calls on Windows platform cannot be interrupted when compiled with -threaded.+-- See https://ghc.haskell.org/trac/ghc/ticket/5797 for details.+-- The following enables simple workaround+#define SOCKET_ACCEPT_RECV_WORKAROUND+#endif+++safeRecv :: Socket -> Int -> IO S.ByteString+#ifndef SOCKET_ACCEPT_RECV_WORKAROUND+safeRecv = recv+#else+safeRecv s buf = do+ var <- newEmptyMVar+ forkIO $ recv s buf `catch` (\(_::IOException) -> return S.empty) >>= putMVar var+ takeMVar var+#endif++ -- | Stream data from the socket. -- -- This function does /not/ automatically close the socket.@@ -64,7 +84,7 @@ loop where loop = do- bs <- lift $ liftIO $ recv socket 4096+ bs <- lift $ liftIO $ safeRecv socket 4096 if S.null bs then return () else yield bs >> loop@@ -202,7 +222,13 @@ -- Since 0.6.0 acceptSafe :: Socket -> IO (Socket, NS.SockAddr) acceptSafe socket =+#ifndef SOCKET_ACCEPT_RECV_WORKAROUND loop+#else+ do var <- newEmptyMVar+ forkIO $ loop >>= putMVar var+ takeMVar var+#endif where loop = NS.accept socket `catch` \(_ :: IOException) -> do
network-conduit.cabal view
@@ -1,5 +1,5 @@ Name: network-conduit-Version: 1.0.1+Version: 1.0.1.1 Synopsis: Stream socket data using conduits. Description: Stream socket data using conduits. License: BSD3