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.284 by root, Sun Aug 16 16:54:51 2009 UTC vs.
Revision 1.289 by root, Tue Sep 1 16:44:58 2009 UTC

592 after => 1, 592 after => 1,
593 cb => sub { $result_ready->send }, 593 cb => sub { $result_ready->send },
594 ); 594 );
595 595
596 # this "blocks" (while handling events) till the callback 596 # this "blocks" (while handling events) till the callback
597 # calls -<send 597 # calls ->send
598 $result_ready->recv; 598 $result_ready->recv;
599 599
600Example: wait for a timer, but take advantage of the fact that condition 600Example: wait for a timer, but take advantage of the fact that condition
601variables are also callable directly. 601variables are also callable directly.
602 602
1106 1106
1107package AnyEvent; 1107package AnyEvent;
1108 1108
1109# basically a tuned-down version of common::sense 1109# basically a tuned-down version of common::sense
1110sub common_sense { 1110sub common_sense {
1111 # no warnings 1111 # from common:.sense 1.0
1112 ${^WARNING_BITS} ^= ${^WARNING_BITS}; 1112 ${^WARNING_BITS} = "\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03";
1113 # use strict vars subs 1113 # use strict vars subs
1114 $^H |= 0x00000600; 1114 $^H |= 0x00000600;
1115} 1115}
1116 1116
1117BEGIN { AnyEvent::common_sense } 1117BEGIN { AnyEvent::common_sense }
1118 1118
1119use Carp (); 1119use Carp ();
1120 1120
1121our $VERSION = '5.111'; 1121our $VERSION = '5.112';
1122our $MODEL; 1122our $MODEL;
1123 1123
1124our $AUTOLOAD; 1124our $AUTOLOAD;
1125our @ISA; 1125our @ISA;
1126 1126
1343 1343
1344package AnyEvent::Base; 1344package AnyEvent::Base;
1345 1345
1346# default implementations for many methods 1346# default implementations for many methods
1347 1347
1348sub _time { 1348sub _time() {
1349 # probe for availability of Time::HiRes 1349 # probe for availability of Time::HiRes
1350 if (eval "use Time::HiRes (); Time::HiRes::time (); 1") { 1350 if (eval "use Time::HiRes (); Time::HiRes::time (); 1") {
1351 warn "AnyEvent: using Time::HiRes for sub-second timing accuracy.\n" if $VERBOSE >= 8; 1351 warn "AnyEvent: using Time::HiRes for sub-second timing accuracy.\n" if $VERBOSE >= 8;
1352 *_time = \&Time::HiRes::time; 1352 *_time = \&Time::HiRes::time;
1353 # if (eval "use POSIX (); (POSIX::times())... 1353 # if (eval "use POSIX (); (POSIX::times())...
1373 1373
1374our $HAVE_ASYNC_INTERRUPT; 1374our $HAVE_ASYNC_INTERRUPT;
1375 1375
1376sub _have_async_interrupt() { 1376sub _have_async_interrupt() {
1377 $HAVE_ASYNC_INTERRUPT = 1*(!$ENV{PERL_ANYEVENT_AVOID_ASYNC_INTERRUPT} 1377 $HAVE_ASYNC_INTERRUPT = 1*(!$ENV{PERL_ANYEVENT_AVOID_ASYNC_INTERRUPT}
1378 && eval "use Async::Interrupt 1.0 (); 1") 1378 && eval "use Async::Interrupt 1.02 (); 1")
1379 unless defined $HAVE_ASYNC_INTERRUPT; 1379 unless defined $HAVE_ASYNC_INTERRUPT;
1380 1380
1381 $HAVE_ASYNC_INTERRUPT 1381 $HAVE_ASYNC_INTERRUPT
1382} 1382}
1383 1383
1912 warn "read: $input\n"; # output what has been read 1912 warn "read: $input\n"; # output what has been read
1913 $cv->send if $input =~ /^q/i; # quit program if /^q/i 1913 $cv->send if $input =~ /^q/i; # quit program if /^q/i
1914 }, 1914 },
1915 ); 1915 );
1916 1916
1917 my $time_watcher; # can only be used once
1918
1919 sub new_timer {
1920 $timer = AnyEvent->timer (after => 1, cb => sub { 1917 my $time_watcher = AnyEvent->timer (after => 1, interval => 1, cb => sub {
1921 warn "timeout\n"; # print 'timeout' about every second 1918 warn "timeout\n"; # print 'timeout' at most every second
1922 &new_timer; # and restart the time
1923 }); 1919 });
1924 }
1925
1926 new_timer; # create first timer
1927 1920
1928 $cv->recv; # wait until user enters /^q/i 1921 $cv->recv; # wait until user enters /^q/i
1929 1922
1930=head1 REAL-WORLD EXAMPLE 1923=head1 REAL-WORLD EXAMPLE
1931 1924
2375As you can see, the AnyEvent + EV combination even beats the 2368As you can see, the AnyEvent + EV combination even beats the
2376hand-optimised "raw sockets benchmark", while AnyEvent + its pure perl 2369hand-optimised "raw sockets benchmark", while AnyEvent + its pure perl
2377backend easily beats IO::Lambda and POE. 2370backend easily beats IO::Lambda and POE.
2378 2371
2379And even the 100% non-blocking version written using the high-level (and 2372And even the 100% non-blocking version written using the high-level (and
2380slow :) L<AnyEvent::Handle> abstraction beats both POE and IO::Lambda by a 2373slow :) L<AnyEvent::Handle> abstraction beats both POE and IO::Lambda
2381large margin, even though it does all of DNS, tcp-connect and socket I/O 2374higher level ("unoptimised") abstractions by a large margin, even though
2382in a non-blocking way. 2375it does all of DNS, tcp-connect and socket I/O in a non-blocking way.
2383 2376
2384The two AnyEvent benchmarks programs can be found as F<eg/ae0.pl> and 2377The two AnyEvent benchmarks programs can be found as F<eg/ae0.pl> and
2385F<eg/ae2.pl> in the AnyEvent distribution, the remaining benchmarks are 2378F<eg/ae2.pl> in the AnyEvent distribution, the remaining benchmarks are
2386part of the IO::lambda distribution and were used without any changes. 2379part of the IO::Lambda distribution and were used without any changes.
2387 2380
2388 2381
2389=head1 SIGNALS 2382=head1 SIGNALS
2390 2383
2391AnyEvent currently installs handlers for these signals: 2384AnyEvent currently installs handlers for these signals:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines