packages feed

warp 2.1.5 → 2.1.5.1

raw patch · 5 files changed

+36/−20 lines, 5 files

Files

Network/Wai/Handler/Warp/Recv.hs view
@@ -21,6 +21,7 @@  #ifdef mingw32_HOST_OS import GHC.IO.FD (FD(..), readRawBufferPtr)+import Network.Wai.Handler.Warp.Windows #endif  ----------------------------------------------------------------@@ -47,7 +48,7 @@ #endif receiveloop sock buf size = do #ifdef mingw32_HOST_OS-    bytes <- fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size+    bytes <- windowsThreadBlockHack $ fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size #else     bytes <- c_recv sock buf size 0 #endif
Network/Wai/Handler/Warp/Run.hs view
@@ -23,7 +23,7 @@ #define bindPortTCP bindPort #endif import Network (sClose, Socket)-import Network.Socket (accept, SockAddr)+import Network.Socket (accept, withSocketsDo, SockAddr) import qualified Network.Socket.ByteString as Sock import Network.Wai import qualified Network.Wai.Handler.Warp.Date as D@@ -40,9 +40,7 @@ import Data.IORef (IORef, newIORef, readIORef, writeIORef)  #if WINDOWS-import qualified Control.Concurrent.MVar as MV-import Network.Socket (withSocketsDo)-import Control.Concurrent (forkIO)+import Network.Wai.Handler.Warp.Windows #else import System.Posix.IO (FdOption(CloseOnExec), setFdOption) import Network.Socket (fdSocket)@@ -77,26 +75,13 @@  -- | Run an 'Application' with the given 'Settings'. runSettings :: Settings -> Application -> IO ()-#if WINDOWS-runSettings set app = withSocketsDo $ do-    var <- MV.newMVar Nothing-    let clean = MV.modifyMVar_ var $ \s -> maybe (return ()) sClose s >> return Nothing-    void . forkIO $ bracket-        (bindPortTCP (settingsPort set) (settingsHost set))-        (const clean)-        (\s -> do-            MV.modifyMVar_ var (\_ -> return $ Just s)-            runSettingsSocket set s app)-    forever (threadDelay maxBound) `finally` clean-#else-runSettings set app =+runSettings set app = withSocketsDo $     bracket         (bindPortTCP (settingsPort set) (settingsHost set))         sClose         (\socket -> do             setSocketCloseOnExec socket             runSettingsSocket set socket app)-#endif  -- | Same as 'runSettings', but uses a user-supplied socket instead of opening -- one. This allows the user to provide, for example, Unix named socket, which@@ -109,7 +94,11 @@     runSettingsConnection set getConn app   where     getConn = do+#if WINDOWS+        (s, sa) <- windowsThreadBlockHack $ accept socket+#else         (s, sa) <- accept socket+#endif         setSocketCloseOnExec s         conn <- socketConnection s         return (conn, sa)
+ Network/Wai/Handler/Warp/Windows.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE CPP #-}+module Network.Wai.Handler.Warp.Windows+  ( windowsThreadBlockHack+  ) where++#if WINDOWS+import Control.Exception+import Control.Concurrent.MVar+import Control.Concurrent+import Control.Monad++windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack act = +  do+    var <- newEmptyMVar :: IO (MVar (Either SomeException a))+    void . forkIO $ try act >>= putMVar var+    res <- takeMVar var+    case res of+      Left  e -> throwIO e+      Right r -> return r+#else+windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack = id+#endif
test/RunSpec.hs view
@@ -77,6 +77,7 @@  nextPort :: I.IORef Int nextPort = unsafePerformIO $ I.newIORef 5000+{-# NOINLINE nextPort #-}  getPort :: IO Int getPort = do
warp.cabal view
@@ -1,5 +1,5 @@ Name:                warp-Version:             2.1.5+Version:             2.1.5.1 Synopsis:            A fast, light-weight web server for WAI applications. License:             MIT License-file:        LICENSE@@ -81,6 +81,7 @@                      Network.Wai.Handler.Warp.Settings                      Network.Wai.Handler.Warp.Thread                      Network.Wai.Handler.Warp.Types+                     Network.Wai.Handler.Warp.Windows                      Paths_warp   Ghc-Options:       -Wall