ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
Revision: 1.10
Committed: Fri Jan 13 13:16:15 2006 UTC (18 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-1_02
Changes since 1.9: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.2 AnyEvent - provide framework for multiple event loops
4    
5     Event, Coro, Glib, Tk - various supported event loops
6 root 1.1
7     =head1 SYNOPSIS
8    
9 root 1.7 use AnyEvent;
10 root 1.2
11 root 1.5 my $w = AnyEvent->io (fh => ..., poll => "[rw]+", cb => sub {
12 root 1.2 my ($poll_got) = @_;
13     ...
14     });
15 root 1.5
16 root 1.7 * only one io watcher per $fh and $poll type is allowed (i.e. on a socket
17     you can have one r + one w or one rw watcher, not any more (limitation by
18     Tk).
19    
20     * the C<$poll_got> passed to the handler needs to be checked by looking
21     for single characters (e.g. with a regex), as it can contain more event
22     types than were requested (e.g. a 'w' watcher might generate 'rw' events,
23     limitation by Glib).
24 root 1.5
25 root 1.7 * AnyEvent will keep filehandles alive, so as long as the watcher exists,
26 root 1.5 the filehandle exists.
27    
28     my $w = AnyEvent->timer (after => $seconds, cb => sub {
29 root 1.2 ...
30     });
31    
32 root 1.7 * io and time watchers get canceled whenever $w is destroyed, so keep a copy
33 root 1.5
34 root 1.7 * timers can only be used once and must be recreated for repeated
35     operation (limitation by Glib and Tk).
36 root 1.2
37     my $w = AnyEvent->condvar; # kind of main loop replacement
38 root 1.5 $w->wait; # enters main loop till $condvar gets ->broadcast
39     $w->broadcast; # wake up current and all future wait's
40    
41 root 1.7 * condvars are used to give blocking behaviour when neccessary. Create
42 root 1.5 a condvar for any "request" or "event" your module might create, C<<
43     ->broadcast >> it when the event happens and provide a function that calls
44     C<< ->wait >> for it. See the examples below.
45 root 1.2
46 root 1.1 =head1 DESCRIPTION
47    
48 root 1.2 L<AnyEvent> provides an identical interface to multiple event loops. This
49     allows module authors to utilizy an event loop without forcing module
50     users to use the same event loop (as only a single event loop can coexist
51     peacefully at any one time).
52    
53     The interface itself is vaguely similar but not identical to the Event
54     module.
55    
56     On the first call of any method, the module tries to detect the currently
57     loaded event loop by probing wether any of the following modules is
58     loaded: L<Coro::Event>, L<Event>, L<Glib>, L<Tk>. The first one found is
59     used. If none is found, the module tries to load these modules in the
60     order given. The first one that could be successfully loaded will be
61     used. If still none could be found, it will issue an error.
62    
63 root 1.1 =over 4
64    
65     =cut
66    
67     package AnyEvent;
68    
69 root 1.2 no warnings;
70     use strict 'vars';
71 root 1.1 use Carp;
72    
73 root 1.10 our $VERSION = '1.02';
74 root 1.2 our $MODEL;
75 root 1.1
76 root 1.2 our $AUTOLOAD;
77     our @ISA;
78 root 1.1
79 root 1.7 our $verbose = $ENV{PERL_ANYEVENT_VERBOSE}*1;
80    
81 root 1.8 our @REGISTRY;
82    
83 root 1.1 my @models = (
84 root 1.8 [Coro::Event:: => AnyEvent::Impl::Coro::],
85     [Event:: => AnyEvent::Impl::Event::],
86     [Glib:: => AnyEvent::Impl::Glib::],
87     [Tk:: => AnyEvent::Impl::Tk::],
88 root 1.1 );
89    
90 root 1.3 our %method = map +($_ => 1), qw(io timer condvar broadcast wait cancel DESTROY);
91    
92 root 1.1 sub AUTOLOAD {
93     $AUTOLOAD =~ s/.*://;
94    
95 root 1.3 $method{$AUTOLOAD}
96     or croak "$AUTOLOAD: not a valid method for AnyEvent objects";
97    
98 root 1.2 unless ($MODEL) {
99     # check for already loaded models
100 root 1.8 for (@REGISTRY, @models) {
101     my ($package, $model) = @$_;
102 root 1.7 if (${"$package\::VERSION"} > 0) {
103 root 1.8 if (eval "require $model") {
104     $MODEL = $model;
105     warn "AnyEvent: found model '$model', using it.\n" if $verbose > 1;
106     last;
107     }
108 root 1.2 }
109 root 1.1 }
110    
111 root 1.2 unless ($MODEL) {
112     # try to load a model
113    
114 root 1.8 for (@REGISTRY, @models) {
115     my ($package, $model) = @$_;
116     if (eval "require $model") {
117     $MODEL = $model;
118     warn "AnyEvent: autoprobed and loaded model '$model', using it.\n" if $verbose > 1;
119     last;
120     }
121 root 1.2 }
122    
123     $MODEL
124     or die "No event module selected for AnyEvent and autodetect failed. Install any one of these modules: Coro, Event, Glib or Tk.";
125 root 1.1 }
126     }
127    
128 root 1.2 @ISA = $MODEL;
129    
130     my $class = shift;
131     $class->$AUTOLOAD (@_);
132 root 1.1 }
133    
134 root 1.2 =back
135    
136 root 1.8 =head1 SUPPLYING YOUR OWN EVENT MODEL INTERFACE
137    
138     If you need to support another event library which isn't directly
139     supported by AnyEvent, you can supply your own interface to it by
140     pushing, before the first watch gets created, the package name of
141     the event module and the package name of the interface to use onto
142     C<@AnyEvent::REGISTRY>. You can do that before and even without loading
143     AnyEvent.
144    
145     Example:
146    
147     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
148    
149     This tells AnyEvent to (literally) use the C<urxvt::anyevent::> module
150     when it finds the C<urxvt> module is loaded. When AnyEvent is loaded and
151     requested to find a suitable event model, it will first check for the
152     urxvt module.
153    
154     The above isn't fictitious, the I<rxvt-unicode> (a.k.a. urxvt) uses
155     the above line exactly. An interface isn't included in AnyEvent
156     because it doesn't make sense outside the embedded interpreter inside
157     I<rxvt-unicode>, and it is updated and maintained as part of the
158     I<rxvt-unicode> distribution.
159    
160 root 1.7 =head1 ENVIRONMENT VARIABLES
161    
162     The following environment variables are used by this module:
163    
164     C<PERL_ANYEVENT_VERBOSE> when set to C<2> or higher, reports which event
165     model gets used.
166    
167 root 1.2 =head1 EXAMPLE
168    
169     The following program uses an io watcher to read data from stdin, a timer
170     to display a message once per second, and a condvar to exit the program
171     when the user enters quit:
172    
173     use AnyEvent;
174    
175     my $cv = AnyEvent->condvar;
176    
177     my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
178     warn "io event <$_[0]>\n"; # will always output <r>
179     chomp (my $input = <STDIN>); # read a line
180     warn "read: $input\n"; # output what has been read
181     $cv->broadcast if $input =~ /^q/i; # quit program if /^q/i
182     });
183    
184     my $time_watcher; # can only be used once
185    
186     sub new_timer {
187     $timer = AnyEvent->timer (after => 1, cb => sub {
188     warn "timeout\n"; # print 'timeout' about every second
189     &new_timer; # and restart the time
190     });
191     }
192    
193     new_timer; # create first timer
194    
195     $cv->wait; # wait until user enters /^q/i
196    
197 root 1.5 =head1 REAL-WORLD EXAMPLE
198    
199     Consider the L<Net::FCP> module. It features (among others) the following
200     API calls, which are to freenet what HTTP GET requests are to http:
201    
202     my $data = $fcp->client_get ($url); # blocks
203    
204     my $transaction = $fcp->txn_client_get ($url); # does not block
205     $transaction->cb ( sub { ... } ); # set optional result callback
206     my $data = $transaction->result; # possibly blocks
207    
208     The C<client_get> method works like C<LWP::Simple::get>: it requests the
209     given URL and waits till the data has arrived. It is defined to be:
210    
211     sub client_get { $_[0]->txn_client_get ($_[1])->result }
212    
213     And in fact is automatically generated. This is the blocking API of
214     L<Net::FCP>, and it works as simple as in any other, similar, module.
215    
216     More complicated is C<txn_client_get>: It only creates a transaction
217     (completion, result, ...) object and initiates the transaction.
218    
219     my $txn = bless { }, Net::FCP::Txn::;
220    
221     It also creates a condition variable that is used to signal the completion
222     of the request:
223    
224     $txn->{finished} = AnyAvent->condvar;
225    
226     It then creates a socket in non-blocking mode.
227    
228     socket $txn->{fh}, ...;
229     fcntl $txn->{fh}, F_SETFL, O_NONBLOCK;
230     connect $txn->{fh}, ...
231     and !$!{EWOULDBLOCK}
232     and !$!{EINPROGRESS}
233     and Carp::croak "unable to connect: $!\n";
234    
235 root 1.6 Then it creates a write-watcher which gets called whenever an error occurs
236 root 1.5 or the connection succeeds:
237    
238     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'w', cb => sub { $txn->fh_ready_w });
239    
240     And returns this transaction object. The C<fh_ready_w> callback gets
241     called as soon as the event loop detects that the socket is ready for
242     writing.
243    
244     The C<fh_ready_w> method makes the socket blocking again, writes the
245     request data and replaces the watcher by a read watcher (waiting for reply
246     data). The actual code is more complicated, but that doesn't matter for
247     this example:
248    
249     fcntl $txn->{fh}, F_SETFL, 0;
250     syswrite $txn->{fh}, $txn->{request}
251     or die "connection or write error";
252     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'r', cb => sub { $txn->fh_ready_r });
253    
254     Again, C<fh_ready_r> waits till all data has arrived, and then stores the
255     result and signals any possible waiters that the request ahs finished:
256    
257     sysread $txn->{fh}, $txn->{buf}, length $txn->{$buf};
258    
259     if (end-of-file or data complete) {
260     $txn->{result} = $txn->{buf};
261     $txn->{finished}->broadcast;
262 root 1.6 $txb->{cb}->($txn) of $txn->{cb}; # also call callback
263 root 1.5 }
264    
265     The C<result> method, finally, just waits for the finished signal (if the
266     request was already finished, it doesn't wait, of course, and returns the
267     data:
268    
269     $txn->{finished}->wait;
270 root 1.6 return $txn->{result};
271 root 1.5
272     The actual code goes further and collects all errors (C<die>s, exceptions)
273     that occured during request processing. The C<result> method detects
274     wether an exception as thrown (it is stored inside the $txn object)
275     and just throws the exception, which means connection errors and other
276     problems get reported tot he code that tries to use the result, not in a
277     random callback.
278    
279     All of this enables the following usage styles:
280    
281     1. Blocking:
282    
283     my $data = $fcp->client_get ($url);
284    
285     2. Blocking, but parallelizing:
286    
287     my @datas = map $_->result,
288     map $fcp->txn_client_get ($_),
289     @urls;
290    
291     Both blocking examples work without the module user having to know
292     anything about events.
293    
294     3a. Event-based in a main program, using any support Event module:
295    
296     use Event;
297    
298     $fcp->txn_client_get ($url)->cb (sub {
299     my $txn = shift;
300     my $data = $txn->result;
301     ...
302     });
303    
304     Event::loop;
305    
306     3b. The module user could use AnyEvent, too:
307    
308     use AnyEvent;
309    
310     my $quit = AnyEvent->condvar;
311    
312     $fcp->txn_client_get ($url)->cb (sub {
313     ...
314     $quit->broadcast;
315     });
316    
317     $quit->wait;
318    
319 root 1.2 =head1 SEE ALSO
320    
321 root 1.5 Event modules: L<Coro::Event>, L<Coro>, L<Event>, L<Glib::Event>, L<Glib>.
322    
323     Implementations: L<AnyEvent::Impl::Coro>, L<AnyEvent::Impl::Event>, L<AnyEvent::Impl::Glib>, L<AnyEvent::Impl::Tk>.
324    
325     Nontrivial usage example: L<Net::FCP>.
326 root 1.2
327     =head1
328    
329     =cut
330    
331     1
332 root 1.1