1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
|
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.
|