--- Coro/Coro.pm 2009/10/01 23:25:03 1.269 +++ Coro/Coro.pm 2010/12/07 17:13:43 1.281 @@ -83,9 +83,9 @@ our $main; # main coro our $current; # current coro -our $VERSION = 5.17; +our $VERSION = 5.25; -our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); +our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub rouse_cb rouse_wait); our %EXPORT_TAGS = ( prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], ); @@ -126,37 +126,25 @@ usually better to rely on L or L, as this is pretty low-level functionality. -This variable stores either a Coro object or a callback. +This variable stores a Coro object that is put into the ready queue when +there are no other ready threads (without invoking any ready hooks). -If it is a callback, the it is called whenever the scheduler finds no -ready coros to run. The default implementation prints "FATAL: -deadlock detected" and exits, because the program has no other way to -continue. - -If it is a coro object, then this object will be readied (without -invoking any ready hooks, however) when the scheduler finds no other ready -coros to run. +The default implementation dies with "FATAL: deadlock detected.", followed +by a thread listing, because the program has no other way to continue. This hook is overwritten by modules such as C and C to wait on an external event that hopefully wake up a coro so the scheduler can run it. -Note that the callback I, under any circumstances, block -the current coro. Normally, this is achieved by having an "idle -coro" that calls the event loop and then blocks again, and then -readying that coro in the idle handler, or by simply placing the idle -coro in this variable. - -See L or L for examples of using this -technique. - -Please note that if your callback recursively invokes perl (e.g. for event -handlers), then it must be prepared to be called recursively itself. +See L or L for examples of using this technique. =cut -$idle = sub { - Carp::confess ("FATAL: deadlock detected"); +# ||= because other modules could have provided their own by now +$idle ||= new Coro sub { + require Coro::Debug; + die "FATAL: deadlock detected.\n" + . Coro::Debug::ps_listing (); }; # this coro is necessary because a coro @@ -274,7 +262,7 @@ Calls the scheduler. The scheduler will find the next coro that is to be run from the ready queue and switches to it. The next coro to be run is simply the one with the highest priority that is longest -in its ready queue. If there is no coro ready, it will clal the +in its ready queue. If there is no coro ready, it will call the C<$Coro::idle> hook. Please note that the current coro will I be put into the ready @@ -627,7 +615,18 @@ coro. This method simply sets the C<< $coro->{desc} >> member to the given -string. You can modify this member directly if you wish. +string. You can modify this member directly if you wish, and in fact, this +is often preferred to indicate major processing states that cna then be +seen for example in a L session: + + sub my_long_function { + local $Coro::current->{desc} = "now in my_long_function"; + ... + $Coro::current->{desc} = "my_long_function: phase 1"; + ... + $Coro::current->{desc} = "my_long_function: phase 2"; + ... + } =cut @@ -680,6 +679,10 @@ otherwise you might suffer from crashes or worse. The only event library currently known that is safe to use without C is L. +Coro will try to catch you when you block in the event loop +("FATAL:$Coro::IDLE blocked itself"), but this is just best effort and +only works when you do not run your own event loop. + This function allows your callbacks to block by executing them in another coro where it is safe to block. One example where blocking is handy is when you use the L functions to save results to @@ -730,7 +733,7 @@ } } -=item $cb = Coro::rouse_cb +=item $cb = rouse_cb Create and return a "rouse callback". That's a code reference that, when called, will remember a copy of its arguments and notify the owner @@ -738,7 +741,7 @@ See the next function. -=item @args = Coro::rouse_wait [$cb] +=item @args = rouse_wait [$cb] Wait for the specified rouse callback (or the last one that was created in this coro). @@ -845,8 +848,9 @@ =item coro switching is not signal safe -You must not switch to another coro from within a signal handler -(only relevant with %SIG - most event libraries provide safe signals). +You must not switch to another coro from within a signal handler (only +relevant with %SIG - most event libraries provide safe signals), I +you are sure you are not interrupting a Coro function. That means you I call any function that might "block" the current coro - C, C C<< Coro::Semaphore->down >> or @@ -866,7 +870,7 @@ it is probably not obvious to everybody). What follows is an ultra-condensed version of my talk about threads in -scripting languages given onthe perl workshop 2009: +scripting languages given on the perl workshop 2009: The so-called "ithreads" were originally implemented for two reasons: first, to (badly) emulate unix processes on native win32 perls, and