packages feed

blockio 0.1.0.1 → 0.1.1.0

raw patch · 6 files changed

+85/−10 lines, 6 filesdep ~unixPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: unix

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,8 +1,15 @@ # Revision history for blockio +## 0.1.1.0 -- 2025-12-03++* NON-BREAKING: Support `unix-2.8.6` by vendoring code related to file caching+  from the `unix` package. See PR+  [#805](https://github.com/IntersectMBO/lsm-tree/pull/805).+ ## 0.1.0.1 -- 2025-07-15 -* Include the README in the distributed files.+* PATCH: Include the README in the distributed files. See PR+  [#787](https://github.com/IntersectMBO/lsm-tree/pull/787).  ## 0.1.0.0 -- 2025-07-15 
blockio.cabal view
@@ -1,6 +1,6 @@ cabal-version:   3.4 name:            blockio-version:         0.1.0.1+version:         0.1.1.0 synopsis:        Perform batches of disk I/O operations. description:   Perform batches of disk I\/O operations. Performing batches of disk I\/O can@@ -46,7 +46,7 @@   type:     git   location: https://github.com/IntersectMBO/lsm-tree   subdir:   blockio-  tag:      blockio-0.1.0.1+  tag:      blockio-0.1.1.0  common warnings   ghc-options:@@ -93,8 +93,10 @@    if os(linux)     hs-source-dirs: src-linux-    other-modules:  System.FS.BlockIO.Internal-    build-depends:  unix ^>=2.8.7+    build-depends:  unix ^>=2.8.6+    other-modules:+      System.FS.BlockIO.Internal+      System.FS.BlockIO.Internal.Fcntl      if !flag(serialblockio)       other-modules: System.FS.BlockIO.Async@@ -102,8 +104,10 @@    elif os(osx)     hs-source-dirs: src-macos-    build-depends:  unix ^>=2.8.7-    other-modules:  System.FS.BlockIO.Internal+    build-depends:  unix ^>=2.8.6+    other-modules:+      System.FS.BlockIO.Internal+      System.FS.BlockIO.Internal.Fcntl    elif os(windows)     hs-source-dirs: src-windows
src-linux/System/FS/BlockIO/Internal.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-}- module System.FS.BlockIO.Internal (     ioHasBlockIO   ) where@@ -7,10 +6,12 @@ import qualified System.FS.API as FS import           System.FS.API (FsPath, Handle (..), HasFS) import           System.FS.BlockIO.API (Advice (..), FileOffset, HasBlockIO)+import qualified System.FS.BlockIO.Internal.Fcntl as Fcntl import qualified System.FS.BlockIO.IO.Internal as IOI import           System.FS.IO (HandleIO) import qualified System.FS.IO.Handle as FS-import qualified System.Posix.Fcntl as Fcntl+import qualified System.Posix.Fcntl as Fcntl (Advice (..), fileAdvise,+                     fileAllocate) import qualified System.Posix.Files as Unix import qualified System.Posix.Unistd as Unix 
+ src-linux/System/FS/BlockIO/Internal/Fcntl.hsc view
@@ -0,0 +1,38 @@+{-# LANGUAGE CPP #-}+-- | Compatibility layer for the @unix@ package to provide a @fileSetCaching@ function.+--+-- @unix >= 2.8.7@ defines a @fileSetCaching@ function, but @unix < 2.8.7@ does not. This module defines the function for @unix@ versions @< 2.8.7@. The implementation is adapted from https://github.com/haskell/unix/blob/v2.8.8.0/System/Posix/Fcntl.hsc#L116-L182.+--+-- NOTE: in the future if we no longer support @unix@ versions @< 2.8.7@, then this module can be removed.+module System.FS.BlockIO.Internal.Fcntl (fileSetCaching) where++#if MIN_VERSION_unix(2,8,7)++import System.Posix.Fcntl (fileSetCaching)++#else++-- hsc2hs does not define _GNU_SOURCE, so a .hsc file must define it explicitly+-- or O_DIRECT stays hidden. The unix package doesn’t define it in source, but+-- its configure script calls AC_USE_SYSTEM_EXTENSIONS, which adds -D_GNU_SOURCE+-- to the build CFLAGS, and those flags are passed on to hsc2hs through the+-- generated `config.mk`.+#define _GNU_SOURCE++#include <fcntl.h>++import           Data.Bits (complement, (.&.), (.|.))+import           Foreign.C (throwErrnoIfMinus1, throwErrnoIfMinus1_)+import           System.Posix.Internals+import           System.Posix.Types (Fd (Fd))++-- | For simplification, we considered that Linux !HAS_F_NOCACHE and HAS_O_DIRECT+fileSetCaching :: Fd -> Bool -> IO ()+fileSetCaching (Fd fd) val = do+    r <- throwErrnoIfMinus1 "fileSetCaching" (c_fcntl_read fd #{const F_GETFL})+    let r' | val       = fromIntegral r .&. complement opt_val+           | otherwise = fromIntegral r .|. opt_val+    throwErrnoIfMinus1_ "fileSetCaching" (c_fcntl_write fd #{const F_SETFL} r')+  where+    opt_val = #{const O_DIRECT}+#endif
src-macos/System/FS/BlockIO/Internal.hs view
@@ -5,11 +5,11 @@ import qualified System.FS.API as FS import           System.FS.API (FsPath, Handle (..), HasFS) import           System.FS.BlockIO.API (Advice (..), FileOffset, HasBlockIO)+import qualified System.FS.BlockIO.Internal.Fcntl as Unix import qualified System.FS.BlockIO.IO.Internal as IOI import qualified System.FS.BlockIO.Serial as Serial import           System.FS.IO (HandleIO) import qualified System.FS.IO.Handle as FS-import qualified System.Posix.Fcntl as Unix import qualified System.Posix.Files as Unix import qualified System.Posix.Unistd as Unix 
+ src-macos/System/FS/BlockIO/Internal/Fcntl.hsc view
@@ -0,0 +1,25 @@+{-# LANGUAGE CPP #-}+-- | Compatibility layer for the @unix@ package to provide a @fileSetCaching@ function.+--+-- @unix >= 2.8.7@ defines a @fileSetCaching@ function, but @unix < 2.8.7@ does not. This module defines the function for @unix@ versions @< 2.8.7@. The implementation is adapted from https://github.com/haskell/unix/blob/v2.8.8.0/System/Posix/Fcntl.hsc#L116-L182.+--+-- NOTE: in the future if we no longer support @unix@ versions @< 2.8.7@, then this module can be removed.+module System.FS.BlockIO.Internal.Fcntl (fileSetCaching) where++#if MIN_VERSION_unix(2,8,7)++import System.Posix.Fcntl (fileSetCaching)++#else++#include <fcntl.h>++import           Foreign.C (throwErrnoIfMinus1_)+import           System.Posix.Internals+import           System.Posix.Types (Fd (Fd))++-- | For simplification, we considered that MacOS HAS_F_NOCACHE and !HAS_O_DIRECT+fileSetCaching :: Fd -> Bool -> IO ()+fileSetCaching (Fd fd) val = do+    throwErrnoIfMinus1_ "fileSetCaching" (c_fcntl_write fd #{const F_NOCACHE} (if val then 0 else 1))+#endif