… | |
… | |
67 | |
67 | |
68 | our $idle; # idle handler |
68 | our $idle; # idle handler |
69 | our $main; # main coroutine |
69 | our $main; # main coroutine |
70 | our $current; # current coroutine |
70 | our $current; # current coroutine |
71 | |
71 | |
72 | our $VERSION = 4.8; |
72 | our $VERSION = 4.9; |
73 | |
73 | |
74 | our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); |
74 | our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); |
75 | our %EXPORT_TAGS = ( |
75 | our %EXPORT_TAGS = ( |
76 | prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], |
76 | prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], |
77 | ); |
77 | ); |
… | |
… | |
168 | while @destroy; |
168 | while @destroy; |
169 | |
169 | |
170 | &schedule; |
170 | &schedule; |
171 | } |
171 | } |
172 | }; |
172 | }; |
173 | $manager->desc ("[coro manager]"); |
173 | $manager->{desc} = "[coro manager]"; |
174 | $manager->prio (PRIO_MAX); |
174 | $manager->prio (PRIO_MAX); |
175 | |
175 | |
176 | =back |
176 | =back |
177 | |
177 | |
178 | =head2 SIMPLE COROUTINE CREATION |
178 | =head2 SIMPLE COROUTINE CREATION |
… | |
… | |
441 | } else { |
441 | } else { |
442 | $self->_cancel; |
442 | $self->_cancel; |
443 | } |
443 | } |
444 | } |
444 | } |
445 | |
445 | |
|
|
446 | =item $coroutine->throw ([$scalar]) |
|
|
447 | |
|
|
448 | If C<$throw> is specified and defined, it will be thrown as an exception |
|
|
449 | inside the coroutine at the next convenient point in time (usually after |
|
|
450 | it gains control at the next schedule/transfer/cede). Otherwise clears the |
|
|
451 | exception object. |
|
|
452 | |
|
|
453 | The exception object will be thrown "as is" with the specified scalar in |
|
|
454 | C<$@>, i.e. if it is a string, no line number or newline will be appended |
|
|
455 | (unlike with C<die>). |
|
|
456 | |
|
|
457 | This can be used as a softer means than C<cancel> to ask a coroutine to |
|
|
458 | end itself, although there is no guarantee that the exception will lead to |
|
|
459 | termination, and if the exception isn't caught it might well end the whole |
|
|
460 | program. |
|
|
461 | |
|
|
462 | You might also think of C<throw> as being the moral equivalent of |
|
|
463 | C<kill>ing a coroutine with a signal (in this case, a scalar). |
|
|
464 | |
446 | =item $coroutine->join |
465 | =item $coroutine->join |
447 | |
466 | |
448 | Wait until the coroutine terminates and return any values given to the |
467 | Wait until the coroutine terminates and return any values given to the |
449 | C<terminate> or C<cancel> functions. C<join> can be called concurrently |
468 | C<terminate> or C<cancel> functions. C<join> can be called concurrently |
450 | from multiple coroutines, and all will be resumed and given the status |
469 | from multiple coroutines, and all will be resumed and given the status |
… | |
… | |
511 | higher values mean lower priority, just as in unix). |
530 | higher values mean lower priority, just as in unix). |
512 | |
531 | |
513 | =item $olddesc = $coroutine->desc ($newdesc) |
532 | =item $olddesc = $coroutine->desc ($newdesc) |
514 | |
533 | |
515 | Sets (or gets in case the argument is missing) the description for this |
534 | Sets (or gets in case the argument is missing) the description for this |
516 | coroutine. This is just a free-form string you can associate with a coroutine. |
535 | coroutine. This is just a free-form string you can associate with a |
|
|
536 | coroutine. |
517 | |
537 | |
518 | This method simply sets the C<< $coroutine->{desc} >> member to the given string. You |
538 | This method simply sets the C<< $coroutine->{desc} >> member to the given |
519 | can modify this member directly if you wish. |
539 | string. You can modify this member directly if you wish. |
520 | |
|
|
521 | =item $coroutine->throw ([$scalar]) |
|
|
522 | |
|
|
523 | If C<$throw> is specified and defined, it will be thrown as an exception |
|
|
524 | inside the coroutine at the next convinient point in time (usually after |
|
|
525 | it gains control at the next schedule/transfer/cede). Otherwise clears the |
|
|
526 | exception object. |
|
|
527 | |
|
|
528 | The exception object will be thrown "as is" with the specified scalar in |
|
|
529 | C<$@>, i.e. if it is a string, no line number or newline will be appended |
|
|
530 | (unlike with C<die>). |
|
|
531 | |
|
|
532 | This can be used as a softer means than C<cancel> to ask a coroutine to |
|
|
533 | end itself, although there is no guarentee that the exception will lead to |
|
|
534 | termination, and if the exception isn't caught it might well end the whole |
|
|
535 | program. |
|
|
536 | |
540 | |
537 | =cut |
541 | =cut |
538 | |
542 | |
539 | sub desc { |
543 | sub desc { |
540 | my $old = $_[0]{desc}; |
544 | my $old = $_[0]{desc}; |
… | |
… | |
642 | cede; # for short-lived callbacks, this reduces pressure on the coro pool |
646 | cede; # for short-lived callbacks, this reduces pressure on the coro pool |
643 | } |
647 | } |
644 | schedule; # sleep well |
648 | schedule; # sleep well |
645 | } |
649 | } |
646 | }; |
650 | }; |
647 | $unblock_scheduler->desc ("[unblock_sub scheduler]"); |
651 | $unblock_scheduler->{desc} = "[unblock_sub scheduler]"; |
648 | |
652 | |
649 | sub unblock_sub(&) { |
653 | sub unblock_sub(&) { |
650 | my $cb = shift; |
654 | my $cb = shift; |
651 | |
655 | |
652 | sub { |
656 | sub { |