Changes for version 0.117 - 2026-09-24

  • Rewrite public POD with clearer constructor placement, callback signatures, lifecycle explanations, and practical examples. Keep SYNOPSIS examples compilable and validate code separately from prose.
  • Exclude generated Inotify build files from distribution packaging.
  • Make IO::TTY borrow supplied terminal handles by default so wrapping STDIN/STDOUT does not make TTY close destroy the process standard handles. Capture and temporarily apply nonblocking/close-on-exec descriptor state, never close caller-owned handles on explicit close, directional close, graceful end, or EOF, restore captured flags when the complete borrowed TTY becomes terminal or detaches, and add owns_handles => 1 for explicit ownership. Preserve Pipe and Stream ownership semantics.
  • Add an explicit Loop-aware fork contract with strict per-resource dispositions. Loop->fork() is quiescent-only, rejects unsupported combinations before the syscall where foreseeable, gives the child a fresh epoll/timer reactor, and makes unlisted resources parent-only. Listener supports share/move, Timer supports clone/move with preserved absolute deadlines, Inotify supports independent clone or inherited move, and established plain socket Stream supports move. Moved parent objects become terminal/inert. A parent/child reconstruction handshake prevents parent-side move teardown until the child is ready.
  • Make accidental reuse of an inherited Loop after ordinary CORE::fork() fail by process ownership checks across driving, registration, introspection, statistics, and tuning operations. Deferred queues are not inherited. Signal services are dismantled child-side without modifying the parent's inherited signalfd state, and idle resolver worker services are quiesced before managed fork; active resolution is rejected.
  • Add Linux::Event::Kernel::Inotify with explicit Loop attachment, logical child Watch objects, decoded immutable Event values, named per-event callbacks plus on_event, parent-level overflow/error handling, shared-inode watch fan-out, rename-cookie preservation, reentrant-safe cancellation/close, and bounded burst dispatch through Loop->defer(). Detached watches remain specifications until attachment; live watch installation and failed attachment are synchronous and transactional.
  • Add Loop->defer() for owner-interpreter, non-reentrant next-turn work. Deliver eligible callbacks FIFO, force work queued during a deferred drain to a later turn, provide an opaque cancelable one-shot handle, retain pending work at Loop scope, preserve later work across callback exceptions, and bound each drain to 1,024 queue entries. Use a lazy private eventfd so deferred work participates in poll_fd()/poll() foreign-loop integration without becoming a cross-thread callback queue.

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