以前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 のサブクラスなんて作ってないのかなあ。
filter のプラグインつくるだけなら Template::Plugin 直接つかってもいいですよね。
確かに、もともとのマツモさんのエントリでもそのような解決法をとっていました。
- 親クラスをTemplate::Plugin::FilterからTemplate::Pluginに
- initをnewに
- $self->install_filterを$context->define_filterに
*1:致命的な不具合なので、送ったパッチが悪かったです。