@@ -23,7 +23,7 @@ import Data.Conduit.Network (bindPort)
23#define bindPortTCP bindPort
23#define bindPortTCP bindPort
25import Network (sClose, Socket)
25import Network (sClose, Socket)
26−import Network.Socket (accept, SockAddr)
26+import Network.Socket (accept, withSocketsDo, SockAddr)
27import qualified Network.Socket.ByteString as Sock
27import qualified Network.Socket.ByteString as Sock
28import Network.Wai
28import Network.Wai
29import qualified Network.Wai.Handler.Warp.Date as D
29import qualified Network.Wai.Handler.Warp.Date as D
@@ -40,9 +40,7 @@ import Network.Wai.Handler.Warp.Types
40import Data.IORef (IORef, newIORef, readIORef, writeIORef)
40import Data.IORef (IORef, newIORef, readIORef, writeIORef)
42#if WINDOWS
42#if WINDOWS
43−import qualified Control.Concurrent.MVar as MV
43+import Network.Wai.Handler.Warp.Windows
44−import Network.Socket (withSocketsDo)
45−import Control.Concurrent (forkIO)
47import System.Posix.IO (FdOption(CloseOnExec), setFdOption)
45import System.Posix.IO (FdOption(CloseOnExec), setFdOption)
48import Network.Socket (fdSocket)
46import Network.Socket (fdSocket)
@@ -77,26 +75,13 @@ run p = runSettings defaultSettings { settingsPort = p }
78-- | Run an 'Application' with the given 'Settings'.
76-- | Run an 'Application' with the given 'Settings'.
79runSettings :: Settings -> Application -> IO ()
77runSettings :: Settings -> Application -> IO ()
81−runSettings set app = withSocketsDo $ do
78+runSettings set app = withSocketsDo $
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))
88− MV.modifyMVar_ var (\_ -> return $ Just s)
89− runSettingsSocket set s app)
90− forever (threadDelay maxBound) `finally` clean
94 (bindPortTCP (settingsPort set) (settingsHost set))
80 (bindPortTCP (settingsPort set) (settingsHost set))
96 (\socket -> do
82 (\socket -> do
97 setSocketCloseOnExec socket
83 setSocketCloseOnExec socket
98 runSettingsSocket set socket app)
84 runSettingsSocket set socket app)
101-- | Same as 'runSettings', but uses a user-supplied socket instead of opening
86-- | Same as 'runSettings', but uses a user-supplied socket instead of opening
102-- one. This allows the user to provide, for example, Unix named socket, which
87-- one. This allows the user to provide, for example, Unix named socket, which
@@ -109,7 +94,11 @@ runSettingsSocket set socket app =
109 runSettingsConnection set getConn app
94 runSettingsConnection set getConn app
111 getConn = do
96 getConn = do
98+ (s, sa) <- windowsThreadBlockHack $ accept socket
112 (s, sa) <- accept socket
100 (s, sa) <- accept socket
113 setSocketCloseOnExec s
102 setSocketCloseOnExec s
114 conn <- socketConnection s
103 conn <- socketConnection s
115 return (conn, sa)
104 return (conn, sa)