Skip to content

Commit 317ab6a

Browse files
committed
Merge PR #448.
2 parents 7cbbdb5 + 05afe85 commit 317ab6a

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

Network/Socket.hs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,19 @@
5252
-- > , addrSocketType = Stream
5353
-- > }
5454
-- > head <$> getAddrInfo (Just hints) mhost (Just port)
55-
-- > open addr = do
56-
-- > sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
55+
-- > open addr = E.bracketOnError (openSocket addr) close $ \sock -> do
5756
-- > setSocketOption sock ReuseAddr 1
5857
-- > withFdSocket sock setCloseOnExecIfNeeded
5958
-- > bind sock $ addrAddress addr
6059
-- > listen sock 1024
6160
-- > return sock
62-
-- > loop sock = forever $ do
63-
-- > (conn, _peer) <- accept sock
64-
-- > void $ forkFinally (server conn) (const $ gracefulClose conn 5000)
61+
-- > loop sock = forever $ E.bracketOnError (accept sock) (close . fst)
62+
-- > $ \(conn, _peer) -> void $
63+
-- > -- 'forkFinally' alone is unlikely to fail thus leaking @conn@,
64+
-- > -- but 'E.bracketOnError' above will be necessary if some
65+
-- > -- non-atomic setups (e.g. spawning a subprocess to handle
66+
-- > -- @conn@) before proper cleanup of @conn@ is your case
67+
-- > forkFinally (server conn) (const $ gracefulClose conn 5000)
6568
--
6669
-- > {-# LANGUAGE OverloadedStrings #-}
6770
-- > -- Echo client program
@@ -88,8 +91,7 @@
8891
-- > resolve = do
8992
-- > let hints = defaultHints { addrSocketType = Stream }
9093
-- > head <$> getAddrInfo (Just hints) (Just host) (Just port)
91-
-- > open addr = do
92-
-- > sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
94+
-- > open addr = E.bracketOnError (openSocket addr) close $ \sock -> do
9395
-- > connect sock $ addrAddress addr
9496
-- > return sock
9597
--

examples/EchoClient.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ runTCPClient host port client = withSocketsDo $ do
2323
resolve = do
2424
let hints = defaultHints { addrSocketType = Stream }
2525
head <$> getAddrInfo (Just hints) (Just host) (Just port)
26-
open addr = do
27-
sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
26+
open addr = E.bracketOnError (openSocket addr) close $ \sock -> do
2827
connect sock $ addrAddress addr
2928
return sock

examples/EchoServer.hs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,16 @@ runTCPServer mhost port server = withSocketsDo $ do
2929
, addrSocketType = Stream
3030
}
3131
head <$> getAddrInfo (Just hints) mhost (Just port)
32-
open addr = do
33-
sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
32+
open addr = E.bracketOnError (openSocket addr) close $ \sock -> do
3433
setSocketOption sock ReuseAddr 1
3534
withFdSocket sock setCloseOnExecIfNeeded
3635
bind sock $ addrAddress addr
3736
listen sock 1024
3837
return sock
39-
loop sock = forever $ do
40-
(conn, _peer) <- accept sock
41-
void $ forkFinally (server conn) (const $ gracefulClose conn 5000)
38+
loop sock = forever $ E.bracketOnError (accept sock) (close . fst)
39+
$ \(conn, _peer) -> void $
40+
-- 'forkFinally' alone is unlikely to fail thus leaking @conn@,
41+
-- but 'E.bracketOnError' above will be necessary if some
42+
-- non-atomic setups (e.g. spawning a subprocess to handle
43+
-- @conn@) before proper cleanup of @conn@ is your case
44+
forkFinally (server conn) (const $ gracefulClose conn 5000)

0 commit comments

Comments
 (0)