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.1 by root, Wed Apr 27 01:26:44 2005 UTC vs.
Revision 1.13 by root, Thu Jul 20 08:26:00 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines