Revision history for IO-Async 0.67 2015/06/01 15:06:13 [CHANGES] * Add a ->post_fork method to IO::Async::Loop in case subclasses should take specific action (RT104130) * Remove IO::Async::MergePoint entirely * Add debug_printf() calls to IO::Async::Process * Various documentation additions [BUGFIXES] * Remember to actually delete unused filehandles from the pollmask (RT103922) 0.66 2015/04/17 20:36:39 [CHANGES] * Created IO::Async::Debug * Ignore SIGPIPE by default (RT92024) * IaSocket->bind now returns a Future * Added IaSocket->bind resolver support and neatened up UDP examples in synopsis/documentation [BUGFIXES] * Correct call to unpack() in IaStream example (RT103143) * Don't silently eat accept() failures in IaListener (RT102677) * Remember to add the new resolver instance to $loop in ->set_resolver (RT103446) * Correct implementation of ->unwatch_io on IaLoop::Poll to prevent 100% CPU spin (RT103445) * Ensure that an exception thrown by Timer::Periodic's on_tick doesn't prevent rescheduling 0.65 2015/02/15 14:28:02 [CHANGES] * Optionally allow IO::Async::Channel to use 'Sereal' serialisation * Added documentation about the 'env' Child Manager key and copying %ENV * Take OS "preferred loop subclass" hints from IO::Async::OS directly [BUGFIXES] * Nested $stream->read_* inside read_* cause double-completion of Future (RT101774) * Implement IO::Async::Loop::Poll directly on _poll() syscall wrapper, thus avoiding many bugs in IO::Poll (RT93141) * Ensure that IO::Async::Loop::Select can cope with callbacks that remove other IO handle watches (RT101919) * Silently upgrade watched IO handles to O_NONBLOCK (RT102044) * Complain about unrecognised keys to ->extract_addrinfo (RT101453) 0.64 2014/10/17 17:51:07 [CHANGES] * Make specific mention of 'TCP' and 'UDP' around socket examples where appropriate * Allow construction of an IO::Async::Handle using fileno integers directly * Provide a better search for 'all open filehandles' via IO::Async::OS on Linux (RT97942) * Allow IO::Async::Listener to have handle_constructor or handle_class as a subclass method (RT97208) * Clarify documentation on how to use IO::Async::Process's on_exception event (RT98929) [BUGFIXES] * Ensure that Stream's write Futures are also informed of write errors (RT97433) * Remember to ->remove_child the individual workers of an IO::Async::Function (RT99552) * Fix IO::Async::Function synopsis example (RT97713) 0.63 2014/07/11 15:09:08 [CHANGES] * Allow Notifier subclasses to last-ditch handle unrecognised ->configure() params * Added $notifier->adopt_future * Added $notifier->invoke_error and 'on_error' event * Ensure that TimeQueue inserts in FIFO order for equal timestamps * Kill remaining docs to long-dead IO::Async::Sequencer [BUGFIXES] * Cygwin needs the SELECT_CONNECT_EVEC OS hint as well * Probe for a broken port to perform listen() tests on by using ReuseAddr => 1 so it matches what IO::Async will do (RT84051) 0.62 2014/03/27 23:15:25 [CHANGES] * Added IO::Async::Future->{done,fail}_later * Allow overriding of debug log file or file descriptor * Avoid Future's and_then/or_else methods * Allow Channel->recv in async mode to return a Future (RT91180) * Ensure that Function ->call Futures cancel correctly * Added $routine->kill * Kill the 'getaddrinfo' => 'getaddrinfo_array' legacy redirection * Allow Loop's resolver to be changed to a different object [BUGFIXES] * Avoid relying on strong forward references in Future, by creating intentional cycles on pending Futures. Workaround for bugfix in upcoming Future release. 0.61 2013/10/15 01:10:51 [CHANGES] * Some OSes lack signals; forbid the ->*_signal methods, and use waitpid() polling for child processes if so * Rearrangement of $loop->listen and IO::Async::Listener logic to allow Listener subclasses to use listen extensions (e.g. SSL) * Allow ->listen to construct new Stream or Socket handles * Updated documentation and tests to emphasise futures with resolver and ->listen * Support spawning threads and watching for exit * Support IO::Async::Routine based on threads * Various MSWin32 improvements and fixes - it now passes tests \o/ * Declare that MSWin32 does not support POSIX-like fork(); skip all unit tests and functionallity based on it if so Note: These changes break IO::Async::SSL versions 0.12 or older. [BUGFIXES] * Ensure that $stream->write( CODE, on_write/write_len ) works correctly With many thanks to Mithaldu for the use of his Windows smoker for development and testing of the MSWin32 fixes 0.60 2013/09/19 14:26:22 [CHANGES] * Updated for Future 0.16 - no longer needs 'return' argument for Future::Utils functions * $stream->connect() ought to default socktype => "stream" [BUGFIXES] * Fix unit tests to better handle INADDR_LOOPBACK not being 127.0.0.1 * Skip-guard ->socket("inet6") unit tests on machines unable to socket(AF_INET6) * Remmeber to ->accept connections to testing socket in t/63handle-connect.t 0.59 CHANGES: * Allow IO::Async::Stream to define custom reader/writer methods * Support writeready-for-read and readready-for-write in Stream * Allow Stream->write() on_write and write_len args * Neatened and documented Future ->fail arguments and conventions * Added Stream on_writeable_{start,stop} events * Added Handle->socket, ->bind and ->connect methods * Revamp of Loop->connect logic; allow passing through an IO::Async::Handle instance BUGFIXES: * Ensure that stream read EOF state is visible during queued on_read events that caused it * Fix 'return ... or die' precendence bug in Resolver (RT87051) * Need to poll() for POLLPRI on MSWin32 and Cygwin 0.58 CHANGES: * Added Stream read watermarks BUGFIXES: * Fix weakself event handlers' use of "shift or return" 0.57 CHANGES: * Allow Stream->write from a Future, CODE that returns Future, Future that returns CODE, etc... * Added Future-returning Stream->read_* methods and ->push_on_read * Return a flush-complete notification Future from Stream->write * Allow Timer::Periodic to stop itself from its own on_tick event * Wrap transport on_{read,write}_eof from Protocol::Stream 0.56 CHANGES: * Added $loop->delay_future and $loop->timeout_future * Added $future->loop accessor * Use a faster splice()-based mechanism for the ARRAY-based TimeQueue * Updated for Future::Utils 0.12 'repeat' function BUGFIXES: * Ensure that Process from => "" works * If select() returns -1 ignore the bit vectors * pipe() on Windows doesn't play with select(); emulate ->pipepair using ->socketpair * Correct use of S_ISREG and stat() 0.55 CHANGES: * Try to ensure IO::Async::OS->socket returns an IO::Socket::IP instance for PF_INET or PF_INET6 if it is available * Don't bother testing subsecond loop_once behaviour because most loops can't actually do it * Use Future::Utils instead of CPS, removing a dependency * Removed IO::Async::Sequencer * Print a deprecation warning on old loop classes with old timer support 0.54 CHANGES: * Use Future instead of CPS::Future * Created IO::Async::Future subclass * Initial support for Futures on Loops * Rewrite lots of internals to use Futures instead of MergePoints or other logic * Renamed all "task" to "future" in APIs * Allow packing of inet/inet6 address structures to omit the IP or port and presume passive or port 0 * Removed $notifier->get_loop synonym * Make IO::Async::MergePoint throw a deprecation warning 0.53 CHANGES: * Added IO_ASYNC_WATCHDOG debugging support BUGFIXES: * Remember to return a task from Function->call even if it's queued (RT79248) 0.52 CHANGES: * Initial attempt at Tasks using CPS::Future * Minor fixes to timer LoopTests to prevent spurious failures of sub-second timing * Declare dependence on perl 5.10 now we're using 5.10 features * Removed long-since deprecated IO::Async::DetachedCode 0.51 CHANGES: * Split much code out to new IO::Async::OS heirarchy * Drop dead dependency on Test::Warn * Smaller simpler signal handling, avoid POSIX::SigSet * Expose getfamilybyname and getsocktypebyname as OS methods BUGFIXES: * Many small MSWin32 fixes that might help pass some tests. Likely still incomplete though 0.50 CHANGES: * Added IO::Async::File * Added filename mode of IO::Async::FileStream * Make Heap dependency optional by reimplementing a tiny but less efficient version of TimeQueue using a plain array * No longer need MB-only Build.PL BUGFIXES: * Round up select() and poll() timeouts to nearest milisecond, might help correct wait-time vs. gettimeofday() mismatches * Fake read- and write-readiness of S_ISREG filehandles in select() on MSWin32 * select() for exceptional status on MSWin32 to check for connect() failures * Don't unit-test that getsockname() works on socketpair()ed sockets 0.49 CHANGES: * Fix watch_time => enqueue_timer conversions; fix unit tests and Timer implementations 0.48 CHANGES: * Support Channel long-running on_recv handler * Support Channel directly between two Routines, in sync. mode at both ends * Added Loop->{watch,unwatch}_time API * Added Function->restart and max_worker_calls parameter * Support other reschedule policies for Timer::Periodic to allow tick skipping, or drift BUGFIXES: * Fix example in Routine SYNOPSIS (thanks apeiron) * Connector should check definedness of local_{host,port} rather than existence 0.47 CHANGES: * Support $listener->listen( v6only => ... ) * Added new data-passing $loop->run and $loop->stop methods BUGFIXES: * Emulate ->socketpair on MSWin32 by connecting to a temporary socket * Account for EWOULDBLOCK on MSWin32 * Don't try reading STDIN to block awaiting a signal in unit-tests * Allow zero-delay Countdown timers (RT75954) * Handle dup2() collisions in ChildManager filehandle setups (RT75573) * Fix race condition in t/33process.t (RT75573) * Ensure Timer->stop doesn't fail if the timer isn't running (RT75571) * Possibly-fix some cygwin test failures (RT71706) * Ensure that 'passive' getaddrinfo hint is handled in both synchronous and numeric cases 0.46 ADDITIONS: * IO::Async::Routine + IO::Async::Channel * IO::Async::Process->kill method CHANGES: * Use Socket 1.93 rather than dual-dependency logic on Socket::GetAddrInfo * Rewrote ::Function based on ::Routine and ::Channel * Cleaner refcount behaviour in ::Process * ::Process no longer waits for EOF condition on write-only pipes * Don't unit-test the reading end of a pipe for HUP condition * Documentation updates * Removed documentation for long-since deprecated $loop->detach_child and ->detach_code methods 0.45 CHANGES: * Added Timer->is_expired predicate, remove_on_expire parameter (RT71767) BUGFIXES: * Use fd3/4 in ::Function rather than STDIN/STDOUT, to avoid corrupting the return channel if the body function prints (RT72448) * Better error detection around setuid/setgid/setgroups (RT72407) * IO::Handle->binmode is not available as a method before perl 5.12; use CORE::binmode() instead * Don't attempt to invoke a missing on_notifier callback in Loop->listen (RT71768) 0.44 CHANGES: * Allow Process to have sockets as handles; including datagram sockets BUGFIXES: * Extract TimeQueue entiries before firing them, in case they do something weird like cancelling themselves (RT70231) * Test dollarbang for EWOULDBLOCK which might help MSWin32 * Cope correctly with Function handles in the presence of -CS or PERL_UNICODE=S 0.43 CHANGES: * Allow IO::Async::Notifier to be used as a non-principle mixin class * Provide Notifier->loop accessor * Added (still-experimental) Notifier debug features * Deleted various deprecated features: + Notifier to Handle upgrade + Loop->enable_childmanager, Loop->disable_childmanager * Print deprecation warnings on Loop->detach_code, Loop->detach_child * Minor improvements to LoopTests 0.42 BUGFIXES: * Test Stream encoding errors on a sequence which still returns U+FFFD immediately on 5.14.0 (RT69020) 0.41 CHANGES: * Support 'encoding' parameter in IO::Async::Stream * Allow IO::Async::Stream->write with an empty string, for the side-effect of setting an on_flush handler * Support 'first_interval' parameter to IO::Async::Timer::Periodic * Expanded documentation of timers BUGFIXES: * Explicitly 'use IO::Handle;' 0.40 ADDITIONS: * Added IO::Async::FileStream - RT66520 * Added IO::Async::Stream 'close_on_read_eof' parameter * Added IO::Async::Listener 'on_accept_failure' event CHANGES: * Allow Loop->listen to be extended via extensions, similar to ->connect * Autoflush streams used in Function::Worker objects by default * Default Resolver to idle_timeout=30, min_workers=0 BUGFIXES: * Don't convert method names to CODErefs during _capture_weakself as it breaks dynamic dispatch and code reload - RT65785 * Only calculate Timer::Periodic's next tick time if it actually has a Loop * Put primary GID first in a 'setgroups' list, otherwise some BSDs get upset - RT65127 * Load getaddrinfo() from Socket or Socket::GetAddrInfo in t/50resolver.t * Remove the anonymous Listener from the Loop if Loop->listen fails - RT66168 * Supply LocalPort => 0 to IO::Socket::INET constructor explicitly during testing 0.39 CHANGES: * Added IO::Async::Notifier 'notifier_name' parameter, which may be used in debugging code in a later version * Added IO::Async::Stream on_write_eof event * Complain about unrecognised keys in IO::Async::Loop->watch_io and IO::Async::Stream->write BUGFIXES: * Don't claim on_hangup supported except on those places we know it will be (Linux, FreeBSD >= 8.0) * Fixed race condition in t/41detached-code.t * Fixed race condition in IO::Async::Function 0.38 ADDITIONS: * IO::Async::Function * IO::Async::Loop->notifiers accessor CHANGES: * Symbolic flags in IO::Async::Resolver as convenience for commonly used flag constants * Distribution now uses Test::Fatal rather than Test::Exception * Resolver is now a subclass of Function, not DetachedCode BUGFIXES: * More robust detection of Socket vs Socket::GetAddrInfo * Portability fix for ChildManager's FD_CLOEXEC flag 0.37 ADDITIONS: * Handle->close_read, ->close_write * Stream on_read_eof event * extract_addrinfo conveniences for 'inet', 'inet6' and 'unix' CHANGES: * Allow Process filehandles to set up plain pipes without read/write behaviour on the associated Stream * Renamed Loop->unpack_addrinfo to ->extract_addrinfo * Prepare for Socket::getaddrinfo() in core; prefer it to Socket::GetAddrInfo::getaddrinfo() 0.36 ADDITIONS: * IO::Async::Process CHANGES: * Allow prequeuing of ->write data in Stream * Check that signal handling remains properly deferred in LoopTests * Miscellaneous documentation and examples updates BUGFIXES: * RT 64558 - getaddrinfo() returns duplicate addresses for localhost * Don't rely on having NI_NUMERICSERV 0.35 ADDITIONS: * Loop->unpack_addrinfo CHANGES: * Recognise 'inet' and 'unix' as socket families * Recognise 'stream', 'dgram' and 'raw' as socket types * Recognise nicer HASH-based addrinfo layout in ->connect and ->listen * Listener now has on_stream / on_socket as full events, not just CODEref parameters * Make Resolver->getaddrinfo try synchronously if given numeric names * Make Resolver->getnameinfo run synchronously if given NI_NUMERICHOST|NI_NUMERICSERV flags * Try to combine small data buffers from Stream->write calls if possible BUGFIXES: * Linefeed in die case of getaddrinfo_hash to preserve exeception string * Deconfigure Protocol->transport after it is closed 0.34 ADDITIONS: * New Notifier methods ->_replace_weakself, ->maybe_invoke_event, ->maybe_make_event_cb * New Protocol method ->connect * New subclass Protocol::LineStream * Direct Resolver->getaddrinfo and ->getnameinfo methods CHANGES: * New Protocol::Stream->new( handle => $io ) parameters, which creates an IO::Async::Stream to use as a transport * Renamed Loop->detach_child to Loop->fork * Pass errno values into ->connect on_connect_error and ->listen on_listen_error * Support timeouts on Resolver operations * Allow direct access to Resolver via Loop->resolver BUGFIXES: * Make sure Protocol::Stream handles writersub and on_flush callback 0.33 ADDITIONS: * Allow watching child PID 0, to capture every child process exit * $loop->time accessor * Stream->write( sub { ... } ) dynamic stream generation * Stream->write( $data, on_flush => sub { ... } ) callback CHANGES: * IO::Async::Loop->new magic constructor now caches the loop; useful for wrapping modules, other event system integration, etc.. 0.32 ADDITIONS: * IO::Async::Timer::Absolute * Listener accessors for ->sockname, ->family, ->socktype CHANGES: * Implement and document Handle's want_{read,write}ready parameters * Rearranged documentation for Notifier subclasses; new EVENTS sections * Correct location for #io-async channel on irc.perl.org 0.31 ADDITIONS: * Delegate Protocol->close method and on_closed continuation to its transport object * Stream->new_for_stdin, ->new_for_stdout, ->new_for_stdio * Support Listener->new( handle => $fh ) * IO::Async::PID notifier subclass CHANGES: * Better documentation of Listener and Connector addr and addrs arguments BUGFIXES: * INADDR_ANY/INADDR_LOOPBACK fixes inside BSD jails with restricted networking 0.30 ADDITIONS: * Added IO::Async::Socket * Added IO::Async::Protocol and ::Protocol::Stream * Added on_stream and on_socket continuations for $loop->connect and Listener CHANGES: * Emulate socketpair(AF_INET,...) * Allow IO::Async::Stream 's read_len and write_len to be configured per-instance * Allow a Stream object without an on_read handler BUGFIXES: * Cope with exceptional-state sockets in Loop::Poll 0.29 CHANGES: * Don't require 'CODE' refs for callbacks/continations; this allows the use of CODEref objects, &{} operator overloads, or other things that are callable * Implement 'read_all' and 'write_all' options on IO::Async::Stream * Allow IO::Async::Stream subclasses to override on_closed BUGFIXES: * Work around some OSes not implementing SO_ACCEPTCONN * Ensure Handle's on_read_ready/on_write_ready callbacks also take a $self reference 0.28 BUGFIXES: * Ensure that Timer->start returns $self even when not in a Loop * Accept bare GLOB refs as IO::Async::Listener handles; upgrade them to IO::Socket refs if required * Applied documentation patch from RT 55375 - thanks to Chris Williams 0.27 CHANGES: * Implement 'autoflush' option on IO::Async::Stream BUGFIXES: * Avoid $_ breaking stored signal handler references when invoking them * Ignore EINTR from sysread/syswrite * More reliable socket address tests - don't rely on uninitialised padding bytes between struct members 0.26 BUGFIXES: * Connect to INADDR_LOOPBACK rather than INADDR_ANY during t/24listener.t; hopefully fixes FAILs on OpenBSD * Fix IO::Async::Stream during combined read/write-ready of a closed stream 0.25 CHANGES: * Accept 'stream'/'dgram'/'raw' as symbolic shortcuts for socket types in connect/listen operations - avoids 'use Socket' * Accept IO::Handle-derived objects in ChildManager setup keys as well as raw GLOB refs BUGFIXES: * Various changes to test scripts to hopefully improve portability or reliability during smoke tests 0.24 ADDITIONS: * Timer subclasses - Countdown and Periodic * Idleness event watching via low-level 'watch_io/unwatch_io' methods and higher-level 'later' method * Added the missing 'unwatch_child' method * Shareable acceptance testing suite for IO::Async::Loop subclasses for better testing in subclass implementations CHANGES: * More future-proof API version checking for subclasses - requires subclasses to declare their version. ### pre-0.24 Loop subclasses are no longer compatible. ### * Entirely remove the need to $loop->enable_childmanager by calling waitpid() in 'watch_child'. 0.23 CHANGES: * Rearranged IO::Async::Listener to be a constructable Notifier suclass * Allow Signal, Timer and Listener to act as base classes as well as standalone with callbacks * Renamed IO::Async::Loop::IO_Poll to ::Poll; created transparent backward-compatibility wrapper 0.22 CHANGES: * Added tcp-proxy.pl example * More documentation on IO::Async::Notifier subclass-override methods * Documented that IO::Async::MergePoint is just an Async::MergePoint * Various small updates to keep CPANTS happy BUGFIXES: * Don't test Async::MergePoint locally as it's now a separate dist, and the tests here were reporting false negatives. 0.21 CHANGES: * Added "use warnings" to all modules * Created Notifier->configure method to allow changing properties of a Notifier or subclass after construction * New 'examples' dir with some small example scripts BUGFIXES: * More robust timing tests to avoid some spurious test failures due to busy testing servers or other non-issues 0.20 CHANGES: * Major reworking of underlying Loop implementation: + Unified low-level IO, timer and signal watches as callbacks + Split IO handle parts of Notifier into new IO::Async::Handle class + Created Timer and Signal subclasses of Notifier These changes will require a compatible upgrade to the underlying Loop implementation. * Hide SignalProxy and TimeQueue from CPAN's indexer, as they are internal-only details that don't need exposing there. * Loop magic constructor now warns if a specifically-requested class is not available * Allow multiple attachment of signals via Loop->attach_signal or new Signal objects 0.19 CHANGES: * Allow control of Sequencer's pipelining * Documentation fixes * Allow Loop->run_child to take a 'setup' array * Added 'setuid', 'setgid' and 'setgroups' child setup operations * Support 'on_notifier' in Loop->listen BUGFIXES: * carp before return in Stream->write so it actually prints * Ensure Streams still work after being closed and reopened by ->set_handle * If IO::Socket->new() fails, try again with generic ->socket (makes IPv6 work on platforms without IO::Socket::INET6) 0.18 CHANGES: * Allow Sequencer to be a base class as well as using constructor callbacks * Use signal names from Config.pm rather than relying on POSIX.pm. Covers more signals that way BUGFIXES: * Gracefully handle accept() returning EAGAIN * Fixed handling of IO::Socket->getsockopt( SOL_SOCKET, SO_ERROR ) 0.17 CHANGES: * Added Stream->close_when_empty and ->close_now. Added docs * Added OS abstractions of socketpair() and pipe() * Many documentation changes and updates BUGFIXES: * Properly handle stream read/write errors; close immediately rather than deferring until empty. * Various CPAN testers somketest bug fixes * Fixed http://rt.cpan.org/Ticket/Display.html?id=38476 0.16 ADDITIONS: * Loop->requeue_timer() * Magic constructor in IO::Async::Loop which tries to find the best subclass * 'chdir' and 'nice' ChildManager operations CHANGES: * Make sure that top-level objects are refcount-clean by using Test::Refcount, and Scalar::Util::weaken() BUGFIXES: * Keep perl 5.6.1 happy by not passing LocalPort => 0 when constructing IO::Socket::INETs * Pass the Type option to IO::Socket::INET constructor in test scripts 0.15 REMOVALS: * IO::Async::Set subclasses and IO::Async::Buffer have now been entirely removed. CHANGES: * Support handle-less IO::Async::Sequencer, like ::Notifier * Set SO_REUSEADDR on listening sockets by default * Allow Loop->listen() on a plain filehandle containing a socket * No longer any need to explcitly call Loop->enable_childmanager BUGFIXES: * IO::Async::Loop->_adjust_timeout actually works properly * Notifier->close() only runs on_closed callback if it actually closed - allows for neater cross-connected Notifiers * Made Notifier->want_{read,write}ready more efficient * Notifier->close() on a child notifier works * Loop->listen() should take the first successful address, rather than trying them all 0.14 REMOVALS: * IO::Async::Set subclasses and IO::Async::Buffer are now completely deprecated. Any attempt to use them will fail immediately. ADDITIONS: * 'keep' ChildManager operation * IO::Async::Test::wait_for_stream() * Loop->listen() * IO::Async::Sequencer class CHANGES: * Support dynamic swapping of temporary 'on_read' handlers in Stream * Now requires Socket::GetAddrInfo >= 0.08 * Further shortcuts in ChildManager setup keys - IO references and simple string operation names * Support handle-less IO::Async::Notifiers that have IO handles added to them later * Allow 'setup' key to Loop->detach_code() * Various documentation updates BUGFIXES: * Allow the same filehandle to be 'dup'ed more than once in ChildManager 0.13 CHANGES: * Flush all awaiting data from Stream when it becomes writeready * Supply a real IO::Async::Test module to allow testing in 3rd party distros * Various documentation fixes BUGFIXES: * Don't rely on STDOUT being writable during test scripts 0.12 CHANGES: * Allow Notifiers that are write-only. * Added ChildManager->open and ->run; with ->open_child and ->run_child on the containing Loop. * Moved IO::Async::Loop::Glib out to its own CPAN dist, to simplify Build.PL and testing scripts BUGFIXES: * Make sure to "use IO::Socket" in IO::Async::Connector * Pass 'socktype' argument to ->connect during testing 0.11 INCOMPATIBLE CHANGES: * Renamed IO::Async::Set::* to IO::Async::Loop::* - provided backward-compatibility wrappers around old names. IO::Async::Set::GMainLoop has become IO::Async::Lib::Glib * Renamed IO::Async::Buffer to IO::Async::Stream - provided backward- compatibility wrapper around old name. * Loop->get_childmanager() and ->get_sigproxy() no longer allowed CHANGES: * Extended ->loop_once() and ->loop() feature out to all IO::Async::Loop classes * Added IO::Async::Resolver and IO::Async::Connector, plus Loop integration * Allow write-only IO::Async::Notifiers that have no read handle or readiness callback. 0.10 INCOMPATIBLE CHANGES: * Renamed events and methods in IO::Async::Notifier to better fit the naming scheme of normal Perl handles. Backward-compatibility hooks are currently provided, but will be removed in a later release. Any code using the old names should be updated CHANGES: * Allow DetachedCode to have multiple back-end worker processes. * Control if a back-end worker exits when the code "die"s * Added 'close()' method on Notifiers/Buffers. Sensible behaviour on buffers with queued data to send * Reset %SIG hash in ChildManager->detach_child() BUGFIXES: * Clean up temporary directory during testing * Shut down DetachedCode workers properly on object deref * Better handling of borderline timing failures in t/11set-*.t * Close old handles before dup2()ing new ones when detaching code * Various other minor test script improvements 0.09 CHANGES: * Added TimeQueue object and integration with IO::Async::Set and subclasses. * Added MergePoint object * Added 'on_closed' callback support to IO::Async::Notifier BUGFIXES: * Don't depend on system locale when checking string value of $! * Fixed test scripts to more closely approximate real code behaviour in the presence of poll() vs. deferred signal delivery 0.08 CHANGES: * Added ChildManager->detach_child() method * Added DetachedCode object BUGFIXES: * Better tests for presence of Glib to improve test false failures * More lenient times in test script 11set-IO-Poll-timing to allow for variances at test time * Avoid bugs in post_select()/post_poll() caused by some notifier callbacks removing other notifiers from the set 0.07 BUGFIXES: * Avoid race condition in t/30childmanager.t - wait for child process to actually exit * Avoid race condition in IO::Async::ChildManager->spawn() by waiting for SIGCHLD+pipe close, rather than SIGCHLD+pipe data 0.06 CHANGES: * Allow 'env' setup key to ChildManager->spawn() to change the child's %ENV * Updated the way some of the ->spawn() tests are conducted. There seems to be massive failures reported on cpantesters against 0.05. These changes won't fix the bugs, but should assist in reporting and tracking them down. BUGFIXES: * Don't rely on existence of /bin/true - test for /usr/bin/true as well, fall back on "$^X -e 1" * Avoid kernel race condition in t/32childmanager-spawn-setup.t by proper use of select() when testing. 0.05 CHANGES: * Added ChildManager object * Added singleton storage in IO::Async::Set to store a SignalProxy or ChildManager conveniently BUGFIXES: * Workaround for a bug in IO::Poll version 0.05 0.04 CHANGES: * Added dynamic signal attach / detach methods to SignalProxy * Buffer now has on_read_error / on_write_error callbacks for handling IO errors on underlying sysread()/syswrite() calls 0.03 CHANGES: * No longer build_requires 'Glib' - print a warning if it's not installed but carry on anyway. * IO_Poll->loop_once() now returns the result from the poll() call * Added concept of nested child notifiers within Notifier object BUGFIXES: * Fix to test scripts that call IO_Poll's loop_once() with a timeout of zero. This can cause a kernel race condition, so supply some small non-zero value instead. 0.02 INCOMPATIBLE CHANGES: * Event methods/callback functions now called "on_*" to distinguish them * Callback functions now pass $self as first argument to simplify called code CHANGES: * Improved POD in Notifier.pm and Buffer.pm BUGFIXES: * GMainLoop.pm - return 1 from callbacks so that glib doesn't remove our IO sources * GMainLoop.pm - make sure re-asserting want_writeready actually adds the IO source again 0.01 First version, released on an unsuspecting world.