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.269 by root, Fri Jul 31 20:16:29 2009 UTC vs.
Revision 1.275 by root, Sun Aug 9 00:24:35 2009 UTC

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
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 {
1640 1684
1641 @_ 1685 @_
1642 and $cv->{_ae_cb} = shift 1686 and $cv->{_ae_cb} = shift
1643 and $cv->{_ae_sent} 1687 and $cv->{_ae_sent}
1644 and (delete $cv->{_ae_cb})->($cv); 1688 and (delete $cv->{_ae_cb})->($cv);
1689
1645 $cv->{_ae_cb} 1690 $cv->{_ae_cb}
1646} 1691}
1647 1692
1648sub begin { 1693sub begin {
1649 ++$_[0]{_ae_counter}; 1694 ++$_[0]{_ae_counter};
1656} 1701}
1657 1702
1658# undocumented/compatibility with pre-3.4 1703# undocumented/compatibility with pre-3.4
1659*broadcast = \&send; 1704*broadcast = \&send;
1660*wait = \&_wait; 1705*wait = \&_wait;
1661
1662#############################################################################
1663# "new" API, currently only emulation of it
1664#############################################################################
1665
1666package AE;
1667
1668sub io($$$) {
1669 AnyEvent->io (fh => $_[0], poll => $_[1] ? "w" : "r", cb => $_[2])
1670}
1671
1672sub timer($$$) {
1673 AnyEvent->timer (after => $_[0], interval => $_[1], cb => $_[2]);
1674}
1675
1676sub signal($$) {
1677 AnyEvent->signal (signal => $_[0], cb => $_[1]);
1678}
1679
1680sub child($$) {
1681 AnyEvent->child (pid => $_[0], cb => $_[1]);
1682}
1683
1684sub idle($) {
1685 AnyEvent->idle (cb => $_[0]);
1686}
1687
1688sub cv() {
1689 AnyEvent->condvar
1690}
1691
1692sub now() {
1693 AnyEvent->now
1694}
1695
1696sub now_update() {
1697 AnyEvent->now_update
1698}
1699
1700sub time() {
1701 AnyEvent->time
1702}
1703 1706
1704=head1 ERROR AND EXCEPTION HANDLING 1707=head1 ERROR AND EXCEPTION HANDLING
1705 1708
1706In 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
1707caller 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