メメメモモ

プログラミング、筋トレ、ゲーム、etc

Mojoliciousで動的に大きなファイルを配信する

こちらの記事を参考にさせていただきました。
http://perlcode.hateblo.jp/entry/20120321/1332488265

プロセスがずっとreadしつづけている?

ダウンロードが完了してうまくいっているように見えたのですが、
プロセスが残り続ける症状が出ました。

「strace -r -p {プロセス番号}」で、該当のプロセスを調べてみると、
ずっとreadし続けていました。
どうやらコールバックのループがうまく終了できていない様子。

コードを確認してみると以下の部分に原因がありそうでした。

    my $length = sysread($fh, my $buffer, $size);
    unless (defined $length) {
      close $fh;
      undef $cb;
      return;
    }


sysreadは読み込み失敗するとundefを返すのですが、
読み込むデータがない場合は0を返します。
該当のコードは終了処理に入っていませんでした。


以下のように修正しました。修正の仕方にちょっと自信がありませんが...

    my $length = sysread($fh, my $buffer, $size);
    unless ($length) {
      $c->write_chunk($buffer);
      close $fh;
      undef $cb;
      return;
    }