[PHP-dev 146] Re: mgregex in PHP4.2?
Youichi Iwakiri
php-dev@php.gr.jp
Thu, 13 Dec 2001 21:04:41 +0900
いわきりです
Osamu Shigematsu wrote in <B83E8EF0.160DE%shige@ravi.ne.jp>:
>重松です。こんにちは。
>emalloc() が ruby の ruby_xmalloc() と等価かどうかまで知りませんので、
>調べてみたいと思います。
ruby_xmalloc()みたいにfree()を呼ばなくても未参照ポインタとなった
ものをガベージコレクタで回収するようには成っていなかったと思います。
以前ソースを追った時の記憶なのでちと不安ですが、
PHPスクリプトの開始時(request_initialize_handlerの呼出)以降に
拡張モジュールが確保しようとするメモリをemalloc()経由で確保します。
ここで確保出来なかった場合はPHP自体がSIGSEGVを自身に送って強制的に
終了となります。
また、確保したメモリは基本的には拡張モジュール側はefree()するように
作成すべきとなっています。
開放し忘れた場合はどうなるかというとPHPスクリプトの
終了時(request_shutdown_handlerの呼出の際)にPHP側で開放してくれて
いたと記憶しています。
PHPを--enable-debug付でmakeしておけばApacheのerror_logに
「どの拡張モジュールのソースの何行目で確保したメモリを開放してないぜぇ」
と警告メッセージが残ります。
ということで、最低でもrequest単位で無効な領域は開放されると認識しています。
#拡張モジュール側で確保/用意した変数はreference counterを
#持ってない*はずな*のでスクリプトの実行中はgc相当の機能で
#開放されないです。あれ、gc機能自体がPHPに無いですね。
#有ったとしても遅くなるだけの気がしますし。