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

Comparing Coro/Coro.pm (file contents):
Revision 1.134 by root, Sat Sep 22 14:42:56 2007 UTC vs.
Revision 1.138 by root, Wed Sep 26 19:27:04 2007 UTC

50 50
51our $idle; # idle handler 51our $idle; # idle handler
52our $main; # main coroutine 52our $main; # main coroutine
53our $current; # current coroutine 53our $current; # current coroutine
54 54
55our $VERSION = '3.7'; 55our $VERSION = '3.8';
56 56
57our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); 57our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub);
58our %EXPORT_TAGS = ( 58our %EXPORT_TAGS = (
59 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], 59 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
60); 60);
155 # call all destruction callbacks 155 # call all destruction callbacks
156 $_->(@{$self->{status}}) 156 $_->(@{$self->{status}})
157 for @{(delete $self->{destroy_cb}) || []}; 157 for @{(delete $self->{destroy_cb}) || []};
158} 158}
159 159
160sub _do_trace {
161 $current->{_trace_cb}->();
162}
163
160# this coroutine is necessary because a coroutine 164# this coroutine is necessary because a coroutine
161# cannot destroy itself. 165# cannot destroy itself.
162my @destroy; 166my @destroy;
163my $manager; 167my $manager;
164 168
241 my $cb; 245 my $cb;
242 246
243 while () { 247 while () {
244 eval { 248 eval {
245 while () { 249 while () {
246 $cb = &_pool_1 250 _pool_1 $cb;
247 or return;
248
249 &$cb; 251 &$cb;
250 252 _pool_2 $cb;
251 return if &_pool_2;
252
253 undef $cb;
254 schedule; 253 &schedule;
255 } 254 }
256 }; 255 };
257 256
257 last if $@ eq "\3terminate\2\n";
258 warn $@ if $@; 258 warn $@ if $@;
259 } 259 }
260} 260}
261 261
262sub async_pool(&@) { 262sub async_pool(&@) {
263 # this is also inlined into the unlock_scheduler 263 # this is also inlined into the unlock_scheduler
264 my $coro = (pop @async_pool) || new Coro \&pool_handler;; 264 my $coro = (pop @async_pool) || new Coro \&pool_handler;
265 265
266 $coro->{_invoke} = [@_]; 266 $coro->{_invoke} = [@_];
267 $coro->ready; 267 $coro->ready;
268 268
269 $coro 269 $coro

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines