北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Template-Toolkit-2.22のメモリリーク【再】

以前Template::Plugin::Filterのリークを直すパッチを書いて2.19_02で採用されていたのですが、不具合があってrevertされてしまってました*1

2.22でリークするってのはこんなスクリプト書けばわかります(test::simple は自分でTemplate::Plugin::Filterを継承して作って)。

for my $l (1 .. 1000) {
    my $tpl = Template->new(
        PLUGIN_BASE  => 'test',
    );
    $tpl->context->plugin('simple', []);

    warn `ps -o rss= -p $$` if $l % 10 == 0;
}

ってことで、パッチを書いてリベンジ。リークがあるとどうしても MaxRequestsPerChild の値を極端に小さくしなければいけなかったりと色々困りもんなので、直って欲しいです。

もしかして: Xslate

2010-10-13 追記

ぼやいていたら @tokuhirom さんからアドバイスをもらいました。

それにしても TT 使ってる人はみんなどうしているんだろ。メモリリーク気にせず使っているのか、それとも、そもそも Filter のサブクラスなんて作ってないのかなあ。

@hiratara

filter のプラグインつくるだけなら Template::Plugin 直接つかってもいいですよね。

@tokuhirom

確かに、もともとのマツモさんのエントリでもそのような解決法をとっていました。

  1. 親クラスをTemplate::Plugin::FilterからTemplate::Pluginに
  2. initをnewに
  3. $self->install_filterを$context->define_filterに

それでもやっぱりTemplateToolkitがすき

*1:致命的な不具合なので、送ったパッチが悪かったです。