coro を cancel したときの on_destroy コールバックは cancel を実行した coro で実行される
昨日、ある coro A の on_destroy コールバックを実行する coro B が、A がみずから終了した場合 (B は coro manager) と外から cancel した場合 (B はメイン coro) で違うことを発見した。外から cancel した場合は、メイン coro から cancel したから B がメイン coro になったのでは、と推論して、次のスクリプトを動かしてみた。
use strict; use warnings; use Coro; my $c1 = async { $Coro::current->desc(q{c1}); cede while 1 }; $c1->on_destroy(sub { print $Coro::current->desc."\n";}); my $c2 = async { $Coro::current->desc(q{c2}); $c1->cancel; }; cede;
実行結果。
c2
ということで、他の coro を cancel したときには、cancel した coro で on_destroy コールバックが実行されることがわかった。