base 4.18.2.1 → 4.18.3.0
raw patch · 4 files changed
+20/−9 lines, 4 filesnew-uploaderPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- GHC/Conc/Sync.hs +3/−3
- GHC/Event/KQueue.hsc +12/−5
- base.cabal +1/−1
- changelog.md +4/−0
GHC/Conc/Sync.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE RankNTypes #-}@@ -392,13 +391,14 @@ getNumProcessors = fmap fromIntegral c_getNumberOfProcessors foreign import ccall unsafe "getNumberOfProcessors"- c_getNumberOfProcessors :: IO CUInt+ c_getNumberOfProcessors :: IO Word32 -- | Returns the number of sparks currently in the local spark pool numSparks :: IO Int numSparks = IO $ \s -> case numSparks# s of (# s', n #) -> (# s', I# n #) -foreign import ccall "&enabled_capabilities" enabled_capabilities :: Ptr CInt+foreign import ccall "&enabled_capabilities"+ enabled_capabilities :: Ptr Word32 childHandler :: SomeException -> IO () childHandler err = catch (real_handler err) childHandler
GHC/Event/KQueue.hsc view
@@ -44,8 +44,8 @@ import GHC.Real (quotRem, fromIntegral) import GHC.Show (Show(show)) import GHC.Event.Internal (Timeout(..))-import System.Posix.Internals (c_close)-import System.Posix.Types (Fd(..))+import System.Posix.Internals (c_close, c_getpid)+import System.Posix.Types (Fd(..), CPid) import qualified GHC.Event.Array as A #if defined(netbsd_HOST_OS)@@ -73,19 +73,26 @@ data KQueue = KQueue { kqueueFd :: {-# UNPACK #-} !KQueueFd , kqueueEvents :: {-# UNPACK #-} !(A.Array Event)+ , kqueuePid :: {-# UNPACK #-} !CPid -- ^ pid, used to detect forks } new :: IO E.Backend new = do kqfd <- kqueue events <- A.new 64- let !be = E.backend poll modifyFd modifyFdOnce delete (KQueue kqfd events)+ pid <- c_getpid+ let !be = E.backend poll modifyFd modifyFdOnce delete (KQueue kqfd events pid) return be delete :: KQueue -> IO () delete kq = do- _ <- c_close . fromKQueueFd . kqueueFd $ kq- return ()+ -- detect forks: the queue isn't inherited by a child process created with+ -- fork. Hence we mustn't try to close the old fd or we might close a random+ -- one (e.g. the one used by timerfd, cf #24672).+ pid <- c_getpid+ when (pid == kqueuePid kq) $ do+ _ <- c_close . fromKQueueFd . kqueueFd $ kq+ return () modifyFd :: KQueue -> Fd -> E.Event -> E.Event -> IO Bool modifyFd kq fd oevt nevt = do
base.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: base-version: 4.18.2.1+version: 4.18.3.0 -- NOTE: Don't forget to update ./changelog.md license: BSD-3-Clause
changelog.md view
@@ -1,5 +1,9 @@ # Changelog for [`base` package](http://hackage.haskell.org/package/base) +## 4.18.3.0 *January 2025*+ * Shipped with GHC 9.6.7.+ * Fix interaction between `fork` and the `kqueue`-based IO manager ([#24672](https://gitlab.haskell.org/ghc/ghc/-/issues/24672)).+ ## 4.18.2.1 *April 2024* * Various documentation improvements