1#include "protobuf.h" 2 3#include <zend_hash.h> 4 5ZEND_DECLARE_MODULE_GLOBALS(protobuf) 6static PHP_GINIT_FUNCTION(protobuf); 7static PHP_GSHUTDOWN_FUNCTION(protobuf); 8 9// ----------------------------------------------------------------------------- 10// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor 11// instances. 12// ----------------------------------------------------------------------------- 13 14void add_def_obj(const void* def, zval* value) { 15 uint nIndex = (ulong)def & PROTOBUF_G(upb_def_to_php_obj_map).nTableMask; 16 17 zval* pDest = NULL; 18 Z_ADDREF_P(value); 19 zend_hash_index_update(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def, 20 &value, sizeof(zval*), &pDest); 21} 22 23zval* get_def_obj(const void* def) { 24 zval** value; 25 if (zend_hash_index_find(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def, 26 &value) == FAILURE) { 27 zend_error(E_ERROR, "PHP object not found for given definition.\n"); 28 return NULL; 29 } 30 return *value; 31} 32 33// ----------------------------------------------------------------------------- 34// Utilities. 35// ----------------------------------------------------------------------------- 36 37// define the function(s) we want to add 38zend_function_entry protobuf_functions[] = { 39 ZEND_FE(get_generated_pool, NULL) 40 ZEND_FE_END 41}; 42 43// "protobuf_functions" refers to the struct defined above 44// we'll be filling in more of this later: you can use this to specify 45// globals, php.ini info, startup and teardown functions, etc. 46zend_module_entry protobuf_module_entry = { 47 STANDARD_MODULE_HEADER, 48 PHP_PROTOBUF_EXTNAME, // extension name 49 protobuf_functions, // function list 50 PHP_MINIT(protobuf), // process startup 51 NULL, // process shutdown 52 NULL, // request startup 53 NULL, // request shutdown 54 NULL, // extension info 55 PHP_PROTOBUF_VERSION, // extension version 56 PHP_MODULE_GLOBALS(protobuf), // globals descriptor 57 PHP_GINIT(protobuf), // globals ctor 58 PHP_GSHUTDOWN(protobuf), // globals dtor 59 NULL, // post deactivate 60 STANDARD_MODULE_PROPERTIES_EX 61}; 62 63// install module 64ZEND_GET_MODULE(protobuf) 65 66// global variables 67static PHP_GINIT_FUNCTION(protobuf) { 68 protobuf_globals->generated_pool = NULL; 69 generated_pool = NULL; 70 protobuf_globals->message_handlers = NULL; 71 zend_hash_init(&protobuf_globals->upb_def_to_php_obj_map, 16, NULL, 72 ZVAL_PTR_DTOR, 0); 73} 74 75static PHP_GSHUTDOWN_FUNCTION(protobuf) { 76 if (protobuf_globals->generated_pool != NULL) { 77 FREE_ZVAL(protobuf_globals->generated_pool); 78 } 79 if (protobuf_globals->message_handlers != NULL) { 80 FREE(protobuf_globals->message_handlers); 81 } 82 zend_hash_destroy(&protobuf_globals->upb_def_to_php_obj_map); 83} 84 85PHP_MINIT_FUNCTION(protobuf) { 86 descriptor_pool_init(TSRMLS_C); 87 descriptor_init(TSRMLS_C); 88 message_builder_context_init(TSRMLS_C); 89} 90