1Revision history for IO-Async
2
30.800   2021-11-11
4        [CHANGES]
5         * Bumped up to three-digit minor version number
6         * Added IO::Async::OS->signum2name
7         * Implement Future::IO->waitpid API
8         * Skip the `spawn` Routine model if POSIX fork() is not available
9         * Replace getaddrinfo / getnameinfo with virtual mocking functions
10           for unit-testing the resolve, so as not to rely on local platform
11           resolver behaviours
12
130.79    2021-08-06
14        [CHANGES]
15         * Permit IO::Async::Routine or Function by module+func names instead
16           of CODE reference
17         * Added new Routine/Function model of `spawn`
18         * Implement IO::Async::Resolver by module+func rather than code
19
20        [BUGFIXES]
21         * Require Socket 2.029 on MSWin32 because of AF_UNIX fix (RT133018)
22
230.78    2021-01-21
24        [CHANGES]
25         * Warn on attempts to ->connect to INADDR(6)_LOOPBACK as some OSes
26           (e.g. OpenBSD) do not allow it
27         * Various fixes for IO::Async::LoopTests to better support
28           IO::Async::Loop::UV:
29            + Insert some ->loop_once(0) calls between timing tests to allow
30              libuv to clear its pending queues
31            + Allow loops to declare that they cannot perform all-child PID
32              watch and skip the relevant tests for it if so
33         * Have $loop->later return a future instance if not passed any code
34           (RT133240)
35
36        [BUGFIXES]
37         * Accept more error codes for failure to resolve missing hostname
38           (RT131109)
39         * Defend against some undef values at global destruction time
40           (RT132677)
41
420.77    2020-05-13
43        [CHANGES]
44         * Updated for Metrics::Any 0.05
45         * Report an info-type gauge metric to track loop types
46         * Loop processing time should be a timer metric, not a distribution
47         * Don't bother reporting zero-byte stream read/write metrics
48
49        [BUGFIXES]
50         * Skip metrics-related unit tests if metrics aren't active, even
51           though we depend on Test::Metrics::Any
52         * Account for MSWin32's EWOULDBLOCK in t/70future-io.t
53
540.76    2020-05-05
55        [CHANGES]
56         * Initial attempt at providing metrics via Metrics::Any
57         * Renamed ->(un)watch_child API to ->(un)watch_process
58         * Renamed 'child' LoopTests suite to 'process'
59
600.75    2019-11-26 00:06:59
61        [CHANGES]
62         * Remember to keep O_NONBLOCK off on IO::Async::Channel sync mode
63           filehandles
64         * Added IO::Async::Process->finish_future
65         * Added IO::Async::Routine->result_future
66         * Future-returning version of IO::Async::Function->stop
67         * Don't load IO::Socket or Sereal modules unless required
68
69        [BUGFIXES]
70         * Refresh the sigpipe in ->post_fork if required (RT128588)
71         * Fix some spelling mistakes (RT130087)
72         * Skip the async getprotobyname() test if it doesn't work
73           synchronously (RT131029)
74
750.74    2019-06-27 18:44:38
76        [CHANGES]
77         * Warn about IO::Async::Stream using autoflush on a blocking handle
78         * Implement queuing priorities for IO::Async::Function calls (RT129918)
79         * Send a terminating signal to a ->run_process process on cancellation
80           (RT129225)
81         * Optionally make ->run_process future fail when process exits non-zero
82           (RT129225)
83         * Implement the Future::IO->syswrite API
84
85        [BUGFIXES]
86         * Skip t/70future-io.t unless Future::IO is available (RT129807)
87         * Remember to set O_NONBLOCK on IO::Async::Channel async mode
88           filehandles (RT129879)
89         * Handle Windows 7 which returns ENETDOWN to failed AF_UNIX connect()
90           (RT129806)
91
920.73    2019-06-12 16:49:28
93        [CHANGES]
94         * Provide an IO::Async implementation of Future::IO
95         * Added $loop->run_process (RT129225)
96         * Clear $ONE_TRUE_LOOP in $loop->fork so that child processes can do
97           IO::Async::Loop->new successfully
98         * Added $notifier->adopted_futures accessor (RT127818)
99         * Various docs fixes
100
1010.72    2018-04-02 19:34:27
102        [CHANGES]
103         * Expanded docs on Stream's on_read sub return values
104         * Overridable timeout for IO::Async::Test::wait_for
105         * Hide IO::Async::ChildManager as an internal implementation detail;
106           move the docs into main IO::Async::Loop
107         * Added $loop->open_process; suggest using that instead of
108           ->open_child
109         * Begin implementation of $loop->is_running method (part of RT123780)
110
111        [BUGFIXES]
112         * Make IO::Async::Future->await wait until it's ready
113         * Fix calculation of periodic timer in 'skip' mode (RT124414)
114         * Perform synchronous getaddrinfo shortcut even for service-less
115           lookups
116         * Make sure that errors from underlying read/write functions are
117           debug-logged by IO::Async::Stream
118
1190.71    2016/12/22 15:05:50
120        [CHANGES]
121         * Added 'prefork' option to IO::Async::Channel (RT115920) - thanks
122           GMARLER
123         * Prefer Sereal Channel encoding if that module is available
124         * Ensure that IaFunction still prints debug information on futures
125         * Miscellaneous spelling fixes in docs - thanks genio
126
127        [BUGFIXES]
128         * 'use lib ".";' for perl 5.24
129         * Make t/50resolver.t less sensitive to EAI_NONAME vs EAI_NODATA
130           because some resolvers lie (RT113429)
131         * Fix error message linefeed tests in t/50resolver.t (RT119369)
132         * Ensure that SIGPIPE is ignored if it's still at its default value
133
1340.70    2015/12/15 18:17:43
135        [CHANGES]
136         * Support perl 5.8.x (tested on 5.8.9, presumed working as far as
137           5.8.4)
138
1390.69    2015/11/09 19:56:58
140        [CHANGES]
141         * Use Future->catch instead of poorly-implemented string-eq test
142         * Use L<...> instead of C<...> in docs where appropriate (RT107417)
143           (thanks Arthur Axel 'fREW' Schmidt)
144
145        [BUGFIXES]
146         * Don't silently swallow Listener acceptor failures (RT107806)
147         * Don't silently swallow other ->connect errors
148         * Remember to ->unwatch_io before setting IaHandle's handle to undef
149
1500.68    2015/07/31 20:07:48
151        [CHANGES]
152         * Allow IO::Async::Function body to 'die' with an ARRAYref to set
153           more details on failed Future
154         * Have IO::Async::Resolver calls indicate the failed resolver name
155         * Have IO::Async::Resolver's getaddrinfo and getnameinfo resolvers
156           give error numbers in failure result
157         * Added 'init_code' parameter to IO::Async::Function (RT104127)
158         * Added IO::Async::Channel->encode, ->send_encoded; deprecate the old
159           ->send_frozen method
160         * Added IO::Async::Test::wait_for_future
161
162        [BUGFIXES]
163         * Clean up after 'on_hangup' loop tests (RT106061)
164         * Make ->stop + ->start on IO::Async::Timer::Periodic not forget the
165           first_interval (RT100927)
166
1670.67    2015/06/01 15:06:13
168        [CHANGES]
169         * Add a ->post_fork method to IO::Async::Loop in case subclasses
170           should take specific action (RT104130)
171         * Remove IO::Async::MergePoint entirely
172         * Add debug_printf() calls to IO::Async::Process
173         * Various documentation additions
174
175        [BUGFIXES]
176         * Remember to actually delete unused filehandles from the pollmask
177           (RT103922)
178
1790.66    2015/04/17 20:36:39
180        [CHANGES]
181         * Created IO::Async::Debug
182         * Ignore SIGPIPE by default (RT92024)
183         * IaSocket->bind now returns a Future
184         * Added IaSocket->bind resolver support and neatened up UDP examples
185           in synopsis/documentation
186
187        [BUGFIXES]
188         * Correct call to unpack() in IaStream example (RT103143)
189         * Don't silently eat accept() failures in IaListener (RT102677)
190         * Remember to add the new resolver instance to $loop in
191           ->set_resolver (RT103446)
192         * Correct implementation of ->unwatch_io on IaLoop::Poll to prevent
193           100% CPU spin (RT103445)
194         * Ensure that an exception thrown by Timer::Periodic's on_tick
195           doesn't prevent rescheduling
196
1970.65    2015/02/15 14:28:02
198        [CHANGES]
199         * Optionally allow IO::Async::Channel to use 'Sereal' serialisation
200         * Added documentation about the 'env' Child Manager key and copying
201           %ENV
202         * Take OS "preferred loop subclass" hints from IO::Async::OS directly
203
204        [BUGFIXES]
205         * Nested $stream->read_* inside read_* cause double-completion of
206           Future (RT101774)
207         * Implement IO::Async::Loop::Poll directly on _poll() syscall
208           wrapper, thus avoiding many bugs in IO::Poll (RT93141)
209         * Ensure that IO::Async::Loop::Select can cope with callbacks that
210           remove other IO handle watches (RT101919)
211         * Silently upgrade watched IO handles to O_NONBLOCK (RT102044)
212         * Complain about unrecognised keys to ->extract_addrinfo (RT101453)
213
2140.64    2014/10/17 17:51:07
215        [CHANGES]
216         * Make specific mention of 'TCP' and 'UDP' around socket examples
217           where appropriate
218         * Allow construction of an IO::Async::Handle using fileno integers
219           directly
220         * Provide a better search for 'all open filehandles' via IO::Async::OS
221           on Linux (RT97942)
222         * Allow IO::Async::Listener to have handle_constructor or handle_class
223           as a subclass method (RT97208)
224         * Clarify documentation on how to use IO::Async::Process's
225           on_exception event (RT98929)
226
227        [BUGFIXES]
228         * Ensure that Stream's write Futures are also informed of write errors
229           (RT97433)
230         * Remember to ->remove_child the individual workers of an
231           IO::Async::Function (RT99552)
232         * Fix IO::Async::Function synopsis example (RT97713)
233
2340.63    2014/07/11 15:09:08
235        [CHANGES]
236         * Allow Notifier subclasses to last-ditch handle unrecognised
237           ->configure() params
238         * Added $notifier->adopt_future
239         * Added $notifier->invoke_error and 'on_error' event
240         * Ensure that TimeQueue inserts in FIFO order for equal timestamps
241         * Kill remaining docs to long-dead IO::Async::Sequencer
242
243        [BUGFIXES]
244         * Cygwin needs the SELECT_CONNECT_EVEC OS hint as well
245         * Probe for a broken port to perform listen() tests on by using
246           ReuseAddr => 1 so it matches what IO::Async will do (RT84051)
247
2480.62    2014/03/27 23:15:25
249        [CHANGES]
250         * Added IO::Async::Future->{done,fail}_later
251         * Allow overriding of debug log file or file descriptor
252         * Avoid Future's and_then/or_else methods
253         * Allow Channel->recv in async mode to return a Future (RT91180)
254         * Ensure that Function ->call Futures cancel correctly
255         * Added $routine->kill
256         * Kill the 'getaddrinfo' => 'getaddrinfo_array' legacy redirection
257         * Allow Loop's resolver to be changed to a different object
258
259        [BUGFIXES]
260         * Avoid relying on strong forward references in Future, by creating
261           intentional cycles on pending Futures. Workaround for bugfix in
262           upcoming Future release.
263
2640.61    2013/10/15 01:10:51
265        [CHANGES]
266         * Some OSes lack signals; forbid the ->*_signal methods, and use
267           waitpid() polling for child processes if so
268         * Rearrangement of $loop->listen and IO::Async::Listener logic to
269           allow Listener subclasses to use listen extensions (e.g. SSL)
270         * Allow ->listen to construct new Stream or Socket handles
271         * Updated documentation and tests to emphasise futures with resolver
272           and ->listen
273         * Support spawning threads and watching for exit
274         * Support IO::Async::Routine based on threads
275         * Various MSWin32 improvements and fixes - it now passes tests \o/
276         * Declare that MSWin32 does not support POSIX-like fork(); skip all
277           unit tests and functionallity based on it if so
278
279         Note: These changes break IO::Async::SSL versions 0.12 or older.
280
281        [BUGFIXES]
282         * Ensure that $stream->write( CODE, on_write/write_len ) works
283           correctly
284
285        With many thanks to Mithaldu for the use of his Windows smoker for
286        development and testing of the MSWin32 fixes
287
2880.60    2013/09/19 14:26:22
289        [CHANGES]
290         * Updated for Future 0.16 - no longer needs 'return' argument for
291           Future::Utils functions
292         * $stream->connect() ought to default socktype => "stream"
293
294        [BUGFIXES]
295         * Fix unit tests to better handle INADDR_LOOPBACK not being 127.0.0.1
296         * Skip-guard ->socket("inet6") unit tests on machines unable to
297           socket(AF_INET6)
298         * Remmeber to ->accept connections to testing socket in
299           t/63handle-connect.t
300
3010.59    CHANGES:
302         * Allow IO::Async::Stream to define custom reader/writer methods
303         * Support writeready-for-read and readready-for-write in Stream
304         * Allow Stream->write() on_write and write_len args
305         * Neatened and documented Future ->fail arguments and conventions
306         * Added Stream on_writeable_{start,stop} events
307         * Added Handle->socket, ->bind and ->connect methods
308         * Revamp of Loop->connect logic; allow passing through an
309           IO::Async::Handle instance
310
311        BUGFIXES:
312         * Ensure that stream read EOF state is visible during queued on_read
313           events that caused it
314         * Fix 'return ... or die' precendence bug in Resolver (RT87051)
315         * Need to poll() for POLLPRI on MSWin32 and Cygwin
316
3170.58    CHANGES:
318         * Added Stream read watermarks
319
320        BUGFIXES:
321         * Fix weakself event handlers' use of "shift or return"
322
3230.57    CHANGES:
324         * Allow Stream->write from a Future, CODE that returns Future, Future
325           that returns CODE, etc...
326         * Added Future-returning Stream->read_* methods and ->push_on_read
327         * Return a flush-complete notification Future from Stream->write
328         * Allow Timer::Periodic to stop itself from its own on_tick event
329         * Wrap transport on_{read,write}_eof from Protocol::Stream
330
3310.56    CHANGES:
332         * Added $loop->delay_future and $loop->timeout_future
333         * Added $future->loop accessor
334         * Use a faster splice()-based mechanism for the ARRAY-based TimeQueue
335         * Updated for Future::Utils 0.12 'repeat' function
336
337        BUGFIXES:
338         * Ensure that Process from => "" works
339         * If select() returns -1 ignore the bit vectors
340         * pipe() on Windows doesn't play with select(); emulate ->pipepair
341           using ->socketpair
342         * Correct use of S_ISREG and stat()
343
3440.55    CHANGES:
345         * Try to ensure IO::Async::OS->socket returns an IO::Socket::IP
346           instance for PF_INET or PF_INET6 if it is available
347         * Don't bother testing subsecond loop_once behaviour because most
348           loops can't actually do it
349         * Use Future::Utils instead of CPS, removing a dependency
350         * Removed IO::Async::Sequencer
351         * Print a deprecation warning on old loop classes with old timer
352           support
353
3540.54    CHANGES:
355         * Use Future instead of CPS::Future
356         * Created IO::Async::Future subclass
357         * Initial support for Futures on Loops
358         * Rewrite lots of internals to use Futures instead of MergePoints or
359           other logic
360         * Renamed all "task" to "future" in APIs
361         * Allow packing of inet/inet6 address structures to omit the IP or
362           port and presume passive or port 0
363         * Removed $notifier->get_loop synonym
364         * Make IO::Async::MergePoint throw a deprecation warning
365
3660.53    CHANGES:
367         * Added IO_ASYNC_WATCHDOG debugging support
368
369        BUGFIXES:
370         * Remember to return a task from Function->call even if it's queued
371           (RT79248)
372
3730.52    CHANGES:
374         * Initial attempt at Tasks using CPS::Future
375         * Minor fixes to timer LoopTests to prevent spurious failures of
376           sub-second timing
377         * Declare dependence on perl 5.10 now we're using 5.10 features
378         * Removed long-since deprecated IO::Async::DetachedCode
379
3800.51    CHANGES:
381         * Split much code out to new IO::Async::OS heirarchy
382         * Drop dead dependency on Test::Warn
383         * Smaller simpler signal handling, avoid POSIX::SigSet
384         * Expose getfamilybyname and getsocktypebyname as OS methods
385
386        BUGFIXES:
387         * Many small MSWin32 fixes that might help pass some tests. Likely
388           still incomplete though
389
3900.50    CHANGES:
391         * Added IO::Async::File
392         * Added filename mode of IO::Async::FileStream
393         * Make Heap dependency optional by reimplementing a tiny but less
394           efficient version of TimeQueue using a plain array
395         * No longer need MB-only Build.PL
396
397        BUGFIXES:
398         * Round up select() and poll() timeouts to nearest milisecond, might
399           help correct wait-time vs. gettimeofday() mismatches
400         * Fake read- and write-readiness of S_ISREG filehandles in select()
401           on MSWin32
402         * select() for exceptional status on MSWin32 to check for connect()
403           failures
404         * Don't unit-test that getsockname() works on socketpair()ed sockets
405
4060.49    CHANGES:
407         * Fix watch_time => enqueue_timer conversions; fix unit tests and
408           Timer implementations
409
4100.48    CHANGES:
411         * Support Channel long-running on_recv handler
412         * Support Channel directly between two Routines, in sync. mode at
413           both ends
414         * Added Loop->{watch,unwatch}_time API
415         * Added Function->restart and max_worker_calls parameter
416         * Support other reschedule policies for Timer::Periodic to allow
417           tick skipping, or drift
418
419        BUGFIXES:
420         * Fix example in Routine SYNOPSIS (thanks apeiron)
421         * Connector should check definedness of local_{host,port} rather than
422           existence
423
4240.47    CHANGES:
425         * Support $listener->listen( v6only => ... )
426         * Added new data-passing $loop->run and $loop->stop methods
427
428        BUGFIXES:
429         * Emulate ->socketpair on MSWin32 by connecting to a temporary socket
430         * Account for EWOULDBLOCK on MSWin32
431         * Don't try reading STDIN to block awaiting a signal in unit-tests
432         * Allow zero-delay Countdown timers (RT75954)
433         * Handle dup2() collisions in ChildManager filehandle setups
434           (RT75573)
435         * Fix race condition in t/33process.t (RT75573)
436         * Ensure Timer->stop doesn't fail if the timer isn't running
437           (RT75571)
438         * Possibly-fix some cygwin test failures (RT71706)
439         * Ensure that 'passive' getaddrinfo hint is handled in both
440           synchronous and numeric cases
441
4420.46    ADDITIONS:
443         * IO::Async::Routine + IO::Async::Channel
444         * IO::Async::Process->kill method
445
446        CHANGES:
447         * Use Socket 1.93 rather than dual-dependency logic on
448           Socket::GetAddrInfo
449         * Rewrote ::Function based on ::Routine and ::Channel
450         * Cleaner refcount behaviour in ::Process
451         * ::Process no longer waits for EOF condition on write-only pipes
452         * Don't unit-test the reading end of a pipe for HUP condition
453         * Documentation updates
454         * Removed documentation for long-since deprecated $loop->detach_child
455           and ->detach_code methods
456
4570.45    CHANGES:
458         * Added Timer->is_expired predicate, remove_on_expire parameter
459           (RT71767)
460
461        BUGFIXES:
462         * Use fd3/4 in ::Function rather than STDIN/STDOUT, to avoid
463           corrupting the return channel if the body function prints (RT72448)
464         * Better error detection around setuid/setgid/setgroups (RT72407)
465         * IO::Handle->binmode is not available as a method before perl 5.12;
466           use CORE::binmode() instead
467         * Don't attempt to invoke a missing on_notifier callback in
468           Loop->listen (RT71768)
469
4700.44    CHANGES:
471         * Allow Process to have sockets as handles; including datagram
472           sockets
473
474        BUGFIXES:
475         * Extract TimeQueue entiries before firing them, in case they do
476           something weird like cancelling themselves (RT70231)
477         * Test dollarbang for EWOULDBLOCK which might help MSWin32
478         * Cope correctly with Function handles in the presence of -CS or
479           PERL_UNICODE=S
480
4810.43    CHANGES:
482         * Allow IO::Async::Notifier to be used as a non-principle mixin class
483         * Provide Notifier->loop accessor
484         * Added (still-experimental) Notifier debug features
485         * Deleted various deprecated features:
486            + Notifier to Handle upgrade
487            + Loop->enable_childmanager, Loop->disable_childmanager
488         * Print deprecation warnings on Loop->detach_code, Loop->detach_child
489         * Minor improvements to LoopTests
490
4910.42    BUGFIXES:
492         * Test Stream encoding errors on a sequence which still returns
493           U+FFFD immediately on 5.14.0 (RT69020)
494
4950.41    CHANGES:
496         * Support 'encoding' parameter in IO::Async::Stream
497         * Allow IO::Async::Stream->write with an empty string, for the
498           side-effect of setting an on_flush handler
499         * Support 'first_interval' parameter to IO::Async::Timer::Periodic
500         * Expanded documentation of timers
501
502        BUGFIXES:
503         * Explicitly 'use IO::Handle;'
504
5050.40    ADDITIONS:
506         * Added IO::Async::FileStream - RT66520
507         * Added IO::Async::Stream 'close_on_read_eof' parameter
508         * Added IO::Async::Listener 'on_accept_failure' event
509
510        CHANGES:
511         * Allow Loop->listen to be extended via extensions, similar to
512           ->connect
513         * Autoflush streams used in Function::Worker objects by default
514         * Default Resolver to idle_timeout=30, min_workers=0
515
516        BUGFIXES:
517         * Don't convert method names to CODErefs during _capture_weakself as
518           it breaks dynamic dispatch and code reload - RT65785
519         * Only calculate Timer::Periodic's next tick time if it actually has
520           a Loop
521         * Put primary GID first in a 'setgroups' list, otherwise some BSDs
522           get upset - RT65127
523         * Load getaddrinfo() from Socket or Socket::GetAddrInfo in
524           t/50resolver.t
525         * Remove the anonymous Listener from the Loop if Loop->listen fails
526           - RT66168
527         * Supply LocalPort => 0 to IO::Socket::INET constructor explicitly
528           during testing
529
5300.39    CHANGES:
531         * Added IO::Async::Notifier 'notifier_name' parameter, which may be
532           used in debugging code in a later version
533         * Added IO::Async::Stream on_write_eof event
534         * Complain about unrecognised keys in IO::Async::Loop->watch_io and
535           IO::Async::Stream->write
536
537        BUGFIXES:
538         * Don't claim on_hangup supported except on those places we know it
539           will be (Linux, FreeBSD >= 8.0)
540         * Fixed race condition in t/41detached-code.t
541         * Fixed race condition in IO::Async::Function
542
5430.38    ADDITIONS:
544         * IO::Async::Function
545         * IO::Async::Loop->notifiers accessor
546
547        CHANGES:
548         * Symbolic flags in IO::Async::Resolver as convenience for commonly
549           used flag constants
550         * Distribution now uses Test::Fatal rather than Test::Exception
551         * Resolver is now a subclass of Function, not DetachedCode
552
553        BUGFIXES:
554         * More robust detection of Socket vs Socket::GetAddrInfo
555         * Portability fix for ChildManager's FD_CLOEXEC flag
556
5570.37    ADDITIONS:
558         * Handle->close_read, ->close_write
559         * Stream on_read_eof event
560         * extract_addrinfo conveniences for 'inet', 'inet6' and 'unix'
561
562        CHANGES:
563         * Allow Process filehandles to set up plain pipes without read/write
564           behaviour on the associated Stream
565         * Renamed Loop->unpack_addrinfo to ->extract_addrinfo
566         * Prepare for Socket::getaddrinfo() in core; prefer it to
567           Socket::GetAddrInfo::getaddrinfo()
568
5690.36    ADDITIONS:
570         * IO::Async::Process
571
572        CHANGES:
573         * Allow prequeuing of ->write data in Stream
574         * Check that signal handling remains properly deferred in LoopTests
575         * Miscellaneous documentation and examples updates
576
577        BUGFIXES:
578         * RT 64558 - getaddrinfo() returns duplicate addresses for localhost
579         * Don't rely on having NI_NUMERICSERV
580
5810.35    ADDITIONS:
582         * Loop->unpack_addrinfo
583
584        CHANGES:
585         * Recognise 'inet' and 'unix' as socket families
586         * Recognise 'stream', 'dgram' and 'raw' as socket types
587         * Recognise nicer HASH-based addrinfo layout in ->connect and
588           ->listen
589         * Listener now has on_stream / on_socket as full events, not just
590           CODEref parameters
591         * Make Resolver->getaddrinfo try synchronously if given numeric names
592         * Make Resolver->getnameinfo run synchronously if given
593           NI_NUMERICHOST|NI_NUMERICSERV flags
594         * Try to combine small data buffers from Stream->write calls if
595           possible
596
597        BUGFIXES:
598         * Linefeed in die case of getaddrinfo_hash to preserve exeception
599           string
600         * Deconfigure Protocol->transport after it is closed
601
6020.34    ADDITIONS:
603         * New Notifier methods ->_replace_weakself, ->maybe_invoke_event,
604           ->maybe_make_event_cb
605         * New Protocol method ->connect
606         * New subclass Protocol::LineStream
607         * Direct Resolver->getaddrinfo and ->getnameinfo methods
608
609        CHANGES:
610         * New Protocol::Stream->new( handle => $io ) parameters, which
611           creates an IO::Async::Stream to use as a transport
612         * Renamed Loop->detach_child to Loop->fork
613         * Pass errno values into ->connect on_connect_error and
614           ->listen on_listen_error
615         * Support timeouts on Resolver operations
616         * Allow direct access to Resolver via Loop->resolver
617
618        BUGFIXES:
619         * Make sure Protocol::Stream handles writersub and on_flush callback
620
6210.33    ADDITIONS:
622         * Allow watching child PID 0, to capture every child process exit
623         * $loop->time accessor
624         * Stream->write( sub { ... } ) dynamic stream generation
625         * Stream->write( $data, on_flush => sub { ... } ) callback
626
627        CHANGES:
628         * IO::Async::Loop->new magic constructor now caches the loop; useful
629           for wrapping modules, other event system integration, etc..
630
6310.32    ADDITIONS:
632         * IO::Async::Timer::Absolute
633         * Listener accessors for ->sockname, ->family, ->socktype
634
635        CHANGES:
636         * Implement and document Handle's want_{read,write}ready parameters
637         * Rearranged documentation for Notifier subclasses; new EVENTS
638           sections
639         * Correct location for #io-async channel on irc.perl.org
640
6410.31    ADDITIONS:
642         * Delegate Protocol->close method and on_closed continuation to its
643           transport object
644         * Stream->new_for_stdin, ->new_for_stdout, ->new_for_stdio
645         * Support Listener->new( handle => $fh )
646         * IO::Async::PID notifier subclass
647
648        CHANGES:
649         * Better documentation of Listener and Connector addr and addrs
650           arguments
651
652        BUGFIXES:
653         * INADDR_ANY/INADDR_LOOPBACK fixes inside BSD jails with restricted
654           networking
655
6560.30    ADDITIONS:
657         * Added IO::Async::Socket
658         * Added IO::Async::Protocol and ::Protocol::Stream
659         * Added on_stream and on_socket continuations for $loop->connect and
660           Listener
661
662        CHANGES:
663         * Emulate socketpair(AF_INET,...)
664         * Allow IO::Async::Stream 's read_len and write_len to be configured
665           per-instance
666         * Allow a Stream object without an on_read handler
667
668        BUGFIXES:
669         * Cope with exceptional-state sockets in Loop::Poll
670
6710.29    CHANGES:
672         * Don't require 'CODE' refs for callbacks/continations; this allows
673           the use of CODEref objects, &{} operator overloads, or other things
674           that are callable
675         * Implement 'read_all' and 'write_all' options on IO::Async::Stream
676         * Allow IO::Async::Stream subclasses to override on_closed
677
678        BUGFIXES:
679         * Work around some OSes not implementing SO_ACCEPTCONN
680         * Ensure Handle's on_read_ready/on_write_ready callbacks also take a
681           $self reference
682
6830.28    BUGFIXES:
684         * Ensure that Timer->start returns $self even when not in a Loop
685         * Accept bare GLOB refs as IO::Async::Listener handles; upgrade them
686           to IO::Socket refs if required
687         * Applied documentation patch from RT 55375 - thanks to
688           Chris Williams
689
6900.27    CHANGES:
691         * Implement 'autoflush' option on IO::Async::Stream
692
693        BUGFIXES:
694         * Avoid $_ breaking stored signal handler references when invoking
695           them
696         * Ignore EINTR from sysread/syswrite
697         * More reliable socket address tests - don't rely on uninitialised
698           padding bytes between struct members
699
7000.26    BUGFIXES:
701         * Connect to INADDR_LOOPBACK rather than INADDR_ANY during
702           t/24listener.t; hopefully fixes FAILs on OpenBSD
703         * Fix IO::Async::Stream during combined read/write-ready of a closed
704           stream
705
7060.25    CHANGES:
707         * Accept 'stream'/'dgram'/'raw' as symbolic shortcuts for socket
708           types in connect/listen operations - avoids 'use Socket'
709         * Accept IO::Handle-derived objects in ChildManager setup keys as
710           well as raw GLOB refs
711
712        BUGFIXES:
713         * Various changes to test scripts to hopefully improve portability or
714           reliability during smoke tests
715
7160.24    ADDITIONS:
717         * Timer subclasses - Countdown and Periodic
718         * Idleness event watching via low-level 'watch_io/unwatch_io' methods
719           and higher-level 'later' method
720         * Added the missing 'unwatch_child' method
721         * Shareable acceptance testing suite for IO::Async::Loop subclasses
722           for better testing in subclass implementations
723
724        CHANGES:
725         * More future-proof API version checking for subclasses - requires
726           subclasses to declare their version.
727           ### pre-0.24 Loop subclasses are no longer compatible. ###
728         * Entirely remove the need to $loop->enable_childmanager by calling
729           waitpid() in 'watch_child'.
730
7310.23    CHANGES:
732         * Rearranged IO::Async::Listener to be a constructable Notifier
733           suclass
734         * Allow Signal, Timer and Listener to act as base classes as well as
735           standalone with callbacks
736         * Renamed IO::Async::Loop::IO_Poll to ::Poll; created transparent
737           backward-compatibility wrapper
738
7390.22    CHANGES:
740         * Added tcp-proxy.pl example
741         * More documentation on IO::Async::Notifier subclass-override methods
742         * Documented that IO::Async::MergePoint is just an Async::MergePoint
743         * Various small updates to keep CPANTS happy
744
745        BUGFIXES:
746         * Don't test Async::MergePoint locally as it's now a separate dist,
747           and the tests here were reporting false negatives.
748
7490.21    CHANGES:
750         * Added "use warnings" to all modules
751         * Created Notifier->configure method to allow changing properties of
752           a Notifier or subclass after construction
753         * New 'examples' dir with some small example scripts
754
755        BUGFIXES:
756         * More robust timing tests to avoid some spurious test failures due
757           to busy testing servers or other non-issues
758
7590.20    CHANGES:
760         * Major reworking of underlying Loop implementation:
761            + Unified low-level IO, timer and signal watches as callbacks
762            + Split IO handle parts of Notifier into new IO::Async::Handle
763              class
764            + Created Timer and Signal subclasses of Notifier
765
766           These changes will require a compatible upgrade to the underlying
767           Loop implementation.
768
769         * Hide SignalProxy and TimeQueue from CPAN's indexer, as they are
770           internal-only details that don't need exposing there.
771         * Loop magic constructor now warns if a specifically-requested class
772           is not available
773         * Allow multiple attachment of signals via Loop->attach_signal or new
774           Signal objects
775
7760.19    CHANGES:
777         * Allow control of Sequencer's pipelining
778         * Documentation fixes
779         * Allow Loop->run_child to take a 'setup' array
780         * Added 'setuid', 'setgid' and 'setgroups' child setup operations
781         * Support 'on_notifier' in Loop->listen
782
783        BUGFIXES:
784         * carp before return in Stream->write so it actually prints
785         * Ensure Streams still work after being closed and reopened by
786           ->set_handle
787         * If IO::Socket->new() fails, try again with generic ->socket
788           (makes IPv6 work on platforms without IO::Socket::INET6)
789
7900.18    CHANGES:
791         * Allow Sequencer to be a base class as well as using constructor
792           callbacks
793         * Use signal names from Config.pm rather than relying on POSIX.pm.
794           Covers more signals that way
795
796        BUGFIXES:
797         * Gracefully handle accept() returning EAGAIN
798         * Fixed handling of IO::Socket->getsockopt( SOL_SOCKET, SO_ERROR )
799
8000.17    CHANGES:
801         * Added Stream->close_when_empty and ->close_now. Added docs
802         * Added OS abstractions of socketpair() and pipe()
803         * Many documentation changes and updates
804
805        BUGFIXES:
806         * Properly handle stream read/write errors; close immediately rather
807           than deferring until empty.
808         * Various CPAN testers somketest bug fixes
809         * Fixed http://rt.cpan.org/Ticket/Display.html?id=38476
810
8110.16    ADDITIONS:
812         * Loop->requeue_timer()
813         * Magic constructor in IO::Async::Loop which tries to find the best
814           subclass
815         * 'chdir' and 'nice' ChildManager operations
816
817        CHANGES:
818         * Make sure that top-level objects are refcount-clean by using
819           Test::Refcount, and Scalar::Util::weaken()
820
821        BUGFIXES:
822         * Keep perl 5.6.1 happy by not passing LocalPort => 0 when
823           constructing IO::Socket::INETs
824         * Pass the Type option to IO::Socket::INET constructor in test
825           scripts
826
8270.15    REMOVALS:
828         * IO::Async::Set subclasses and IO::Async::Buffer have now been
829           entirely removed.
830
831        CHANGES:
832         * Support handle-less IO::Async::Sequencer, like ::Notifier
833         * Set SO_REUSEADDR on listening sockets by default
834         * Allow Loop->listen() on a plain filehandle containing a socket
835         * No longer any need to explcitly call Loop->enable_childmanager
836
837        BUGFIXES:
838         * IO::Async::Loop->_adjust_timeout actually works properly
839         * Notifier->close() only runs on_closed callback if it actually
840           closed - allows for neater cross-connected Notifiers
841         * Made Notifier->want_{read,write}ready more efficient
842         * Notifier->close() on a child notifier works
843         * Loop->listen() should take the first successful address, rather
844           than trying them all
845
8460.14    REMOVALS:
847         * IO::Async::Set subclasses and IO::Async::Buffer are now completely
848           deprecated. Any attempt to use them will fail immediately.
849
850        ADDITIONS:
851         * 'keep' ChildManager operation
852         * IO::Async::Test::wait_for_stream()
853         * Loop->listen()
854         * IO::Async::Sequencer class
855
856        CHANGES:
857         * Support dynamic swapping of temporary 'on_read' handlers in Stream
858         * Now requires Socket::GetAddrInfo >= 0.08
859         * Further shortcuts in ChildManager setup keys - IO references and
860           simple string operation names
861         * Support handle-less IO::Async::Notifiers that have IO handles added
862           to them later
863         * Allow 'setup' key to Loop->detach_code()
864         * Various documentation updates
865
866        BUGFIXES:
867         * Allow the same filehandle to be 'dup'ed more than once in
868           ChildManager
869
8700.13    CHANGES:
871         * Flush all awaiting data from Stream when it becomes writeready
872         * Supply a real IO::Async::Test module to allow testing in 3rd party
873           distros
874         * Various documentation fixes
875
876        BUGFIXES:
877         * Don't rely on STDOUT being writable during test scripts
878
8790.12    CHANGES:
880         * Allow Notifiers that are write-only.
881         * Added ChildManager->open and ->run; with ->open_child and
882           ->run_child on the containing Loop.
883         * Moved IO::Async::Loop::Glib out to its own CPAN dist, to
884           simplify Build.PL and testing scripts
885
886        BUGFIXES:
887         * Make sure to "use IO::Socket" in IO::Async::Connector
888         * Pass 'socktype' argument to ->connect during testing
889
8900.11    INCOMPATIBLE CHANGES:
891         * Renamed IO::Async::Set::* to IO::Async::Loop::* - provided
892           backward-compatibility wrappers around old names.
893           IO::Async::Set::GMainLoop has become IO::Async::Lib::Glib
894         * Renamed IO::Async::Buffer to IO::Async::Stream - provided backward-
895           compatibility wrapper around old name.
896         * Loop->get_childmanager() and ->get_sigproxy() no longer allowed
897
898        CHANGES:
899         * Extended ->loop_once() and ->loop() feature out to all
900           IO::Async::Loop classes
901         * Added IO::Async::Resolver and IO::Async::Connector, plus Loop
902           integration
903         * Allow write-only IO::Async::Notifiers that have no read handle or
904           readiness callback.
905
9060.10    INCOMPATIBLE CHANGES:
907         * Renamed events and methods in IO::Async::Notifier to better fit the
908           naming scheme of normal Perl handles. Backward-compatibility hooks
909           are currently provided, but will be removed in a later release. Any
910           code using the old names should be updated
911
912        CHANGES:
913         * Allow DetachedCode to have multiple back-end worker processes.
914         * Control if a back-end worker exits when the code "die"s
915         * Added 'close()' method on Notifiers/Buffers. Sensible behaviour on
916           buffers with queued data to send
917         * Reset %SIG hash in ChildManager->detach_child()
918
919        BUGFIXES:
920         * Clean up temporary directory during testing
921         * Shut down DetachedCode workers properly on object deref
922         * Better handling of borderline timing failures in t/11set-*.t
923         * Close old handles before dup2()ing new ones when detaching code
924         * Various other minor test script improvements
925
9260.09    CHANGES:
927         * Added TimeQueue object and integration with IO::Async::Set and
928           subclasses.
929         * Added MergePoint object
930         * Added 'on_closed' callback support to IO::Async::Notifier
931
932        BUGFIXES:
933         * Don't depend on system locale when checking string value of $!
934         * Fixed test scripts to more closely approximate real code behaviour
935           in the presence of poll() vs. deferred signal delivery
936
9370.08    CHANGES:
938         * Added ChildManager->detach_child() method
939         * Added DetachedCode object
940
941        BUGFIXES:
942         * Better tests for presence of Glib to improve test false failures
943         * More lenient times in test script 11set-IO-Poll-timing to allow for
944           variances at test time
945         * Avoid bugs in post_select()/post_poll() caused by some notifier
946           callbacks removing other notifiers from the set
947
9480.07    BUGFIXES:
949         * Avoid race condition in t/30childmanager.t - wait for child process
950           to actually exit
951         * Avoid race condition in IO::Async::ChildManager->spawn() by waiting
952           for SIGCHLD+pipe close, rather than SIGCHLD+pipe data
953
9540.06    CHANGES:
955         * Allow 'env' setup key to ChildManager->spawn() to change the
956           child's %ENV
957         * Updated the way some of the ->spawn() tests are conducted. There
958           seems to be massive failures reported on cpantesters against 0.05.
959           These changes won't fix the bugs, but should assist in reporting
960           and tracking them down.
961
962        BUGFIXES:
963         * Don't rely on existence of /bin/true - test for /usr/bin/true as
964           well, fall back on "$^X -e 1"
965         * Avoid kernel race condition in t/32childmanager-spawn-setup.t by
966           proper use of select() when testing.
967
9680.05    CHANGES:
969         * Added ChildManager object
970         * Added singleton storage in IO::Async::Set to store a SignalProxy or
971           ChildManager conveniently
972
973        BUGFIXES:
974         * Workaround for a bug in IO::Poll version 0.05
975
9760.04    CHANGES:
977         * Added dynamic signal attach / detach methods to SignalProxy
978         * Buffer now has on_read_error / on_write_error callbacks for
979           handling IO errors on underlying sysread()/syswrite() calls
980
9810.03    CHANGES:
982         * No longer build_requires 'Glib' - print a warning if it's not
983           installed but carry on anyway.
984         * IO_Poll->loop_once() now returns the result from the poll() call
985         * Added concept of nested child notifiers within Notifier object
986
987        BUGFIXES:
988         * Fix to test scripts that call IO_Poll's loop_once() with a timeout
989           of zero. This can cause a kernel race condition, so supply some
990           small non-zero value instead.
991
9920.02    INCOMPATIBLE CHANGES:
993         * Event methods/callback functions now called "on_*" to distinguish
994           them
995         * Callback functions now pass $self as first argument to simplify
996           called code
997
998        CHANGES:
999         * Improved POD in Notifier.pm and Buffer.pm
1000
1001        BUGFIXES:
1002         * GMainLoop.pm - return 1 from callbacks so that glib doesn't remove
1003           our IO sources
1004         * GMainLoop.pm - make sure re-asserting want_writeready actually adds
1005           the IO source again
1006
10070.01    First version, released on an unsuspecting world.
1008
1009