ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent.pm (file contents):
Revision 1.339 by root, Fri Dec 3 18:38:32 2010 UTC vs.
Revision 1.350 by root, Tue Aug 2 20:02:44 2011 UTC

85that isn't them. What's worse, all the potential users of your 85that isn't them. What's worse, all the potential users of your
86module are I<also> forced to use the same event loop you use. 86module are I<also> forced to use the same event loop you use.
87 87
88AnyEvent is different: AnyEvent + POE works fine. AnyEvent + Glib works 88AnyEvent is different: AnyEvent + POE works fine. AnyEvent + Glib works
89fine. AnyEvent + Tk works fine etc. etc. but none of these work together 89fine. AnyEvent + Tk works fine etc. etc. but none of these work together
90with the rest: POE + IO::Async? No go. Tk + Event? No go. Again: if 90with the rest: POE + EV? No go. Tk + Event? No go. Again: if your module
91your module uses one of those, every user of your module has to use it, 91uses one of those, every user of your module has to use it, too. But if
92too. But if your module uses AnyEvent, it works transparently with all 92your module uses AnyEvent, it works transparently with all event models it
93event models it supports (including stuff like IO::Async, as long as those 93supports (including stuff like IO::Async, as long as those use one of the
94use one of the supported event loops. It is easy to add new event loops 94supported event loops. It is easy to add new event loops to AnyEvent, too,
95to AnyEvent, too, so it is future-proof). 95so it is future-proof).
96 96
97In addition to being free of having to use I<the one and only true event 97In addition to being free of having to use I<the one and only true event
98model>, AnyEvent also is free of bloat and policy: with POE or similar 98model>, AnyEvent also is free of bloat and policy: with POE or similar
99modules, you get an enormous amount of code and strict rules you have to 99modules, you get an enormous amount of code and strict rules you have to
100follow. AnyEvent, on the other hand, is lean and to the point, by only 100follow. AnyEvent, on the other hand, is lean and to the point, by only
876 AnyEvent::Impl::Glib based on Glib, slow but very stable. 876 AnyEvent::Impl::Glib based on Glib, slow but very stable.
877 AnyEvent::Impl::Tk based on Tk, very broken. 877 AnyEvent::Impl::Tk based on Tk, very broken.
878 AnyEvent::Impl::EventLib based on Event::Lib, leaks memory and worse. 878 AnyEvent::Impl::EventLib based on Event::Lib, leaks memory and worse.
879 AnyEvent::Impl::POE based on POE, very slow, some limitations. 879 AnyEvent::Impl::POE based on POE, very slow, some limitations.
880 AnyEvent::Impl::Irssi used when running within irssi. 880 AnyEvent::Impl::Irssi used when running within irssi.
881 AnyEvent::Impl::IOAsync based on IO::Async.
882 AnyEvent::Impl::Cocoa based on Cocoa::EventLoop.
883 AnyEvent::Impl::FLTK based on FLTK.
881 884
882=item Backends with special needs. 885=item Backends with special needs.
883 886
884Qt requires the Qt::Application to be instantiated first, but will 887Qt requires the Qt::Application to be instantiated first, but will
885otherwise be picked up automatically. As long as the main program 888otherwise be picked up automatically. As long as the main program
886instantiates the application before any AnyEvent watchers are created, 889instantiates the application before any AnyEvent watchers are created,
887everything should just work. 890everything should just work.
888 891
889 AnyEvent::Impl::Qt based on Qt. 892 AnyEvent::Impl::Qt based on Qt.
890
891Support for IO::Async can only be partial, as it is too broken and
892architecturally limited to even support the AnyEvent API. It also
893is the only event loop that needs the loop to be set explicitly, so
894it can only be used by a main program knowing about AnyEvent. See
895L<AnyEvent::Impl::IOAsync> for the gory details.
896
897 AnyEvent::Impl::IOAsync based on IO::Async, cannot be autoprobed.
898 893
899=item Event loops that are indirectly supported via other backends. 894=item Event loops that are indirectly supported via other backends.
900 895
901Some event loops can be supported via other modules: 896Some event loops can be supported via other modules:
902 897
1157 1152
1158package AnyEvent; 1153package AnyEvent;
1159 1154
1160# basically a tuned-down version of common::sense 1155# basically a tuned-down version of common::sense
1161sub common_sense { 1156sub common_sense {
1162 # from common:.sense 3.3 1157 # from common:.sense 3.4
1163 ${^WARNING_BITS} ^= ${^WARNING_BITS} ^ "\x3c\x3f\x33\x00\x0f\xf3\x0f\xc0\xf0\xfc\x33\x00"; 1158 ${^WARNING_BITS} ^= ${^WARNING_BITS} ^ "\x3c\x3f\x33\x00\x0f\xf0\x0f\xc0\xf0\xfc\x33\x00";
1164 # use strict vars subs - NO UTF-8, as Util.pm doesn't like this atm. (uts46data.pl) 1159 # use strict vars subs - NO UTF-8, as Util.pm doesn't like this atm. (uts46data.pl)
1165 $^H |= 0x00000600; 1160 $^H |= 0x00000600;
1166} 1161}
1167 1162
1168BEGIN { AnyEvent::common_sense } 1163BEGIN { AnyEvent::common_sense }
1169 1164
1170use Carp (); 1165use Carp ();
1171 1166
1172our $VERSION = '5.29'; 1167our $VERSION = '5.34';
1173our $MODEL; 1168our $MODEL;
1174 1169
1175our $AUTOLOAD; 1170our $AUTOLOAD;
1176our @ISA; 1171our @ISA;
1177 1172
1215 [Tk:: => AnyEvent::Impl::Tk::], # crashes with many handles 1210 [Tk:: => AnyEvent::Impl::Tk::], # crashes with many handles
1216 [Qt:: => AnyEvent::Impl::Qt::], # requires special main program 1211 [Qt:: => AnyEvent::Impl::Qt::], # requires special main program
1217 [POE::Kernel:: => AnyEvent::Impl::POE::], # lasciate ogni speranza 1212 [POE::Kernel:: => AnyEvent::Impl::POE::], # lasciate ogni speranza
1218 [Wx:: => AnyEvent::Impl::POE::], 1213 [Wx:: => AnyEvent::Impl::POE::],
1219 [Prima:: => AnyEvent::Impl::POE::], 1214 [Prima:: => AnyEvent::Impl::POE::],
1220 # IO::Async is just too broken - we would need workarounds for its
1221 # byzantine signal and broken child handling, among others.
1222 # IO::Async is rather hard to detect, as it doesn't have any
1223 # obvious default class.
1224 [IO::Async:: => AnyEvent::Impl::IOAsync::], # requires special main program
1225 [IO::Async::Loop:: => AnyEvent::Impl::IOAsync::], # requires special main program 1215 [IO::Async::Loop:: => AnyEvent::Impl::IOAsync::],
1226 [IO::Async::Notifier:: => AnyEvent::Impl::IOAsync::], # requires special main program 1216 [Cocoa::EventLoop:: => AnyEvent::Impl::Cocoa::],
1227 [AnyEvent::Impl::IOAsync:: => AnyEvent::Impl::IOAsync::], # requires special main program 1217 [FLTK:: => AnyEvent::Impl::FLTK::],
1228); 1218);
1229 1219
1230our %method = map +($_ => 1), 1220our %method = map +($_ => 1),
1231 qw(io timer time now now_update signal child idle condvar one_event DESTROY); 1221 qw(io timer time now now_update signal child idle condvar DESTROY);
1232 1222
1233our @post_detect; 1223our @post_detect;
1234 1224
1235sub post_detect(&) { 1225sub post_detect(&) {
1236 my ($cb) = @_; 1226 my ($cb) = @_;
1309 if defined &{"$MODEL\::$_"}; 1299 if defined &{"$MODEL\::$_"};
1310 } 1300 }
1311 1301
1312 if ($ENV{PERL_ANYEVENT_STRICT}) { 1302 if ($ENV{PERL_ANYEVENT_STRICT}) {
1313 eval { require AnyEvent::Strict }; 1303 eval { require AnyEvent::Strict };
1314 warn "AnyEvent: cannot load AnyEvent::Strict ($@)\n" 1304 warn "AnyEvent: cannot load AnyEvent::Strict: $@"
1315 if $@ && $VERBOSE; 1305 if $@ && $VERBOSE;
1316 } 1306 }
1317 1307
1318 (shift @post_detect)->() while @post_detect; 1308 (shift @post_detect)->() while @post_detect;
1319 1309
1628# default implementation for ->child 1618# default implementation for ->child
1629 1619
1630our %PID_CB; 1620our %PID_CB;
1631our $CHLD_W; 1621our $CHLD_W;
1632our $CHLD_DELAY_W; 1622our $CHLD_DELAY_W;
1633our $WNOHANG;
1634 1623
1635# used by many Impl's 1624# used by many Impl's
1636sub _emit_childstatus($$) { 1625sub _emit_childstatus($$) {
1637 my (undef, $rpid, $rstatus) = @_; 1626 my (undef, $rpid, $rstatus) = @_;
1638 1627
1645 eval q{ # poor man's autoloading {} 1634 eval q{ # poor man's autoloading {}
1646 *_sigchld = sub { 1635 *_sigchld = sub {
1647 my $pid; 1636 my $pid;
1648 1637
1649 AnyEvent->_emit_childstatus ($pid, $?) 1638 AnyEvent->_emit_childstatus ($pid, $?)
1650 while ($pid = waitpid -1, $WNOHANG) > 0; 1639 while ($pid = waitpid -1, WNOHANG) > 0;
1651 }; 1640 };
1652 1641
1653 *child = sub { 1642 *child = sub {
1654 my (undef, %arg) = @_; 1643 my (undef, %arg) = @_;
1655 1644
1656 defined (my $pid = $arg{pid} + 0) 1645 defined (my $pid = $arg{pid} + 0)
1657 or Carp::croak "required option 'pid' is missing"; 1646 or Carp::croak "required option 'pid' is missing";
1658 1647
1659 $PID_CB{$pid}{$arg{cb}} = $arg{cb}; 1648 $PID_CB{$pid}{$arg{cb}} = $arg{cb};
1660
1661 # WNOHANG is almost cetrainly 1 everywhere
1662 $WNOHANG ||= $^O =~ /^(?:openbsd|netbsd|linux|freebsd|cygwin|MSWin32)$/
1663 ? 1
1664 : eval { local $SIG{__DIE__}; require POSIX; &POSIX::WNOHANG } || 1;
1665 1649
1666 unless ($CHLD_W) { 1650 unless ($CHLD_W) {
1667 $CHLD_W = AE::signal CHLD => \&_sigchld; 1651 $CHLD_W = AE::signal CHLD => \&_sigchld;
1668 # child could be a zombie already, so make at least one round 1652 # child could be a zombie already, so make at least one round
1669 &_sigchld; 1653 &_sigchld;
1755 1739
1756sub _send { 1740sub _send {
1757 # nop 1741 # nop
1758} 1742}
1759 1743
1744sub _wait {
1745 Carp::croak "$AnyEvent::MODEL does not support blocking waits. Caught";
1746}
1747
1760sub send { 1748sub send {
1761 my $cv = shift; 1749 my $cv = shift;
1762 $cv->{_ae_sent} = [@_]; 1750 $cv->{_ae_sent} = [@_];
1763 (delete $cv->{_ae_cb})->($cv) if $cv->{_ae_cb}; 1751 (delete $cv->{_ae_cb})->($cv) if $cv->{_ae_cb};
1764 $cv->_send; 1752 $cv->_send;
1771 1759
1772sub ready { 1760sub ready {
1773 $_[0]{_ae_sent} 1761 $_[0]{_ae_sent}
1774} 1762}
1775 1763
1776sub _wait {
1777 $WAITING
1778 and !$_[0]{_ae_sent}
1779 and Carp::croak "AnyEvent::CondVar: recursive blocking wait detected";
1780
1781 local $WAITING = 1;
1782 AnyEvent->one_event while !$_[0]{_ae_sent};
1783}
1784
1785sub recv { 1764sub recv {
1765 unless ($_[0]{_ae_sent}) {
1766 $WAITING
1767 and Carp::croak "AnyEvent::CondVar: recursive blocking wait detected";
1768
1769 local $WAITING = 1;
1786 $_[0]->_wait; 1770 $_[0]->_wait;
1771 }
1787 1772
1788 Carp::croak $_[0]{_ae_croak} if $_[0]{_ae_croak}; 1773 $_[0]{_ae_croak}
1789 wantarray ? @{ $_[0]{_ae_sent} } : $_[0]{_ae_sent}[0] 1774 and Carp::croak $_[0]{_ae_croak};
1775
1776 wantarray
1777 ? @{ $_[0]{_ae_sent} }
1778 : $_[0]{_ae_sent}[0]
1790} 1779}
1791 1780
1792sub cb { 1781sub cb {
1793 my $cv = shift; 1782 my $cv = shift;
1794 1783
1810 &{ $_[0]{_ae_end_cb} || sub { $_[0]->send } }; 1799 &{ $_[0]{_ae_end_cb} || sub { $_[0]->send } };
1811} 1800}
1812 1801
1813# undocumented/compatibility with pre-3.4 1802# undocumented/compatibility with pre-3.4
1814*broadcast = \&send; 1803*broadcast = \&send;
1815*wait = \&_wait; 1804*wait = \&recv;
1816 1805
1817=head1 ERROR AND EXCEPTION HANDLING 1806=head1 ERROR AND EXCEPTION HANDLING
1818 1807
1819In general, AnyEvent does not do any error handling - it relies on the 1808In general, AnyEvent does not do any error handling - it relies on the
1820caller to do that if required. The L<AnyEvent::Strict> module (see also 1809caller to do that if required. The L<AnyEvent::Strict> module (see also

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines