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.2 by root, Fri Aug 17 01:45:39 2001 UTC vs.
Revision 1.9 by root, Tue Nov 27 02:59:37 2001 UTC

16 print "data> "; 16 print "data> ";
17 my $ev = $w->next; my $data = <STDIN>; 17 my $ev = $w->next; my $data = <STDIN>;
18 } 18 }
19 } 19 }
20 20
21 &loop; 21 loop;
22 22
23=head1 DESCRIPTION 23=head1 DESCRIPTION
24 24
25This module enables you to create programs using the powerful Event model 25This module enables you to create programs using the powerful Event model
26(and module), while retaining the linear style known from simple or 26(and module), while retaining the linear style known from simple or
38 38
39=cut 39=cut
40 40
41package Coro::Event; 41package Coro::Event;
42 42
43no warnings; 43no warnings qw(uninitialized);
44 44
45use Carp; 45use Carp;
46 46
47use Coro; 47use Coro;
48use Event qw(unloop); # we are re-exporting this, cooool! 48use Event qw(loop unloop); # we are re-exporting this, cooool!
49 49
50use base 'Exporter'; 50use base 'Exporter';
51 51
52@EXPORT = qw(loop unloop sweep); 52@EXPORT = qw(loop unloop sweep reschedule);
53 53
54BEGIN { 54BEGIN {
55 $VERSION = 0.45; 55 $VERSION = 0.45;
56 56
57 local $^W = 0; # avoid redefine warning for Coro::ready
57 require XSLoader; 58 require XSLoader;
58 XSLoader::load Coro::Event, $VERSION; 59 XSLoader::load Coro::Event, $VERSION;
59} 60}
60 61
61=item $w = Coro::Event->flavour(args...) 62=item $w = Coro::Event->flavour(args...)
80Create a watcher of the given type and immediately call it's next 81Create a watcher of the given type and immediately call it's next
81method. This is less efficient then calling the constructor once and the 82method. This is less efficient then calling the constructor once and the
82next method often, but it does save typing sometimes. 83next method often, but it does save typing sometimes.
83 84
84=cut 85=cut
85
86#sub std_cb {
87# my $w = $_[0]->w;
88# my $q = $w->private;
89# $q->[1] = $_[0];
90# if ($q->[0]) { # somebody waiting?
91# $q->[0]->ready;
92# &Coro::schedule;
93# } else {
94# $w->stop;
95# }
96#}
97 86
98for my $flavour (qw(idle var timer io signal)) { 87for my $flavour (qw(idle var timer io signal)) {
99 push @EXPORT, "do_$flavour"; 88 push @EXPORT, "do_$flavour";
100 my $new = \&{"Event::$flavour"}; 89 my $new = \&{"Event::$flavour"};
101 my $class = "Coro::Event::$flavour"; 90 my $class = "Coro::Event::$flavour";
119 }; 108 };
120 *{ $flavour } = $coronew; 109 *{ $flavour } = $coronew;
121 *{"do_$flavour"} = sub { 110 *{"do_$flavour"} = sub {
122 unshift @_, Coro::Event::; 111 unshift @_, Coro::Event::;
123 my $e = (&$coronew)->next; 112 my $e = (&$coronew)->next;
124 $e->w->cancel; 113 $e->cancel; # $e = $e->w->cancel ($e == $e->w!)
125 $e; 114 $e;
126 }; 115 };
127} 116}
128 117
129# double calls to avoid stack-cloning ;() 118# double calls to avoid stack-cloning ;()
130# is about 20% slower, though. 119# is about 10% slower, though.
131sub next($) { 120sub next($) {
132 &_next0; 121 &Coro::schedule if &_next; $_[0];
133 &Coro::schedule;
134 &_next1;
135} 122}
136 123
137#sub next {
138# my $w = $_[0];
139# my $q = $w->private;
140# if ($q->[1]) { # event waiting?
141# $w->again unless $w->is_cancelled;
142# } elsif ($q->[0]) {
143# croak "only one coroutine can wait for an event";
144# } else {
145# local $q->[0] = $Coro::current;
146# &Coro::schedule;
147# }
148# pop @$q;
149#}
150
151sub Coro::Event::Ev::w { $_[0][2] } 124sub Coro::Event::w { $_[0] }
125sub Coro::Event::prio { $_[0]{Coro::Event}[3] }
126sub Coro::Event::hits { $_[0]{Coro::Event}[4] }
152sub Coro::Event::Ev::got { $_[0][3] } 127sub Coro::Event::got { $_[0]{Coro::Event}[5] }
153sub Coro::Event::Ev::prio { croak "prio not supported yet, please mail to pcg\@goof.com" }
154sub Coro::Event::Ev::hits { croak "prio not supported yet, please mail to pcg\@goof.com" }
155 128
156=item sweep 129=item sweep
157 130
158Similar to Event::one_event and Event::sweep: The idle task is called once 131Similar to Event::one_event and Event::sweep: The idle task is called once
159(this has the effect of jumping back into the Event loop once to serve new 132(this has the effect of jumping back into the Event loop once to serve new
165into the Event dispatcher. 138into the Event dispatcher.
166 139
167=cut 140=cut
168 141
169sub sweep { 142sub sweep {
170 one_event(0); # for now 143 Event::one_event(0); # for now
171} 144}
172 145
173=item $result = loop([$timeout]) 146=item $result = loop([$timeout])
174 147
175This is the version of C<loop> you should use instead of C<Event::loop> 148This is the version of C<loop> you should use instead of C<Event::loop>
183 156
184=end comment 157=end comment
185 158
186=cut 159=cut
187 160
161# no longer do something special - it's done internally now
162
188sub loop(;$) { 163#sub loop(;$) {
189 local $Coro::idle = $Coro::current; 164# #local $Coro::idle = $Coro::current;
190 Coro::schedule; # become idle task, which is implicitly ready 165# #Coro::schedule; # become idle task, which is implicitly ready
191 &Event::loop; 166# &Event::loop;
192} 167#}
193 168
194=item unloop([$result]) 169=item unloop([$result])
195 170
196Same as Event::unloop (provided here for your convinience only). 171Same as Event::unloop (provided here for your convinience only).
197 172
202 Event::one_event; # inefficient 177 Event::one_event; # inefficient
203 Coro::schedule; 178 Coro::schedule;
204 } 179 }
205}; 180};
206 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
2071; 1931;
208 194
209=head1 AUTHOR 195=head1 AUTHOR
210 196
211 Marc Lehmann <pcg@goof.com> 197 Marc Lehmann <pcg@goof.com>

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines