ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Event/Event.pm
(Generate patch)

Comparing Coro/Event/Event.pm (file contents):
Revision 1.9 by root, Tue Nov 27 02:59:37 2001 UTC vs.
Revision 1.40 by root, Fri Nov 24 15:34:33 2006 UTC

6 6
7 use Coro; 7 use Coro;
8 use Coro::Event; 8 use Coro::Event;
9 9
10 sub keyboard : Coro { 10 sub keyboard : Coro {
11 my $w = Coro::Event->io(fd => *STDIN, poll => 'r'); 11 my $w = Coro::Event->io(fd => \*STDIN, poll => 'r');
12 while() { 12 while() {
13 print "cmd> "; 13 print "cmd> ";
14 my $ev = $w->next; my $cmd = <STDIN>; 14 my $ev = $w->next; my $cmd = <STDIN>;
15 unloop unless $cmd ne ""; 15 unloop unless $cmd ne "";
16 print "data> "; 16 print "data> ";
30(I<flavour>) (see L<Event>). The only difference between these and the 30(I<flavour>) (see L<Event>). The only difference between these and the
31watcher constructors from Event is that you do not specify a callback 31watcher constructors from Event is that you do not specify a callback
32function - it will be managed by this module. 32function - it will be managed by this module.
33 33
34Your application should just create all necessary coroutines and then call 34Your application should just create all necessary coroutines and then call
35Coro::Event->main. 35Coro::Event::loop.
36
37Please note that even programs or modules (such as
38L<Coro::Handle|Coro::Handle>) that use "traditional"
39event-based/continuation style will run more efficient with this module
40then when using only Event.
36 41
37=over 4 42=over 4
38 43
39=cut 44=cut
40 45
41package Coro::Event; 46package Coro::Event;
42 47
43no warnings qw(uninitialized); 48BEGIN { eval { require warnings } && warnings->unimport ("uninitialized") }
44 49
45use Carp; 50use Carp;
51no warnings;
46 52
47use Coro; 53use Coro;
54use Coro::Timer;
48use Event qw(loop unloop); # we are re-exporting this, cooool! 55use Event qw(loop unloop); # we are re-exporting this, cooool!
49 56
50use base 'Exporter'; 57use XSLoader;
51 58
59use base Exporter::;
60
52@EXPORT = qw(loop unloop sweep reschedule); 61our @EXPORT = qw(loop unloop sweep reschedule);
53 62
54BEGIN { 63BEGIN {
55 $VERSION = 0.45; 64 our $VERSION = 1.9;
56 65
57 local $^W = 0; # avoid redefine warning for Coro::ready 66 local $^W = 0; # avoid redefine warning for Coro::ready;
58 require XSLoader;
59 XSLoader::load Coro::Event, $VERSION; 67 XSLoader::load __PACKAGE__, $VERSION;
60} 68}
61 69
62=item $w = Coro::Event->flavour(args...) 70=item $w = Coro::Event->flavour(args...)
63 71
64Create and return a watcher of the given type. 72Create and return a watcher of the given type.
92 @{"${class}::ISA"} = (Coro::Event::, "Event::$flavour"); 100 @{"${class}::ISA"} = (Coro::Event::, "Event::$flavour");
93 my $coronew = sub { 101 my $coronew = sub {
94 # how does one do method-call-by-name? 102 # how does one do method-call-by-name?
95 # my $w = $class->SUPER::$flavour(@_); 103 # my $w = $class->SUPER::$flavour(@_);
96 104
97 $_[0] eq Coro::Event:: 105 shift eq Coro::Event::
98 or croak "event constructor \"Coro::Event->$flavour\" must be called as a static method"; 106 or croak "event constructor \"Coro::Event->$flavour\" must be called as a static method";
99 107
100 my $q = []; # [$coro, $event]
101 my $w = $new->( 108 my $w = $new->($class,
102 desc => $flavour, 109 desc => $flavour,
103 @_, 110 @_,
104 parked => 1, 111 parked => 1,
105 ); 112 );
106 _install_std_cb($w, $type); 113 _install_std_cb($w, $type);
108 }; 115 };
109 *{ $flavour } = $coronew; 116 *{ $flavour } = $coronew;
110 *{"do_$flavour"} = sub { 117 *{"do_$flavour"} = sub {
111 unshift @_, Coro::Event::; 118 unshift @_, Coro::Event::;
112 my $e = (&$coronew)->next; 119 my $e = (&$coronew)->next;
113 $e->cancel; # $e = $e->w->cancel ($e == $e->w!) 120 $e->cancel; # $e === $e->w
114 $e; 121 $e;
115 }; 122 };
116} 123}
117 124
118# double calls to avoid stack-cloning ;() 125# double calls to avoid stack-cloning ;()
147 154
148This is the version of C<loop> you should use instead of C<Event::loop> 155This is the version of C<loop> you should use instead of C<Event::loop>
149when using this module - it will ensure correct scheduling in the presence 156when using this module - it will ensure correct scheduling in the presence
150of events. 157of events.
151 158
152=begin comment
153
154Unlike loop's counterpart it is not an error when no watchers are active -
155loop silently returns in this case, as if unloop(undef) were called.
156
157=end comment
158
159=cut
160
161# no longer do something special - it's done internally now
162
163#sub loop(;$) {
164# #local $Coro::idle = $Coro::current;
165# #Coro::schedule; # become idle task, which is implicitly ready
166# &Event::loop;
167#}
168
169=item unloop([$result]) 159=item unloop([$result])
170 160
171Same as Event::unloop (provided here for your convinience only). 161Same as Event::unloop (provided here for your convinience only).
172 162
173=cut 163=cut
174 164
175$Coro::idle = new Coro sub { 165$Coro::idle = \&Event::one_event; # inefficient
176 while () {
177 Event::one_event; # inefficient
178 Coro::schedule;
179 }
180};
181
182# provide hooks for Coro::Timer
183
184package Coro::Timer;
185
186unless ($override) {
187 $override = 1;
188 *_new_timer = sub {
189 Event->timer(at => $_[0], cb => $_[1]);
190 };
191}
192 166
1931; 1671;
194 168
169=back
170
195=head1 AUTHOR 171=head1 AUTHOR
196 172
197 Marc Lehmann <pcg@goof.com> 173 Marc Lehmann <schmorp@schmorp.de>
198 http://www.goof.com/pcg/marc/ 174 http://home.schmorp.de/
199 175
200=cut 176=cut
201 177

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines