SVN::Client と SpeedyCGI の相性悪い

#!/usr/bin/speedy

use SVN::Client;

my $ctx = SVN::Client->new();

print "Content-Type: text/plain\n\nhello, world\n";

こんな単純なスクリプトを二度実行するだけで seg-fault します。

どうも永続化する環境と SVN::* の相性が悪いみたいで,おそらく SVN::Pool まわりのせいっぽいです*1

んで,対策ですが,案1としては,プロセス内で SVN::Client のインスタンスを永続化させる方法。案2としては,自力で pool を初期化/解放してやることです。具体的には,

# レスポンスハンドラ先頭で
SVN::_Core::apr_initialize();
$SVN::Core::gpool = SVN::Pool->new_default();
    # 隠しグローバル変数の $gpool ←グローバルプール
SVN::Core::utf_initialize($SVN::Core::gpool);

my $ctx = SVN::Client->new( ... );
# $ctx をいろいろいじる
# blah, blah, blah, blah, ...

# レスポンスハンドラ最後で
SVN::_Core::apr_terminate();

のような感じです。SVN::Client->new() で pool を指定できるので,そこに SVN::Pool->new_default() をつっこんでもいいのですが,とにかくミソは,pool を再生成することと,その両端で apr_initialize() 〜 apr_terminate() をすることです。激しく BK ですが。

*1:永続化する環境と書きましたが,なぜか mod_perl2 だと大丈夫でした