Changes for version 0.118 - 2026-11-01
- Add Stream->sendfile($file, offset => ..., length => ...) for established plain TCP and Unix-domain socket Streams. File ranges share the native ordered output queue with write() and obey existing backpressure, output limits, deadlines, graceful end, and close behavior. Keep the caller's file position unchanged and retain an owned close-on-exec duplicate so the caller may close its filehandle.
- Reject TLS and other non-plain transports, pending connections, and invalid file ranges rather than silently copying or reframing data. Preserve the ordinary byte-write hot path and bound mixed file output to 64 KiB per readiness turn for Loop fairness. Add regression tests for ordering, callbacks, lifecycle, managed fork, and file descriptor cleanup, plus byte-verified TCP benchmarks and public documentation.
- Add Loop->defer_fork() so socket, timer, and other event callbacks can request a managed fork without forking inside native dispatch. Reuse the existing resource-aware share/clone/move dispositions and child reconstruction handshake. Parent and child completion callbacks run only after the native driver has returned to a quiescent point.
- Return a cancelable one-shot request handle, support on_error for deferred failures, preserve explicit stop priority, and discard pending fork requests inherited by a child to prevent unintended repeated forks. Support run(), run_for(), run_once(), and poll() with the same application-facing API. Ordinary Loop->fork() remains quiescent-only.
- Keep epoll dispatch in native XS. Add targeted deferred-fork regression coverage and an isolated public/native driver overhead benchmark. Update examples and documentation for callback-triggered forking.
Modules
Fast event-driven programming for Linux
Represent a socket address
Structured error information from Linux::Event
Define message boundaries for ordered byte streams
Frame messages with an ASCII decimal payload length
Split an ordered byte stream at a delimiter
Split an ordered byte stream into fixed-size messages
Frame messages with a binary payload length
Frame messages as canonical netstrings
Frame messages with a 32-bit big-endian payload length
Frame messages with an unsigned LEB128 payload length
Application data I/O resources
Asynchronous pipes and FIFOs
Socket resources in Linux::Event
Asynchronous UDP and Unix datagram sockets
Accept asynchronous stream connections
Asynchronous connected sockets
Asynchronous terminal and pseudo-terminal I/O
Linux kernel notification and lifecycle resources
Wake an event loop from another execution context
Watch files and directories for filesystem changes
Describe one filesystem notification
One filesystem watch owned by an Inotify object
Spawn or monitor processes through the event loop
Handle Unix signals through the event loop
Schedule one-time or recurring work
Run and coordinate Linux::Event resources
OpenSSL TLS transport for Linux::Event Stream sockets