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 コールバックが実行されることがわかった。