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.254 by root, Tue Jun 16 17:19:08 2009 UTC vs.
Revision 1.261 by root, Mon Jul 20 23:46:28 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.132; 85our $VERSION = 5.16;
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);
373 }; 373 };
374 374
375This can be used to localise about any resource (locale, uid, current 375This can be used to localise about any resource (locale, uid, current
376working directory etc.) to a block, despite the existance of other 376working directory etc.) to a block, despite the existance of other
377coros. 377coros.
378
379Another interesting example implements time-sliced multitasking using
380interval timers (this could obviously be optimised, but does the job):
381
382 # "timeslice" the given block
383 sub timeslice(&) {
384 use Time::HiRes ();
385
386 Coro::on_enter {
387 # on entering the thread, we set an VTALRM handler to cede
388 $SIG{VTALRM} = sub { cede };
389 # and then start the interval timer
390 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0.01, 0.01;
391 };
392 Coro::on_leave {
393 # on leaving the thread, we stop the interval timer again
394 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0, 0;
395 };
396
397 &{+shift};
398 }
399
400 # use like this:
401 timeslice {
402 # The following is an endless loop that would normally
403 # monopolise the process. Since it runs in a timesliced
404 # environment, it will regularly cede to other threads.
405 while () { }
406 };
407
378 408
379=item killall 409=item killall
380 410
381Kills/terminates/cancels all coros except the currently running one. 411Kills/terminates/cancels all coros except the currently running one.
382 412
721Wait for the specified rouse callback (or the last one that was created in 751Wait for the specified rouse callback (or the last one that was created in
722this coro). 752this coro).
723 753
724As soon as the callback is invoked (or when the callback was invoked 754As soon as the callback is invoked (or when the callback was invoked
725before C<rouse_wait>), it will return the arguments originally passed to 755before C<rouse_wait>), it will return the arguments originally passed to
726the rouse callback. 756the rouse callback. In scalar context, that means you get the I<last>
757argument, just as if C<rouse_wait> had a C<return ($a1, $a2, $a3...)>
758statement at the end.
727 759
728See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example. 760See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example.
729 761
730=back 762=back
731 763

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines