network-run 0.2.4 → 0.2.5
raw patch · 3 files changed
+25/−4 lines, 3 files
Files
- CHANGELOG.md +3/−2
- Network/Run/TCP.hs +21/−1
- network-run.cabal +1/−1
CHANGELOG.md view
@@ -1,5 +1,6 @@ # Revision history for network-run -## 0.0.0+## 0.2.5 -* First version.+* Making accept breakable on windows+ [#2](https://github.com/kazu-yamamoto/network-run/pull/2)
Network/Run/TCP.hs view
@@ -11,6 +11,11 @@ import qualified Control.Exception as E import Control.Monad (forever, void) import Network.Socket+#if defined(mingw32_HOST_OS)+import Control.Concurrent.MVar+import Control.Concurrent+import qualified Control.Exception+#endif import Network.Run.Core @@ -37,10 +42,25 @@ open addr = E.bracketOnError (openServerSocket addr) close $ \sock -> do listen sock 1024 return sock- loop sock = forever $ E.bracketOnError (accept sock) (close . fst) $+ loop sock = forever $ E.bracketOnError (windowsThreadBlockHack (accept sock)) (close . fst) $ \(conn, _peer) -> #if MIN_VERSION_network(3,1,1) void $ forkFinally (server conn) (const $ gracefulClose conn 5000) #else void $ forkFinally (server conn) (const $ close conn)+#endif+++#if defined(mingw32_HOST_OS)+windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack act = do+ var <- newEmptyMVar :: IO (MVar (Either Control.Exception.SomeException a))+ void . forkIO $ Control.Exception.try act >>= putMVar var+ res <- takeMVar var+ case res of+ Left e -> Control.Exception.throwIO e+ Right r -> return r+#else+windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack = id #endif
network-run.cabal view
@@ -1,5 +1,5 @@ name: network-run-version: 0.2.4+version: 0.2.5 synopsis: Simple network runner library description: Simple functions to run network clients and servers. -- bug-reports: