PHP OpenGL extension 修正

openglglut の extension を有効にしてるだけで、
apache が segfault してた。

コードを読んだら、すぐ理由が判明。

GLUT binding

PHP_MINIT_FUNCTION(glut)
{

	<略>

        call_backs = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(call_backs, 0, NULL, ZVAL_PTR_DTOR, 0);
        menu_callbacks = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(menu_callbacks, 0, NULL, ZVAL_PTR_DTOR, 0);
        menu_entry_callbacks = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(menu_entry_callbacks, 0, NULL, ZVAL_PTR_DTOR, 0);
        return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(glut)
{
        zend_hash_destroy(call_backs);
        efree(call_backs);
        zend_hash_destroy(menu_callbacks);
        efree(menu_callbacks);
        zend_hash_destroy(menu_entry_callbacks);
        efree(menu_entry_callbacks);
        return SUCCESS;
}

いやいや、ありえんてー。対応取れてないやん。

PHP_RINIT_FUNCTION(glut)
{
        call_backs = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(call_backs, 0, NULL, ZVAL_PTR_DTOR, 0);
        menu_callbacks = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(menu_callbacks, 0, NULL, ZVAL_PTR_DTOR, 0);
        menu_entry_callbacks = (HashTable*)emalloc(sizeof(HashTable));
        zend_hash_init(menu_entry_callbacks, 0, NULL, ZVAL_PTR_DTOR, 0);
        return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(glut)
{
        zend_hash_destroy(call_backs);
        efree(call_backs);
        zend_hash_destroy(menu_callbacks);
        efree(menu_callbacks);
        zend_hash_destroy(menu_entry_callbacks);
        efree(menu_entry_callbacks);
        return SUCCESS;
}

修正しました。
glut を有効にしてるだけで apache が seg.fault する問題は解決するかな。

OpenGL binding

PHP_MINIT_FUNCTION(opengl)

	<略>

        // initialize other modules
        glu_init(module_number);

#ifdef PHP_OPENGL_OSMESA
        osmesa_init(module_number);
#endif
        return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(opengl)
{
        if (select_buffer != NULL)
                efree(select_buffer);
        if (glget_mask != NULL)
                efree(glget_mask);

        // shutdown other modules
        glu_request_shutdown();

#ifdef PHP_OPENGL_OSMESA
        osmesa_request_shutdown();
#endif

        return SUCCESS;
}

これも同様ですね。

PHP_RINIT_FUNCTION(opengl)
{
        // initialize other modules
        glu_init(module_number);

#ifdef PHP_OPENGL_OSMESA
        osmesa_init(module_number);
#endif
        return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(opengl)
{
        if (select_buffer != NULL) {
                efree(select_buffer);
		select_buffer = NULL;
	}
        // shutdown other modules
        glu_request_shutdown();

#ifdef PHP_OPENGL_OSMESA
        osmesa_request_shutdown();
#endif

        return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(opengl)
{
        if (glget_mask != NULL)
                efree(glget_mask);
}

修正 done っと。

対応が取れてない理由の推測

多分、OpenGLapache 越しに使うなんて考えてないだろうから、
M〜 も R〜 も一回きりしか動かない環境でしか試さなかったのかな。

でもよく考えたら、cli モードのときだけ、これらの extension を
読み込む手段を探した方が良いのではなかろうか。。。