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 だと大丈夫でした