PHP OpenGL extension 修正
opengl や glut の 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; }
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 っと。