Skip to content

[new release] eio (5 packages) (1.4) - #30318

Merged
avsm merged 1 commit into
ocaml:masterfrom
talex5:release-eio-v1.4
Jul 24, 2026
Merged

avsm merged 1 commit into
ocaml:masterfrom
talex5:release-eio-v1.4

Conversation

@talex5

@talex5 talex5 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Effect-based direct-style IO API for OCaml

CHANGES:

Breaking changes:

New features:

Linux backend:

Bug fixes:

Minor changes:

Documentation:

Code cleanups:

@talex5
talex5 force-pushed the release-eio-v1.4 branch 2 times, most recently from 58e825a to e32e3e5 Compare July 24, 2026 11:16
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
talex5 force-pushed the release-eio-v1.4 branch from e32e3e5 to 07280a3 Compare July 24, 2026 11:18
@talex5

talex5 commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

Summary of CI failures:

Also, several platforms failed for an unrelated reason:

"/usr/bin/env" "bash" "-c" "opam init --reinit --config .opamrc-sandbox -ni" failed with exit status 10

I've added the necessary upper-bounds and the tests are running again...

@talex5

talex5 commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

The new test results look good to me - I think this is ready to merge.

The new failures are:

  • ubuntu-24.04-ocaml-5.5/riscv64 : "Linux >= 5.18 is required for io_uring support" (expected and OK)
  • ez_api.3.0.0 : was only tested due to upper-bound addition in cohttp-eio, and so presumably unrelated (looks like it's using depopts so might or might not be tested against Eio depending on other packages).

(BTW, it would be good to add a log analyser rule for "... failed with exit status" so that you can spot those easily; at the moment they all just show up as "Build failed" in the CI summary)

@avsm
avsm merged commit 4817f24 into ocaml:master Jul 24, 2026
4 of 5 checks passed
@avsm

avsm commented Jul 24, 2026

Copy link
Copy Markdown
Member

Thanks!

@talex5
talex5 deleted the release-eio-v1.4 branch July 24, 2026 16:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants