[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に無いですね。
#有ったとしても遅くなるだけの気がしますし。