@@ -23,7 +23,7 @@ import Data.Conduit.Network (bindPort)
2323#define bindPortTCP bindPort
2424#endif
2525import Network (sClose, Socket)
26−import Network.Socket (accept, SockAddr)
26+import Network.Socket (accept, withSocketsDo, SockAddr)
2727import qualified Network.Socket.ByteString as Sock
2828import Network.Wai
2929import qualified Network.Wai.Handler.Warp.Date as D
@@ -40,9 +40,7 @@ import Network.Wai.Handler.Warp.Types
4040import Data.IORef (IORef, newIORef, readIORef, writeIORef)
4141
4242#if WINDOWS
43−import qualified Control.Concurrent.MVar as MV
44−import Network.Socket (withSocketsDo)
45−import Control.Concurrent (forkIO)
43+import Network.Wai.Handler.Warp.Windows
4644#else
4745import System.Posix.IO (FdOption(CloseOnExec), setFdOption)
4846import Network.Socket (fdSocket)
@@ -77,26 +75,13 @@ run p = runSettings defaultSettings { settingsPort = p }
7775
7876-- | Run an 'Application' with the given 'Settings'.
7977runSettings :: Settings -> Application -> IO ()
80−#if WINDOWS
81−runSettings set app = withSocketsDo $ do
82− var <- MV.newMVar Nothing
83− let clean = MV.modifyMVar_ var $ \s -> maybe (return ()) sClose s >> return Nothing
84− void . forkIO $ bracket
85− (bindPortTCP (settingsPort set) (settingsHost set))
86− (const clean)
87− (\s -> do
88− MV.modifyMVar_ var (\_ -> return $ Just s)
89− runSettingsSocket set s app)
90− forever (threadDelay maxBound) `finally` clean
91−#else
92−runSettings set app =
78+runSettings set app = withSocketsDo $
9379 bracket
9480 (bindPortTCP (settingsPort set) (settingsHost set))
9581 sClose
9682 (\socket -> do
9783 setSocketCloseOnExec socket
9884 runSettingsSocket set socket app)
99−#endif
10085
10186-- | Same as 'runSettings', but uses a user-supplied socket instead of opening
10287-- one. This allows the user to provide, for example, Unix named socket, which
@@ -109,7 +94,11 @@ runSettingsSocket set socket app =
10994 runSettingsConnection set getConn app
11095 where
11196 getConn = do
97+#if WINDOWS
98+ (s, sa) <- windowsThreadBlockHack $ accept socket
99+#else
112100 (s, sa) <- accept socket
101+#endif
113102 setSocketCloseOnExec s
114103 conn <- socketConnection s
115104 return (conn, sa)