Home | History | Annotate | Download | only in protobuf
      1 #include "protobuf.h"
      2 
      3 #include <zend_hash.h>
      4 
      5 ZEND_DECLARE_MODULE_GLOBALS(protobuf)
      6 static PHP_GINIT_FUNCTION(protobuf);
      7 static PHP_GSHUTDOWN_FUNCTION(protobuf);
      8 
      9 // -----------------------------------------------------------------------------
     10 // Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
     11 // instances.
     12 // -----------------------------------------------------------------------------
     13 
     14 void 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 
     23 zval* 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
     38 zend_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.
     46 zend_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
     64 ZEND_GET_MODULE(protobuf)
     65 
     66 // global variables
     67 static 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 
     75 static 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 
     85 PHP_MINIT_FUNCTION(protobuf) {
     86   descriptor_pool_init(TSRMLS_C);
     87   descriptor_init(TSRMLS_C);
     88   message_builder_context_init(TSRMLS_C);
     89 }
     90