Changes for version 0.02 - 2026-08-07
- Fix a pool worker dying while idle taking the whole pool down with it. Worker death was only ever noticed as EOF on the read side, and an idle worker's fd is not readable, so the first thing that learned about it was the write of the next request - which failed the future and left the slot alive with a valid fd.
- A public C ABI. include/dbil_abi.h declares a versioned function- pointer table.
- selectall_rowhash: every row as a hashref, in the order the server returned them - DBI's selectall_arrayref($sql, { Slice => {} }). selectall_hashref cannot stand in for it, because keying rows by a column destroys the ordering that keyset pagination depends on. t/17-rowhash.t.
- Fork safety. A pool belongs to the process that forked its workers. Without that, a program that forked after its first statement (any preforking server) left every child reading the same socketpair, so a request could be answered with another request's rows!!
- Pool worker children close every inherited descriptor except their own socketpair end, and the parent's ends are FD_CLOEXEC. A worker used to hold a duplicate of whatever the embedding program had open - in a web server, the listening socket - keeping the port bound for the worker's whole life.
- Fixed a crash in the native (Pg) backend on perl before 5.30. SvTRUE is a multi-evaluating macro there, so SvTRUE(POPs) popped the stack once per expansion and walked SP below its base: a segfault on 5.20 and wrong readiness answers on 5.14. Found by running the test suite on the older perls in the docker matrix.
- t/15-fork.t runs on whichever loop adapter is installed rather than requiring IO::Async, which needs perl 5.14 and so could never have covered the oldest perls the dist supports.
Modules
non-blocking DBI on your event loop
the canonical future for DBIx::Loop
drive DBIx::Loop on AnyEvent
drive DBIx::Loop on a Hyperman event loop, in C
drive DBIx::Loop on an IO::Async event loop
drive DBIx::Loop on Mojo::IOLoop