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

Comparing cvsroot/Coro/Coro.pm (file contents):
Revision 1.249 by root, Mon Dec 15 15:21:25 2008 UTC vs.
Revision 1.265 by root, Sat Aug 22 22:36:23 2009 UTC

80 80
81our $idle; # idle handler 81our $idle; # idle handler
82our $main; # main coro 82our $main; # main coro
83our $current; # current coro 83our $current; # current coro
84 84
85our $VERSION = 5.13; 85our $VERSION = 5.17;
86 86
87our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); 87our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub);
88our %EXPORT_TAGS = ( 88our %EXPORT_TAGS = (
89 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], 89 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
90); 90);
206Example: Create a new coro that just prints its arguments. 206Example: Create a new coro that just prints its arguments.
207 207
208 async { 208 async {
209 print "@_\n"; 209 print "@_\n";
210 } 1,2,3,4; 210 } 1,2,3,4;
211
212=cut
213
214sub async(&@) {
215 my $coro = new Coro @_;
216 $coro->ready;
217 $coro
218}
219 211
220=item async_pool { ... } [@args...] 212=item async_pool { ... } [@args...]
221 213
222Similar to C<async>, but uses a coro pool, so you should not call 214Similar to C<async>, but uses a coro pool, so you should not call
223terminate or join on it (although you are allowed to), and you get a 215terminate or join on it (although you are allowed to), and you get a
338 330
339These functions implement the same concept as C<dynamic-wind> in scheme 331These functions implement the same concept as C<dynamic-wind> in scheme
340does, and are useful when you want to localise some resource to a specific 332does, and are useful when you want to localise some resource to a specific
341coro. 333coro.
342 334
343They slow down coro switching considerably for coros that use 335They slow down thread switching considerably for coros that use them
344them (But coro switching is still reasonably fast if the handlers are 336(about 40% for a BLOCK with a single assignment, so thread switching is
345fast). 337still reasonably fast if the handlers are fast).
346 338
347These functions are best understood by an example: The following function 339These functions are best understood by an example: The following function
348will change the current timezone to "Antarctica/South_Pole", which 340will change the current timezone to "Antarctica/South_Pole", which
349requires a call to C<tzset>, but by using C<on_enter> and C<on_leave>, 341requires a call to C<tzset>, but by using C<on_enter> and C<on_leave>,
350which remember/change the current timezone and restore the previous 342which remember/change the current timezone and restore the previous
351value, respectively, the timezone is only changes for the coro that 343value, respectively, the timezone is only changed for the coro that
352installed those handlers. 344installed those handlers.
353 345
354 use POSIX qw(tzset); 346 use POSIX qw(tzset);
355 347
356 async { 348 async {
373 }; 365 };
374 366
375This can be used to localise about any resource (locale, uid, current 367This can be used to localise about any resource (locale, uid, current
376working directory etc.) to a block, despite the existance of other 368working directory etc.) to a block, despite the existance of other
377coros. 369coros.
370
371Another interesting example implements time-sliced multitasking using
372interval timers (this could obviously be optimised, but does the job):
373
374 # "timeslice" the given block
375 sub timeslice(&) {
376 use Time::HiRes ();
377
378 Coro::on_enter {
379 # on entering the thread, we set an VTALRM handler to cede
380 $SIG{VTALRM} = sub { cede };
381 # and then start the interval timer
382 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0.01, 0.01;
383 };
384 Coro::on_leave {
385 # on leaving the thread, we stop the interval timer again
386 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0, 0;
387 };
388
389 &{+shift};
390 }
391
392 # use like this:
393 timeslice {
394 # The following is an endless loop that would normally
395 # monopolise the process. Since it runs in a timesliced
396 # environment, it will regularly cede to other threads.
397 while () { }
398 };
399
378 400
379=item killall 401=item killall
380 402
381Kills/terminates/cancels all coros except the currently running one. 403Kills/terminates/cancels all coros except the currently running one.
382 404
426the ready queue, do nothing and return false. 448the ready queue, do nothing and return false.
427 449
428This ensures that the scheduler will resume this coro automatically 450This ensures that the scheduler will resume this coro automatically
429once all the coro of higher priority and all coro of the same 451once all the coro of higher priority and all coro of the same
430priority that were put into the ready queue earlier have been resumed. 452priority that were put into the ready queue earlier have been resumed.
453
454=item $coro->suspend
455
456Suspends the specified coro. A suspended coro works just like any other
457coro, except that the scheduler will not select a suspended coro for
458execution.
459
460Suspending a coro can be useful when you want to keep the coro from
461running, but you don't want to destroy it, or when you want to temporarily
462freeze a coro (e.g. for debugging) to resume it later.
463
464A scenario for the former would be to suspend all (other) coros after a
465fork and keep them alive, so their destructors aren't called, but new
466coros can be created.
467
468=item $coro->resume
469
470If the specified coro was suspended, it will be resumed. Note that when
471the coro was in the ready queue when it was suspended, it might have been
472unreadied by the scheduler, so an activation might have been lost.
473
474To avoid this, it is best to put a suspended coro into the ready queue
475unconditionally, as every synchronisation mechanism must protect itself
476against spurious wakeups, and the one in the Coro family certainly do
477that.
431 478
432=item $is_ready = $coro->is_ready 479=item $is_ready = $coro->is_ready
433 480
434Returns true iff the Coro object is in the ready queue. Unless the Coro 481Returns true iff the Coro object is in the ready queue. Unless the Coro
435object gets destroyed, it will eventually be scheduled by the scheduler. 482object gets destroyed, it will eventually be scheduled by the scheduler.
696Wait for the specified rouse callback (or the last one that was created in 743Wait for the specified rouse callback (or the last one that was created in
697this coro). 744this coro).
698 745
699As soon as the callback is invoked (or when the callback was invoked 746As soon as the callback is invoked (or when the callback was invoked
700before C<rouse_wait>), it will return the arguments originally passed to 747before C<rouse_wait>), it will return the arguments originally passed to
701the rouse callback. 748the rouse callback. In scalar context, that means you get the I<last>
749argument, just as if C<rouse_wait> had a C<return ($a1, $a2, $a3...)>
750statement at the end.
702 751
703See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example. 752See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example.
704 753
705=back 754=back
706 755

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines