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

# Content
1 =head1 NAME
2
3 AnyEvent - provide framework for multiple event loops
4
5 Event, Coro, Glib, Tk - various supported event loops
6
7 =head1 SYNOPSIS
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
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
25 * AnyEvent will keep filehandles alive, so as long as the watcher exists,
26 the 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
35 operation (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
42 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
46 =head1 DESCRIPTION
47
48 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 =over 4
64
65 =cut
66
67 package AnyEvent;
68
69 no warnings;
70 use strict 'vars';
71 use Carp;
72
73 our $VERSION = '1.02';
74 our $MODEL;
75
76 our $AUTOLOAD;
77 our @ISA;
78
79 our $verbose = $ENV{PERL_ANYEVENT_VERBOSE}*1;
80
81 our @REGISTRY;
82
83 my @models = (
84 [Coro::Event:: => AnyEvent::Impl::Coro::],
85 [Event:: => AnyEvent::Impl::Event::],
86 [Glib:: => AnyEvent::Impl::Glib::],
87 [Tk:: => AnyEvent::Impl::Tk::],
88 );
89
90 our %method = map +($_ => 1), qw(io timer condvar broadcast wait cancel DESTROY);
91
92 sub AUTOLOAD {
93 $AUTOLOAD =~ s/.*://;
94
95 $method{$AUTOLOAD}
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) = @$_;
102 if (${"$package\::VERSION"} > 0) {
103 if (eval "require $model") {
104 $MODEL = $model;
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.";
125 }
126 }
127
128 @ISA = $MODEL;
129
130 my $class = shift;
131 $class->$AUTOLOAD (@_);
132 }
133
134 =back
135
136 =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 =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 =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 =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 Then it creates a write-watcher which gets called whenever an error occurs
236 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 $txb->{cb}->($txn) of $txn->{cb}; # also call callback
263 }
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 return $txn->{result};
271
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 =head1 SEE ALSO
320
321 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
327 =head1
328
329 =cut
330
331 1
332