avsm · GitHub

avsm

@avsm

@avsm avsm changed the title add ftruncate/fdatasync and use uring for fsync add ftruncate/fdatasync and use uring for fsync/shutdown/socket

Jun 10, 2026

@avsm

@talex5

@avsm

@avsm avsm mentioned this pull request

Jul 7, 2026

Open

@avsm avsm changed the title add ftruncate/fdatasync and use uring for fsync/shutdown/socket add ftruncate/fdatasync and use uring for fsync/shutdown/socket/bind/listen

Jul 7, 2026

This was referenced

Jul 13, 2026

Merged

Merged

@avsm @talex5

@talex5

Avoids having to match on `Eio.Exn.X` to detect when a file-system
doesn't support `fallocate`, etc.

@talex5

@avsm

avsm deleted the new-uring branch

July 17, 2026 10:09

Merged

talex5 added a commit to talex5/opam-repository that referenced this pull request

Jul 23, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

talex5 added a commit to talex5/opam-repository that referenced this pull request

Jul 24, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

talex5 added a commit to talex5/opam-repository that referenced this pull request

Jul 24, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

craff pushed a commit to craff/opam-repository that referenced this pull request

Jul 25, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

craff pushed a commit to craff/opam-repository that referenced this pull request

Jul 25, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

craff pushed a commit to craff/opam-repository that referenced this pull request

Jul 25, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

craff pushed a commit to craff/opam-repository that referenced this pull request

Jul 27, 2026
CHANGES:
Breaking changes:
- Report errors from `Net.getaddrinfo` (@talex5 @haesbaert @avsm ocaml-multicore/eio#866 ocaml-multicore/eio#900).
  Before, `Net.getaddrinfo` returned `[]` on error. It now raises an exception with the actual error.
New features:
- Add `Eio.Net.Sockopt` for setting/getting socket options (@avsm @talex5 @anmonteiro ocaml-multicore/eio#858 ocaml-multicore/eio#575 ocaml-multicore/eio#859 ocaml-multicore/eio#874 ocaml-multicore/eio#876 ocaml-multicore/eio#889 ocaml-multicore/eio#891).
  This includes all the options from OCaml's `Unix` module, plus many more (e.g. `TCP_KEEPINTVL`).
- Support `TCP_KEEPIDLE` socket option on macOS (@avsm @talex5 ocaml-multicore/eio#890).
- Add `Path.chmod` (@patricoferris @webbunivAdmin @avsm @talex5 ocaml-multicore/eio#785 ocaml-multicore/eio#872).
- Add `Path.chown` (@patricoferris @avsm @talex5 ocaml-multicore/eio#781 ocaml-multicore/eio#864 ocaml-multicore/eio#877).
- Add `Path.with_dir_entries` for incremental directory reading (@patricoferris @talex5 @avsm ocaml-multicore/eio#821 ocaml-multicore/eio#897).
  This also provides the type of each entry, saving one `stat` per entry in most cases.
- Add `Eio_unix.Pty` for pseudoterminal support (@avsm @talex5 @patricoferris @RyanGibb ocaml-multicore/eio#531).
  The `Pty` module can be used to create and configure pseudoterminals,
  `Eio_unix.Process.spawn_unix ?login_tty ...` allows connecting them up when spawning a child process.
- Add `missing_ok` to `Eio.Path.unlink` (ocaml-multicore/eio#828) (@vog @patricoferris ocaml-multicore/eio#833).
- Add `Flow.null` sink/source (@avsm @talex5 ocaml-multicore/eio#894, suggested by @jonsterling).
  This can be used as sink that consumes and discards all data written to it until end-of-file,
  and as a source that immediately returns end-of-file.
- Add `Eio_unix.Process.spawn_unix ?uid ?gid ?pgid` options (@patricoferris @talex5 ocaml-multicore/eio#802 ocaml-multicore/eio#803).
  Allows setting the user ID, group ID and process group of the child.
- Add `Eio_unix.Stdenv.override` for updating environments (@patricoferris @talex5 ocaml-multicore/eio#823).
- Add `Eio_unix.Err` module (@talex5 ocaml-multicore/eio#887).
  This is convenient whenever wrapping a function that raises `Unix_error`.
Linux backend:
- eio_linux now requires Linux 5.18 or later. On older kernels, `Eio_main.run` will use eio_posix instead.
- Add `Low_level.{socket,bind,listen}` with uring support (@avsm @talex5 ocaml-multicore/eio#884).
- Add `ftruncate`/`fdatasync` and use uring for `fsync`/`shutdown` (@avsm @talex5 ocaml-multicore/eio#850).
- Switch `fstat` to `statx` on linux and fetch `blksize` (@avsm @talex5 ocaml-multicore/eio#865).
- uring: update min to 2.15.0+ so we can use new functionality (@avsm ocaml-multicore/eio#867).
- Add `Eio_linux.Low_level.Fixed` (@talex5 ocaml-multicore/eio#848).
  This replaces the `Uring.Region` API.
- eio_linux: use `IORING_SETUP_SINGLE_ISSUER` (@talex5 ocaml-multicore/eio#841).
  This hints to uring to do some locking optimisations assuming that each ring is only written by one thread.
- eio_linux: use `IORING_SETUP_DEFER_TASKRUN` for performance (@talex5 ocaml-multicore/eio#842).
Bug fixes:
- Allow `Eio.Path.load` to handle files with zero size (@patricoferris @talex5 ocaml-multicore/eio#869 ocaml-multicore/eio#878, reported by @copy and @vog).
  This is useful for loading files in `/proc/` on Linux.
- `Eio.Process`: match Unix search behaviour (@talex5 ocaml-multicore/eio#820).
  Don't search `$PATH` if the name contains a `/`.
- eio_posix: on macOS, fall back to `select()` for FDs where `poll()` fails (@avsm @talex5 ocaml-multicore/eio#893, reported by @aaronjeline).
  macOS `poll()` returns `POLLNVAL` for some device FDs such as `/dev/tty` or `/dev/null`.
- eio_posix: wait for a writer when first reading from a FIFO (@talex5 ocaml-multicore/eio#857).
  Before, it would return end-of-file if there was no waiter.
- eio_posix: open confined paths in non-blocking mode too (@talex5 ocaml-multicore/eio#855).
  Previously, paths opened using `fs` were opened in non-blocking mode, but paths opened with `cwd` were not.
  This probably only affects FIFOs.
- eio_posix: use `MSG_CMSG_CLOEXEC` when receiving file descriptors (@talex5 @avsm ocaml-multicore/eio#843).
- eio_linux: `read_upto` and `write_single` didn't hold the FD open (@avsm ocaml-multicore/eio#871).
  This could be a problem if another fiber closed the FD before the operation was submitted.
- eio_linux: handle ENOMEM from `io_uring_queue_init` (@talex5 ocaml-multicore/eio#852).
  We would already fall back to eio_posix if there wasn't enough lockable memory to add a fixed buffer,
  but didn't cope with not having enough memory for the ring itself.
- fork_action: retry on `EINTR` when writing to pipe (@avsm ocaml-multicore/eio#870).
- eio_windows: fix removing of FDs from read/write sets (@z-rui @talex5 ocaml-multicore/eio#861).
  Could cause high CPU use in some cases.
- eio_windows: remove unused `unix_cstruct.ml` file (@talex5 ocaml-multicore/eio#817, reported by @dijkstracula).
  Caused an error if linking with `-linkall`.
Minor changes:
- Propagate `errno` back from `fork_actions` into `Eio.Process` (@Innf107 @avsm @talex5 ocaml-multicore/eio#854).
  Report Unix `fork_action` failures as Eio exceptions instead of `Failure`.
  This allows matching on specific errors (e.g. `Argument_list_too_long`).
- Alias `Path.open_dir` to `open_subtree` (@talex5 @avsm ocaml-multicore/eio#853).
  This more accurately describes what it's for.
- Prioritize returning `Fiber.any` value over cancelling quickly (@adamchol @talex5 ocaml-multicore/eio#806).
  This works better with the new `combine` option.
- Relax return types of `Eio.Process.Pipe` (@Arogbonlo @patricoferris @talex5 ocaml-multicore/eio#775, requested by @rizo).
- `Eio.Pool.use`: move `never_block` argument (@talex5 ocaml-multicore/eio#747).
- eta expand some function applications to support OxCaml (@avsm ocaml-multicore/eio#898).
- fork_action: reject ids that don't fit uid_t/gid_t/pid_t (@avsm ocaml-multicore/eio#895).
Documentation:
- eio_unix: minor typo in `Unix_error` docstring (@avsm ocaml-multicore/eio#888).
- Simplify custom "env" type in example (@vog ocaml-multicore/eio#832).
- Fix docs for `without_binding` (@patricoferris ocaml-multicore/eio#822).
- Clarify Eio as a possible concurrency library (@patricoferris ocaml-multicore/eio#879).
Code cleanups:
- Add braces around switch case block (@olafhering ocaml-multicore/eio#882).
- eio_linux: use `Uring.Res` module for safer error handling (@talex5 @avsm ocaml-multicore/eio#868).
- eio_linux: move read/write retries out of scheduler (@talex5 @avsm ocaml-multicore/eio#849).
- eio_linux: split out `net.ml`, `process.ml`, `fs.ml` and `time.ml` (@talex5 ocaml-multicore/eio#886).
  This more closely matches the layout in eio_posix.
- eio_linux: remove unused code (@talex5 ocaml-multicore/eio#851).
  uring should never ask us to retry a job.
- Remove all use of `[@@@Alert "-unstable"]` (@talex5 ocaml-multicore/eio#885).
  This was needed a long time ago to work around a bug in Merlin.
- Remove some test files after running the tests (@avsm ocaml-multicore/eio#883).
- win32: declare unixsupport functions as `CAMLextern` (@avsm @dra27 ocaml-multicore/eio#881).
  This is necessary under Windows to prevent flexdll errors.
- Remove unused `show_backend_exceptions` flag (@talex5 ocaml-multicore/eio#880).
- Improve formatting of IP addresses in tests (@talex5 ocaml-multicore/eio#847).
- Add lintcstubs-arity as a test dependency (@talex5 ocaml-multicore/eio#846).
- Update Dockerfiles to recent versions (@talex5 ocaml-multicore/eio#844).
- Skip `test_alloc_fixed_or_wait` if no fixed buffers are available (@talex5 ocaml-multicore/eio#815).
  Prevents spurious CI failures.
- Make `eio_unix_fork_error` call `_exit` automatically (@talex5 ocaml-multicore/eio#896).

Read the original on github.com ↗