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.256 by root, Wed Jun 17 21:38: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.132;
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);
338 338
339These functions implement the same concept as C<dynamic-wind> in scheme 339These 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 340does, and are useful when you want to localise some resource to a specific
341coro. 341coro.
342 342
343They slow down coro switching considerably for coros that use 343They slow down thread switching considerably for coros that use them
344them (But coro switching is still reasonably fast if the handlers are 344(about 40% for a BLOCK with a single assignment, so thread switching is
345fast). 345still reasonably fast if the handlers are fast).
346 346
347These functions are best understood by an example: The following function 347These functions are best understood by an example: The following function
348will change the current timezone to "Antarctica/South_Pole", which 348will 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>, 349requires 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 350which remember/change the current timezone and restore the previous
351value, respectively, the timezone is only changes for the coro that 351value, respectively, the timezone is only changed for the coro that
352installed those handlers. 352installed those handlers.
353 353
354 use POSIX qw(tzset); 354 use POSIX qw(tzset);
355 355
356 async { 356 async {
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
426the ready queue, do nothing and return false. 456the ready queue, do nothing and return false.
427 457
428This ensures that the scheduler will resume this coro automatically 458This ensures that the scheduler will resume this coro automatically
429once all the coro of higher priority and all coro of the same 459once all the coro of higher priority and all coro of the same
430priority that were put into the ready queue earlier have been resumed. 460priority that were put into the ready queue earlier have been resumed.
461
462=item $coro->suspend
463
464Suspends the specified coro. A suspended coro works just like any other
465coro, except that the scheduler will not select a suspended coro for
466execution.
467
468Suspending a coro can be useful when you want to keep the coro from
469running, but you don't want to destroy it, or when you want to temporarily
470freeze a coro (e.g. for debugging) to resume it later.
471
472A scenario for the former would be to suspend all (other) coros after a
473fork and keep them alive, so their destructors aren't called, but new
474coros can be created.
475
476=item $coro->resume
477
478If the specified coro was suspended, it will be resumed. Note that when
479the coro was in the ready queue when it was suspended, it might have been
480unreadied by the scheduler, so an activation might have been lost.
481
482To avoid this, it is best to put a suspended coro into the ready queue
483unconditionally, as every synchronisation mechanism must protect itself
484against spurious wakeups, and the one in the Coro family certainly do
485that.
431 486
432=item $is_ready = $coro->is_ready 487=item $is_ready = $coro->is_ready
433 488
434Returns true iff the Coro object is in the ready queue. Unless the Coro 489Returns true iff the Coro object is in the ready queue. Unless the Coro
435object gets destroyed, it will eventually be scheduled by the scheduler. 490object gets destroyed, it will eventually be scheduled by the scheduler.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines