#include "protobuf.h" #include ZEND_DECLARE_MODULE_GLOBALS(protobuf) static PHP_GINIT_FUNCTION(protobuf); static PHP_GSHUTDOWN_FUNCTION(protobuf); // ----------------------------------------------------------------------------- // Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor // instances. // ----------------------------------------------------------------------------- void add_def_obj(const void* def, zval* value) { uint nIndex = (ulong)def & PROTOBUF_G(upb_def_to_php_obj_map).nTableMask; zval* pDest = NULL; Z_ADDREF_P(value); zend_hash_index_update(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def, &value, sizeof(zval*), &pDest); } zval* get_def_obj(const void* def) { zval** value; if (zend_hash_index_find(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def, &value) == FAILURE) { zend_error(E_ERROR, "PHP object not found for given definition.\n"); return NULL; } return *value; } // ----------------------------------------------------------------------------- // Utilities. // ----------------------------------------------------------------------------- // define the function(s) we want to add zend_function_entry protobuf_functions[] = { ZEND_FE(get_generated_pool, NULL) ZEND_FE_END }; // "protobuf_functions" refers to the struct defined above // we'll be filling in more of this later: you can use this to specify // globals, php.ini info, startup and teardown functions, etc. zend_module_entry protobuf_module_entry = { STANDARD_MODULE_HEADER, PHP_PROTOBUF_EXTNAME, // extension name protobuf_functions, // function list PHP_MINIT(protobuf), // process startup NULL, // process shutdown NULL, // request startup NULL, // request shutdown NULL, // extension info PHP_PROTOBUF_VERSION, // extension version PHP_MODULE_GLOBALS(protobuf), // globals descriptor PHP_GINIT(protobuf), // globals ctor PHP_GSHUTDOWN(protobuf), // globals dtor NULL, // post deactivate STANDARD_MODULE_PROPERTIES_EX }; // install module ZEND_GET_MODULE(protobuf) // global variables static PHP_GINIT_FUNCTION(protobuf) { protobuf_globals->generated_pool = NULL; generated_pool = NULL; protobuf_globals->message_handlers = NULL; zend_hash_init(&protobuf_globals->upb_def_to_php_obj_map, 16, NULL, ZVAL_PTR_DTOR, 0); } static PHP_GSHUTDOWN_FUNCTION(protobuf) { if (protobuf_globals->generated_pool != NULL) { FREE_ZVAL(protobuf_globals->generated_pool); } if (protobuf_globals->message_handlers != NULL) { FREE(protobuf_globals->message_handlers); } zend_hash_destroy(&protobuf_globals->upb_def_to_php_obj_map); } PHP_MINIT_FUNCTION(protobuf) { descriptor_pool_init(TSRMLS_C); descriptor_init(TSRMLS_C); message_builder_context_init(TSRMLS_C); }