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.10 by root, Fri Jan 13 13:16:15 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 utilizy 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 watch 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::> module
150when it finds the C<urxvt> module is loaded. When AnyEvent is loaded and
151requested to find a suitable event model, it will first check for the
152urxvt module.
153
154The above isn't fictitious, the I<rxvt-unicode> (a.k.a. urxvt) uses
155the above line exactly. An interface isn't included in AnyEvent
156because it doesn't make sense outside the embedded interpreter inside
157I<rxvt-unicode>, and it is updated and maintained as part of the
158I<rxvt-unicode> distribution.
159
160=head1 ENVIRONMENT VARIABLES
161
162The following environment variables are used by this module:
163
164C<PERL_ANYEVENT_VERBOSE> when set to C<2> or higher, reports which event
165model gets used.
166
167=head1 EXAMPLE
168
169The following program uses an io watcher to read data from stdin, a timer
170to display a message once per second, and a condvar to exit the program
171when 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
45 } 190 });
46 } 191 }
47 192
48 die "No event module selected for AnyEvent and autodetect failed. Install any of these: Coro, Event, Glib or Tk."; 193 new_timer; # create first timer
49}
50 194
511; 195 $cv->wait; # wait until user enters /^q/i
52 196
197=head1 REAL-WORLD EXAMPLE
198
199Consider the L<Net::FCP> module. It features (among others) the following
200API 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
208The C<client_get> method works like C<LWP::Simple::get>: it requests the
209given 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
213And in fact is automatically generated. This is the blocking API of
214L<Net::FCP>, and it works as simple as in any other, similar, module.
215
216More 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
221It also creates a condition variable that is used to signal the completion
222of the request:
223
224 $txn->{finished} = AnyAvent->condvar;
225
226It 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
235Then it creates a write-watcher which gets called whenever an error occurs
236or the connection succeeds:
237
238 $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'w', cb => sub { $txn->fh_ready_w });
239
240And returns this transaction object. The C<fh_ready_w> callback gets
241called as soon as the event loop detects that the socket is ready for
242writing.
243
244The C<fh_ready_w> method makes the socket blocking again, writes the
245request data and replaces the watcher by a read watcher (waiting for reply
246data). The actual code is more complicated, but that doesn't matter for
247this 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
254Again, C<fh_ready_r> waits till all data has arrived, and then stores the
255result 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 $txb->{cb}->($txn) of $txn->{cb}; # also call callback
263 }
264
265The C<result> method, finally, just waits for the finished signal (if the
266request was already finished, it doesn't wait, of course, and returns the
267data:
268
269 $txn->{finished}->wait;
270 return $txn->{result};
271
272The actual code goes further and collects all errors (C<die>s, exceptions)
273that occured during request processing. The C<result> method detects
274wether an exception as thrown (it is stored inside the $txn object)
275and just throws the exception, which means connection errors and other
276problems get reported tot he code that tries to use the result, not in a
277random callback.
278
279All of this enables the following usage styles:
280
2811. Blocking:
282
283 my $data = $fcp->client_get ($url);
284
2852. Blocking, but parallelizing:
286
287 my @datas = map $_->result,
288 map $fcp->txn_client_get ($_),
289 @urls;
290
291Both blocking examples work without the module user having to know
292anything about events.
293
2943a. 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
3063b. 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=head1 SEE ALSO
320
321Event modules: L<Coro::Event>, L<Coro>, L<Event>, L<Glib::Event>, L<Glib>.
322
323Implementations: L<AnyEvent::Impl::Coro>, L<AnyEvent::Impl::Event>, L<AnyEvent::Impl::Glib>, L<AnyEvent::Impl::Tk>.
324
325Nontrivial usage example: L<Net::FCP>.
326
327=head1
328
329=cut
330
3311
332

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines