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.268 by root, Thu Jul 30 16:39:19 2009 UTC vs.
Revision 1.276 by root, Sun Aug 9 10:53:33 2009 UTC

790=item $cb = $cv->cb ($cb->($cv)) 790=item $cb = $cv->cb ($cb->($cv))
791 791
792This is a mutator function that returns the callback set and optionally 792This is a mutator function that returns the callback set and optionally
793replaces it before doing so. 793replaces it before doing so.
794 794
795The callback will be called when the condition becomes "true", i.e. when 795The callback will be called when the condition becomes (or already was)
796C<send> or C<croak> are called, with the only argument being the condition 796"true", i.e. when C<send> or C<croak> are called (or were called), with
797variable itself. Calling C<recv> inside the callback or at any later time 797the only argument being the condition variable itself. Calling C<recv>
798is guaranteed not to block. 798inside the callback or at any later time is guaranteed not to block.
799 799
800=back 800=back
801 801
802=head1 SUPPORTED EVENT LOOPS/BACKENDS 802=head1 SUPPORTED EVENT LOOPS/BACKENDS
803 803
806=over 4 806=over 4
807 807
808=item Backends that are autoprobed when no other event loop can be found. 808=item Backends that are autoprobed when no other event loop can be found.
809 809
810EV is the preferred backend when no other event loop seems to be in 810EV is the preferred backend when no other event loop seems to be in
811use. If EV is not installed, then AnyEvent will try Event, and, failing 811use. If EV is not installed, then AnyEvent will fall back to its own
812that, will fall back to its own pure-perl implementation, which is 812pure-perl implementation, which is available everywhere as it comes with
813available everywhere as it comes with AnyEvent itself. 813AnyEvent itself.
814 814
815 AnyEvent::Impl::EV based on EV (interface to libev, best choice). 815 AnyEvent::Impl::EV based on EV (interface to libev, best choice).
816 AnyEvent::Impl::Event based on Event, very stable, few glitches.
817 AnyEvent::Impl::Perl pure-perl implementation, fast and portable. 816 AnyEvent::Impl::Perl pure-perl implementation, fast and portable.
818 817
819=item Backends that are transparently being picked up when they are used. 818=item Backends that are transparently being picked up when they are used.
820 819
821These will be used when they are currently loaded when the first watcher 820These will be used when they are currently loaded when the first watcher
822is created, in which case it is assumed that the application is using 821is created, in which case it is assumed that the application is using
823them. This means that AnyEvent will automatically pick the right backend 822them. This means that AnyEvent will automatically pick the right backend
824when the main program loads an event module before anything starts to 823when the main program loads an event module before anything starts to
825create watchers. Nothing special needs to be done by the main program. 824create watchers. Nothing special needs to be done by the main program.
826 825
826 AnyEvent::Impl::Event based on Event, very stable, few glitches.
827 AnyEvent::Impl::Glib based on Glib, slow but very stable. 827 AnyEvent::Impl::Glib based on Glib, slow but very stable.
828 AnyEvent::Impl::Tk based on Tk, very broken. 828 AnyEvent::Impl::Tk based on Tk, very broken.
829 AnyEvent::Impl::EventLib based on Event::Lib, leaks memory and worse. 829 AnyEvent::Impl::EventLib based on Event::Lib, leaks memory and worse.
830 AnyEvent::Impl::POE based on POE, very slow, some limitations. 830 AnyEvent::Impl::POE based on POE, very slow, some limitations.
831 AnyEvent::Impl::Irssi used when running within irssi. 831 AnyEvent::Impl::Irssi used when running within irssi.
1115 1115
1116BEGIN { AnyEvent::common_sense } 1116BEGIN { AnyEvent::common_sense }
1117 1117
1118use Carp (); 1118use Carp ();
1119 1119
1120our $VERSION = 4.9; 1120our $VERSION = 4.92;
1121our $MODEL; 1121our $MODEL;
1122 1122
1123our $AUTOLOAD; 1123our $AUTOLOAD;
1124our @ISA; 1124our @ISA;
1125 1125
1151 $ENV{PERL_ANYEVENT_PROTOCOLS} || "ipv4,ipv6"; 1151 $ENV{PERL_ANYEVENT_PROTOCOLS} || "ipv4,ipv6";
1152} 1152}
1153 1153
1154my @models = ( 1154my @models = (
1155 [EV:: => AnyEvent::Impl::EV:: , 1], 1155 [EV:: => AnyEvent::Impl::EV:: , 1],
1156 [Event:: => AnyEvent::Impl::Event::, 1],
1157 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl:: , 1], 1156 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl:: , 1],
1158 # everything below here will not (normally) be autoprobed 1157 # everything below here will not (normally) be autoprobed
1159 # as the pureperl backend should work everywhere 1158 # as the pureperl backend should work everywhere
1160 # and is usually faster 1159 # and is usually faster
1160 [Event:: => AnyEvent::Impl::Event::, 1],
1161 [Glib:: => AnyEvent::Impl::Glib:: , 1], # becomes extremely slow with many watchers 1161 [Glib:: => AnyEvent::Impl::Glib:: , 1], # becomes extremely slow with many watchers
1162 [Event::Lib:: => AnyEvent::Impl::EventLib::], # too buggy 1162 [Event::Lib:: => AnyEvent::Impl::EventLib::], # too buggy
1163 [Irssi:: => AnyEvent::Impl::Irssi::], # Irssi has a bogus "Event" package 1163 [Irssi:: => AnyEvent::Impl::Irssi::], # Irssi has a bogus "Event" package
1164 [Tk:: => AnyEvent::Impl::Tk::], # crashes with many handles 1164 [Tk:: => AnyEvent::Impl::Tk::], # crashes with many handles
1165 [Qt:: => AnyEvent::Impl::Qt::], # requires special main program 1165 [Qt:: => AnyEvent::Impl::Qt::], # requires special main program
1287 # we assume CLOEXEC is already set by perl in all important cases 1287 # we assume CLOEXEC is already set by perl in all important cases
1288 1288
1289 ($fh2, $rw) 1289 ($fh2, $rw)
1290} 1290}
1291 1291
1292#############################################################################
1293# "new" API, currently only emulation of it
1294#############################################################################
1295
1296package AE;
1297
1298our $VERSION = $AnyEvent::VERSION;
1299
1300sub io($$$) {
1301 AnyEvent->io (fh => $_[0], poll => $_[1] ? "w" : "r", cb => $_[2])
1302}
1303
1304sub timer($$$) {
1305 AnyEvent->timer (after => $_[0], interval => $_[1], cb => $_[2]);
1306}
1307
1308sub signal($$) {
1309 AnyEvent->signal (signal => $_[0], cb => $_[1]);
1310}
1311
1312sub child($$) {
1313 AnyEvent->child (pid => $_[0], cb => $_[1]);
1314}
1315
1316sub idle($) {
1317 AnyEvent->idle (cb => $_[0]);
1318}
1319
1320sub cv(;&) {
1321 AnyEvent->condvar (@_ ? (cb => $_[0]) : ())
1322}
1323
1324sub now() {
1325 AnyEvent->now
1326}
1327
1328sub now_update() {
1329 AnyEvent->now_update
1330}
1331
1332sub time() {
1333 AnyEvent->time
1334}
1335
1292package AnyEvent::Base; 1336package AnyEvent::Base;
1293 1337
1294# default implementations for many methods 1338# default implementations for many methods
1295 1339
1296sub _time { 1340sub _time {
1348 1392
1349# install a dummy wakeup watcher to reduce signal catching latency 1393# install a dummy wakeup watcher to reduce signal catching latency
1350sub _sig_add() { 1394sub _sig_add() {
1351 unless ($SIG_COUNT++) { 1395 unless ($SIG_COUNT++) {
1352 # try to align timer on a full-second boundary, if possible 1396 # try to align timer on a full-second boundary, if possible
1353 my $NOW = AnyEvent->now; 1397 my $NOW = AE::now;
1354 1398
1355 $SIG_TW = AnyEvent->timer ( 1399 $SIG_TW = AE::timer
1356 after => $MAX_SIGNAL_LATENCY - ($NOW - int $NOW), 1400 $MAX_SIGNAL_LATENCY - ($NOW - int $NOW),
1357 interval => $MAX_SIGNAL_LATENCY, 1401 $MAX_SIGNAL_LATENCY,
1358 cb => sub { }, # just for the PERL_ASYNC_CHECK 1402 sub { } # just for the PERL_ASYNC_CHECK
1359 ); 1403 ;
1360 } 1404 }
1361} 1405}
1362 1406
1363sub _sig_del { 1407sub _sig_del {
1364 undef $SIG_TW 1408 undef $SIG_TW
1401 # probe for availability of Async::Interrupt 1445 # probe for availability of Async::Interrupt
1402 if (_have_async_interrupt) { 1446 if (_have_async_interrupt) {
1403 warn "AnyEvent: using Async::Interrupt for race-free signal handling.\n" if $VERBOSE >= 8; 1447 warn "AnyEvent: using Async::Interrupt for race-free signal handling.\n" if $VERBOSE >= 8;
1404 1448
1405 $SIGPIPE_R = new Async::Interrupt::EventPipe; 1449 $SIGPIPE_R = new Async::Interrupt::EventPipe;
1406 $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R->fileno, poll => "r", cb => \&_signal_exec); 1450 $SIG_IO = AE::io $SIGPIPE_R->fileno, 0, \&_signal_exec;
1407 1451
1408 } else { 1452 } else {
1409 warn "AnyEvent: using emulated perl signal handling with latency timer.\n" if $VERBOSE >= 8; 1453 warn "AnyEvent: using emulated perl signal handling with latency timer.\n" if $VERBOSE >= 8;
1410 1454
1411 require Fcntl; 1455 require Fcntl;
1427 } 1471 }
1428 1472
1429 $SIGPIPE_R 1473 $SIGPIPE_R
1430 or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n"; 1474 or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n";
1431 1475
1432 $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R, poll => "r", cb => \&_signal_exec); 1476 $SIG_IO = AE::io $SIGPIPE_R, 0, \&_signal_exec;
1433 } 1477 }
1434 1478
1435 *signal = sub { 1479 *signal = sub {
1436 my (undef, %arg) = @_; 1480 my (undef, %arg) = @_;
1437 1481
1526 $WNOHANG ||= $^O =~ /^(?:openbsd|netbsd|linux|freebsd|cygwin|MSWin32)$/ 1570 $WNOHANG ||= $^O =~ /^(?:openbsd|netbsd|linux|freebsd|cygwin|MSWin32)$/
1527 ? 1 1571 ? 1
1528 : eval { local $SIG{__DIE__}; require POSIX; &POSIX::WNOHANG } || 1; 1572 : eval { local $SIG{__DIE__}; require POSIX; &POSIX::WNOHANG } || 1;
1529 1573
1530 unless ($CHLD_W) { 1574 unless ($CHLD_W) {
1531 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_sigchld); 1575 $CHLD_W = AE::signal CHLD => \&_sigchld;
1532 # child could be a zombie already, so make at least one round 1576 # child could be a zombie already, so make at least one round
1533 &_sigchld; 1577 &_sigchld;
1534 } 1578 }
1535 1579
1536 bless [$pid, $arg{cb}], "AnyEvent::Base::child" 1580 bless [$pid, $arg{cb}], "AnyEvent::Base::child"
1562 # never use more then 50% of the time for the idle watcher, 1606 # never use more then 50% of the time for the idle watcher,
1563 # within some limits 1607 # within some limits
1564 $w = 0.0001 if $w < 0.0001; 1608 $w = 0.0001 if $w < 0.0001;
1565 $w = 5 if $w > 5; 1609 $w = 5 if $w > 5;
1566 1610
1567 $w = AnyEvent->timer (after => $w, cb => $rcb); 1611 $w = AE::timer $w, 0, $rcb;
1568 } else { 1612 } else {
1569 # clean up... 1613 # clean up...
1570 undef $w; 1614 undef $w;
1571 undef $rcb; 1615 undef $rcb;
1572 } 1616 }
1573 }; 1617 };
1574 1618
1575 $w = AnyEvent->timer (after => 0.05, cb => $rcb); 1619 $w = AE::timer 0.05, 0, $rcb;
1576 1620
1577 bless \\$cb, "AnyEvent::Base::idle" 1621 bless \\$cb, "AnyEvent::Base::idle"
1578} 1622}
1579 1623
1580sub AnyEvent::Base::idle::DESTROY { 1624sub AnyEvent::Base::idle::DESTROY {
1634 Carp::croak $_[0]{_ae_croak} if $_[0]{_ae_croak}; 1678 Carp::croak $_[0]{_ae_croak} if $_[0]{_ae_croak};
1635 wantarray ? @{ $_[0]{_ae_sent} } : $_[0]{_ae_sent}[0] 1679 wantarray ? @{ $_[0]{_ae_sent} } : $_[0]{_ae_sent}[0]
1636} 1680}
1637 1681
1638sub cb { 1682sub cb {
1639 $_[0]{_ae_cb} = $_[1] if @_ > 1; 1683 my $cv = shift;
1684
1685 @_
1686 and $cv->{_ae_cb} = shift
1687 and $cv->{_ae_sent}
1688 and (delete $cv->{_ae_cb})->($cv);
1689
1640 $_[0]{_ae_cb} 1690 $cv->{_ae_cb}
1641} 1691}
1642 1692
1643sub begin { 1693sub begin {
1644 ++$_[0]{_ae_counter}; 1694 ++$_[0]{_ae_counter};
1645 $_[0]{_ae_end_cb} = $_[1] if @_ > 1; 1695 $_[0]{_ae_end_cb} = $_[1] if @_ > 1;
1651} 1701}
1652 1702
1653# undocumented/compatibility with pre-3.4 1703# undocumented/compatibility with pre-3.4
1654*broadcast = \&send; 1704*broadcast = \&send;
1655*wait = \&_wait; 1705*wait = \&_wait;
1656
1657#############################################################################
1658# "new" API, currently only emulation of it
1659#############################################################################
1660
1661package AE;
1662
1663sub io($$$) {
1664 AnyEvent->io (fh => $_[0], poll => $_[1] ? "w" : "r", cb => $_[2])
1665}
1666
1667sub timer($$$) {
1668 AnyEvent->timer (after => $_[0], interval => $_[1], cb => $_[2]);
1669}
1670
1671sub signal($$) {
1672 AnyEvent->signal (signal => $_[0], cb => $_[1]);
1673}
1674
1675sub child($$) {
1676 AnyEvent->child (pid => $_[0], cb => $_[1]);
1677}
1678
1679sub idle($) {
1680 AnyEvent->idle (cb => $_[0]);
1681}
1682
1683sub cv() {
1684 AnyEvent->condvar
1685}
1686
1687sub now() {
1688 AnyEvent->now
1689}
1690
1691sub now_update() {
1692 AnyEvent->now_update
1693}
1694
1695sub time() {
1696 AnyEvent->time
1697}
1698 1706
1699=head1 ERROR AND EXCEPTION HANDLING 1707=head1 ERROR AND EXCEPTION HANDLING
1700 1708
1701In general, AnyEvent does not do any error handling - it relies on the 1709In general, AnyEvent does not do any error handling - it relies on the
1702caller to do that if required. The L<AnyEvent::Strict> module (see also 1710caller to do that if required. The L<AnyEvent::Strict> module (see also

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines