network 3.2.4.0 → 3.2.5.0
raw patch · 5 files changed
+77/−28 lines, 5 files
Files
- CHANGELOG.md +5/−0
- Network/Socket/Shutdown.hs +61/−17
- configure +9/−9
- configure.ac +1/−1
- network.cabal +1/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+## Version 3.2.5.0++* `gracefulClose` based on STM racing and `timeout`.+ [#587](https://github.com/haskell/network/issues/587)+ ## Version 3.2.4.0 * New API: setSockOptValue.
Network/Socket/Shutdown.hs view
@@ -8,14 +8,20 @@ , gracefulClose ) where +import Control.Concurrent (yield) import qualified Control.Exception as E import Foreign.Marshal.Alloc (mallocBytes, free)+import System.Timeout -import Control.Concurrent (threadDelay, yield)+#if !defined(mingw32_HOST_OS)+import Control.Concurrent.STM+import qualified GHC.Event as Ev+#endif import Network.Socket.Buffer import Network.Socket.Imports import Network.Socket.Internal+import Network.Socket.STM import Network.Socket.Types data ShutdownCmd = ShutdownReceive@@ -59,19 +65,57 @@ -- FIN arrives meanwhile. yield -- Waiting TCP FIN.- E.bracket (mallocBytes bufSize) free recvEOFloop- recvEOFloop buf = loop 1 0- where- loop delay tmout = do- -- We don't check the (positive) length.- -- In normal case, it's 0. That is, only FIN is received.- -- In error cases, data is available. But there is no- -- application which can read it. So, let's stop receiving- -- to prevent attacks.- r <- recvBufNoWait s buf bufSize- when (r == -1 && tmout < tmout0) $ do- threadDelay (delay * 1000)- loop (delay * 2) (tmout + delay)- -- Don't use 4092 here. The GHC runtime takes the global lock- -- if the length is over 3276 bytes in 32bit or 3272 bytes in 64bit.- bufSize = 1024+ E.bracket (mallocBytes bufSize) free (recvEOF s tmout0)++recvEOF :: Socket -> Int -> Ptr Word8 -> IO ()+#if !defined(mingw32_HOST_OS)+recvEOF s tmout0 buf = do+ mevmgr <- Ev.getSystemEventManager+ case mevmgr of+ Nothing -> recvEOFloop s tmout0 buf+ Just _ -> recvEOFevent s tmout0 buf+#else+recvEOF = recvEOFloop+#endif++-- Don't use 4092 here. The GHC runtime takes the global lock+-- if the length is over 3276 bytes in 32bit or 3272 bytes in 64bit.+bufSize :: Int+bufSize = 1024++recvEOFloop :: Socket -> Int -> Ptr Word8 -> IO ()+recvEOFloop s tmout0 buf = void $ timeout tmout0 $ recvBuf s buf bufSize++#if !defined(mingw32_HOST_OS)+data Wait = MoreData | TimeoutTripped++recvEOFevent :: Socket -> Int -> Ptr Word8 -> IO ()+recvEOFevent s tmout0 buf = do+ tmmgr <- Ev.getSystemTimerManager+ tvar <- newTVarIO False+ E.bracket (setup tmmgr tvar) teardown $ \(wait, _) -> do+ waitRes <- wait+ case waitRes of+ TimeoutTripped -> return ()+ -- We don't check the (positive) length.+ -- In normal case, it's 0. That is, only FIN is received.+ -- In error cases, data is available. But there is no+ -- application which can read it. So, let's stop receiving+ -- to prevent attacks.+ MoreData -> void $ recvBufNoWait s buf bufSize+ where+ setup tmmgr tvar = do+ -- millisecond to microsecond+ key <- Ev.registerTimeout tmmgr (tmout0 * 1000) $+ atomically $ writeTVar tvar True+ (evWait, evCancel) <- waitAndCancelReadSocketSTM s+ let toWait = do+ tmout <- readTVar tvar+ check tmout+ toCancel = Ev.unregisterTimeout tmmgr key+ wait = atomically ((toWait >> return TimeoutTripped)+ <|> (evWait >> return MoreData))+ cancel = evCancel >> toCancel+ return (wait, cancel)+ teardown (_, cancel) = cancel+#endif
configure view
@@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.72 for Haskell network package 3.2.4.0.+# Generated by GNU Autoconf 2.72 for Haskell network package 3.2.5.0. # # Report bugs to <libraries@haskell.org>. #@@ -603,8 +603,8 @@ # Identity of this package. PACKAGE_NAME='Haskell network package' PACKAGE_TARNAME='network'-PACKAGE_VERSION='3.2.4.0'-PACKAGE_STRING='Haskell network package 3.2.4.0'+PACKAGE_VERSION='3.2.5.0'+PACKAGE_STRING='Haskell network package 3.2.5.0' PACKAGE_BUGREPORT='libraries@haskell.org' PACKAGE_URL='' @@ -1258,7 +1258,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF-'configure' configures Haskell network package 3.2.4.0 to adapt to many kinds of systems.+'configure' configures Haskell network package 3.2.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1324,7 +1324,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in- short | recursive ) echo "Configuration of Haskell network package 3.2.4.0:";;+ short | recursive ) echo "Configuration of Haskell network package 3.2.5.0:";; esac cat <<\_ACEOF @@ -1409,7 +1409,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF-Haskell network package configure 3.2.4.0+Haskell network package configure 3.2.5.0 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc.@@ -1809,7 +1809,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Haskell network package $as_me 3.2.4.0, which was+It was created by Haskell network package $as_me 3.2.5.0, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw@@ -4699,7 +4699,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log="-This file was extended by Haskell network package $as_me 3.2.4.0, which was+This file was extended by Haskell network package $as_me 3.2.5.0, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES@@ -4754,7 +4754,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\-Haskell network package config.status 3.2.4.0+Haskell network package config.status 3.2.5.0 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\"
configure.ac view
@@ -1,5 +1,5 @@ AC_INIT([Haskell network package],- [3.2.4.0],+ [3.2.5.0], [libraries@haskell.org], [network])
network.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: network-version: 3.2.4.0+version: 3.2.5.0 license: BSD3 license-file: LICENSE maintainer: Kazu Yamamoto, Tamar Christina