diff options
Diffstat (limited to 'src/php/ext/grpc')
-rw-r--r-- | src/php/ext/grpc/call_credentials.c | 3 | ||||
-rw-r--r-- | src/php/ext/grpc/channel.c | 75 | ||||
-rw-r--r-- | src/php/ext/grpc/php7_wrapper.h | 29 | ||||
-rw-r--r-- | src/php/ext/grpc/php_grpc.c | 5 | ||||
-rw-r--r-- | src/php/ext/grpc/server.c | 37 | ||||
-rw-r--r-- | src/php/ext/grpc/version.h | 2 |
6 files changed, 79 insertions, 72 deletions
diff --git a/src/php/ext/grpc/call_credentials.c b/src/php/ext/grpc/call_credentials.c index 41c488a79c..d96dc7f3b7 100644 --- a/src/php/ext/grpc/call_credentials.c +++ b/src/php/ext/grpc/call_credentials.c @@ -35,6 +35,7 @@ #include <grpc/grpc.h> #include <grpc/grpc_security.h> +#include <grpc/support/log.h> #include <grpc/support/string_util.h> zend_class_entry *grpc_ce_call_credentials; @@ -178,8 +179,10 @@ int plugin_get_metadata( PHP_GRPC_DELREF(arg); + gpr_log(GPR_INFO, "GRPC_PHP: call credentials plugin function - begin"); /* call the user callback function */ zend_call_function(state->fci, state->fci_cache TSRMLS_CC); + gpr_log(GPR_INFO, "GRPC_PHP: call credentials plugin function - end"); *num_creds_md = 0; *status = GRPC_STATUS_OK; diff --git a/src/php/ext/grpc/channel.c b/src/php/ext/grpc/channel.c index 4054723b43..35adf6b342 100644 --- a/src/php/ext/grpc/channel.c +++ b/src/php/ext/grpc/channel.c @@ -54,12 +54,12 @@ static zend_object_handlers channel_ce_handlers; #endif static gpr_mu global_persistent_list_mu; int le_plink; +extern HashTable grpc_persistent_list; /* Frees and destroys an instance of wrapped_grpc_channel */ PHP_GRPC_FREE_WRAPPED_FUNC_START(wrapped_grpc_channel) - bool is_last_wrapper = false; - // In_persistent_list is used when the user don't close the channel. - // In this case, le in the list won't be freed. + // In_persistent_list is used when the user don't close the channel, + // In this case, channels not in the list should be freed. bool in_persistent_list = true; if (p->wrapper != NULL) { gpr_mu_lock(&p->wrapper->mu); @@ -69,51 +69,32 @@ PHP_GRPC_FREE_WRAPPED_FUNC_START(wrapped_grpc_channel) php_grpc_int key_len = strlen(p->wrapper->key); // only destroy the channel here if not found in the persistent list gpr_mu_lock(&global_persistent_list_mu); - if (!(PHP_GRPC_PERSISTENT_LIST_FIND(&EG(persistent_list), p->wrapper->key, + if (!(PHP_GRPC_PERSISTENT_LIST_FIND(&grpc_persistent_list, p->wrapper->key, key_len, rsrc))) { in_persistent_list = false; grpc_channel_destroy(p->wrapper->wrapped); free(p->wrapper->target); free(p->wrapper->args_hashstr); - if(p->wrapper->creds_hashstr != NULL){ + if (p->wrapper->creds_hashstr != NULL) { free(p->wrapper->creds_hashstr); p->wrapper->creds_hashstr = NULL; } + free(p->wrapper->key); + p->wrapper->wrapped = NULL; + p->wrapper->target = NULL; + p->wrapper->args_hashstr = NULL; + p->wrapper->key = NULL; } gpr_mu_unlock(&global_persistent_list_mu); } } p->wrapper->ref_count -= 1; - if (p->wrapper->ref_count == 0) { - is_last_wrapper = true; - } gpr_mu_unlock(&p->wrapper->mu); - if (is_last_wrapper) { - if (in_persistent_list) { - // If ref_count==0 and the key still in the list, it means the user - // don't call channel->close().persistent list should free the - // allocation in such case, as well as related wrapped channel. - if (p->wrapper->wrapped != NULL) { - gpr_mu_lock(&p->wrapper->mu); - grpc_channel_destroy(p->wrapper->wrapped); - free(p->wrapper->target); - free(p->wrapper->args_hashstr); - if(p->wrapper->creds_hashstr != NULL){ - free(p->wrapper->creds_hashstr); - p->wrapper->creds_hashstr = NULL; - } - p->wrapper->wrapped = NULL; - php_grpc_delete_persistent_list_entry(p->wrapper->key, - strlen(p->wrapper->key) - TSRMLS_CC); - gpr_mu_unlock(&p->wrapper->mu); - } - } + if (!in_persistent_list) { gpr_mu_destroy(&p->wrapper->mu); - free(p->wrapper->key); free(p->wrapper); + p->wrapper = NULL; } - p->wrapper = NULL; } PHP_GRPC_FREE_WRAPPED_FUNC_END() @@ -214,7 +195,7 @@ void create_and_add_channel_to_persistent_list( le->channel = channel->wrapper; new_rsrc.ptr = le; gpr_mu_lock(&global_persistent_list_mu); - PHP_GRPC_PERSISTENT_LIST_UPDATE(&EG(persistent_list), key, key_len, + PHP_GRPC_PERSISTENT_LIST_UPDATE(&grpc_persistent_list, key, key_len, (void *)&new_rsrc); gpr_mu_unlock(&global_persistent_list_mu); } @@ -330,13 +311,12 @@ PHP_METHOD(Channel, __construct) { gpr_mu_init(&channel->wrapper->mu); smart_str_free(&buf); - if (force_new || (creds != NULL && creds->has_call_creds)) { // If the ChannelCredentials object was composed with a CallCredentials // object, there is no way we can tell them apart. Do NOT persist // them. They should be individually destroyed. create_channel(channel, target, args, creds); - } else if (!(PHP_GRPC_PERSISTENT_LIST_FIND(&EG(persistent_list), key, + } else if (!(PHP_GRPC_PERSISTENT_LIST_FIND(&grpc_persistent_list, key, key_len, rsrc))) { create_and_add_channel_to_persistent_list( channel, target, args, creds, key, key_len TSRMLS_CC); @@ -352,7 +332,7 @@ PHP_METHOD(Channel, __construct) { channel, target, args, creds, key, key_len TSRMLS_CC); } else { efree(args.args); - if (channel->wrapper->creds_hashstr != NULL){ + if (channel->wrapper->creds_hashstr != NULL) { free(channel->wrapper->creds_hashstr); channel->wrapper->creds_hashstr = NULL; } @@ -481,10 +461,10 @@ PHP_METHOD(Channel, close) { grpc_channel_destroy(channel->wrapper->wrapped); free(channel->wrapper->target); free(channel->wrapper->args_hashstr); - if(channel->wrapper->creds_hashstr != NULL){ - free(channel->wrapper->creds_hashstr); - channel->wrapper->creds_hashstr = NULL; - } + free(channel->wrapper->creds_hashstr); + channel->wrapper->creds_hashstr = NULL; + channel->wrapper->target = NULL; + channel->wrapper->args_hashstr = NULL; channel->wrapper->wrapped = NULL; channel->wrapper->is_valid = false; @@ -494,7 +474,7 @@ PHP_METHOD(Channel, close) { } } channel->wrapper->ref_count -= 1; - if(channel->wrapper->ref_count == 0){ + if (channel->wrapper->ref_count == 0) { // Mark that the wrapper can be freed because mu should be // destroyed outside the lock. is_last_wrapper = true; @@ -519,12 +499,12 @@ void php_grpc_delete_persistent_list_entry(char *key, php_grpc_int key_len TSRMLS_DC) { php_grpc_zend_resource *rsrc; gpr_mu_lock(&global_persistent_list_mu); - if (PHP_GRPC_PERSISTENT_LIST_FIND(&EG(persistent_list), key, + if (PHP_GRPC_PERSISTENT_LIST_FIND(&grpc_persistent_list, key, key_len, rsrc)) { channel_persistent_le_t *le; le = (channel_persistent_le_t *)rsrc->ptr; le->channel = NULL; - php_grpc_zend_hash_del(&EG(persistent_list), key, key_len+1); + php_grpc_zend_hash_del(&grpc_persistent_list, key, key_len+1); free(le); } gpr_mu_unlock(&global_persistent_list_mu); @@ -534,12 +514,19 @@ void php_grpc_delete_persistent_list_entry(char *key, php_grpc_int key_len static void php_grpc_channel_plink_dtor(php_grpc_zend_resource *rsrc TSRMLS_DC) { channel_persistent_le_t *le = (channel_persistent_le_t *)rsrc->ptr; + if (le == NULL) { + return; + } if (le->channel != NULL) { gpr_mu_lock(&le->channel->mu); if (le->channel->wrapped != NULL) { grpc_channel_destroy(le->channel->wrapped); - free(le->channel->target); free(le->channel->args_hashstr); + le->channel->wrapped = NULL; + le->channel->target = NULL; + le->channel->args_hashstr = NULL; + free(le->channel->key); + le->channel->key = NULL; } gpr_mu_unlock(&le->channel->mu); } @@ -587,6 +574,8 @@ GRPC_STARTUP_FUNCTION(channel) { gpr_mu_init(&global_persistent_list_mu); le_plink = zend_register_list_destructors_ex( NULL, php_grpc_channel_plink_dtor, "Persistent Channel", module_number); + zend_hash_init_ex(&grpc_persistent_list, 20, NULL, + EG(persistent_list).pDestructor, 1, 0); PHP_GRPC_INIT_HANDLER(wrapped_grpc_channel, channel_ce_handlers); return SUCCESS; } diff --git a/src/php/ext/grpc/php7_wrapper.h b/src/php/ext/grpc/php7_wrapper.h index 2f4a53611c..0239e04f76 100644 --- a/src/php/ext/grpc/php7_wrapper.h +++ b/src/php/ext/grpc/php7_wrapper.h @@ -30,6 +30,8 @@ add_property_string(arg, name, context, b) #define php_grpc_add_property_stringl(res, name, str, len, b) \ add_property_stringl(res, name, str, len, b) +#define php_grpc_add_property_zval(res, name, val) \ + add_property_zval(res, name, val) #define php_grpc_add_next_index_stringl(data, str, len, b) \ add_next_index_stringl(data, str, len, b) @@ -38,6 +40,12 @@ #define PHP_GRPC_MAKE_STD_ZVAL(pzv) MAKE_STD_ZVAL(pzv) #define PHP_GRPC_FREE_STD_ZVAL(pzv) #define PHP_GRPC_DELREF(zv) Z_DELREF_P(zv) +#define PHP_GRPC_ADD_STRING_TO_ARRAY(val, key, key_len, str, dup) \ + add_assoc_string_ex(val, key, key_len , str, dup); +#define PHP_GRPC_ADD_LONG_TO_ARRAY(val, key, key_len, str) \ + add_assoc_long_ex(val, key, key_len, str); +#define PHP_GRPC_ADD_BOOL_TO_ARRAY(val, key, key_len, str) \ + add_assoc_bool_ex(val, key, key_len, str); #define RETURN_DESTROY_ZVAL(val) \ RETURN_ZVAL(val, false /* Don't execute copy constructor */, \ @@ -88,6 +96,9 @@ 0, NULL); \ data = *tmp##key; +#define PHP_GRPC_HASH_VALPTR_TO_VAL(data) \ + &data; + #define PHP_GRPC_HASH_FOREACH_LONG_KEY_VAL_START(ht, key, key_type, index,\ data) \ zval **tmp##key = NULL; \ @@ -128,6 +139,8 @@ static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len, #define PHP_GRPC_PERSISTENT_LIST_UPDATE(plist, key, len, rsrc) \ zend_hash_update(plist, key, len+1, rsrc, sizeof(php_grpc_zend_resource), \ NULL) +#define PHP_GRPC_PERSISTENT_LIST_SIZE(plist) \ + plist.nTableSize #define PHP_GRPC_GET_CLASS_ENTRY(object) zend_get_class_entry(object TSRMLS_CC) @@ -143,6 +156,11 @@ static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len, add_property_string(arg, name, context) #define php_grpc_add_property_stringl(res, name, str, len, b) \ add_property_stringl(res, name, str, len) +#define php_grpc_add_property_zval(res, name, val) do { \ + zval tmp; \ + tmp = *val; \ + add_property_zval(res, name, &tmp); \ + } while(0) #define php_grpc_add_next_index_stringl(data, str, len, b) \ add_next_index_stringl(data, str, len) @@ -152,6 +170,12 @@ static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len, pzv = (zval *)emalloc(sizeof(zval)); #define PHP_GRPC_FREE_STD_ZVAL(pzv) efree(pzv); #define PHP_GRPC_DELREF(zv) +#define PHP_GRPC_ADD_STRING_TO_ARRAY(val, key, key_len, str, dup) \ + add_assoc_string_ex(val, key, key_len - 1, str); +#define PHP_GRPC_ADD_LONG_TO_ARRAY(val, key, key_len, str) \ + add_assoc_long_ex(val, key, key_len - 1, str); +#define PHP_GRPC_ADD_BOOL_TO_ARRAY(val, key, key_len, str) \ + add_assoc_bool_ex(val, key, key_len - 1, str); #define RETURN_DESTROY_ZVAL(val) \ RETVAL_ZVAL(val, false /* Don't execute copy constructor */, \ @@ -193,6 +217,9 @@ static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len, if ((zs_##key) == NULL) {key = NULL; key_type = HASH_KEY_IS_LONG;} \ else {key = (zs_##key)->val; key_type = HASH_KEY_IS_STRING;} +#define PHP_GRPC_HASH_VALPTR_TO_VAL(data) \ + Z_PTR_P(data); + #define PHP_GRPC_HASH_FOREACH_LONG_KEY_VAL_START(ht, key, key_type, index, \ data) \ zend_string *(zs_##key); \ @@ -230,6 +257,8 @@ static inline int php_grpc_zend_hash_del(HashTable *ht, char *key, int len) { #define PHP_GRPC_PERSISTENT_LIST_UPDATE(plist, key, len, rsrc) \ zend_hash_str_update_mem(plist, key, len, rsrc, \ sizeof(php_grpc_zend_resource)) +#define PHP_GRPC_PERSISTENT_LIST_SIZE(plist) \ + zend_array_count(plist) #define PHP_GRPC_GET_CLASS_ENTRY(object) Z_OBJ_P(object)->ce diff --git a/src/php/ext/grpc/php_grpc.c b/src/php/ext/grpc/php_grpc.c index 5971babc00..883ee6f3e5 100644 --- a/src/php/ext/grpc/php_grpc.c +++ b/src/php/ext/grpc/php_grpc.c @@ -36,7 +36,7 @@ ZEND_DECLARE_MODULE_GLOBALS(grpc) static PHP_GINIT_FUNCTION(grpc); - +HashTable grpc_persistent_list; /* {{{ grpc_functions[] * * Every user visible function must have an entry in grpc_functions[]. @@ -240,6 +240,8 @@ PHP_MSHUTDOWN_FUNCTION(grpc) { // WARNING: This function IS being called by PHP when the extension // is unloaded but the logs were somehow suppressed. if (GRPC_G(initialized)) { + zend_hash_clean(&grpc_persistent_list); + zend_hash_destroy(&grpc_persistent_list); grpc_shutdown_timeval(TSRMLS_C); grpc_php_shutdown_completion_queue(TSRMLS_C); grpc_shutdown(); @@ -256,7 +258,6 @@ PHP_MINFO_FUNCTION(grpc) { php_info_print_table_row(2, "grpc support", "enabled"); php_info_print_table_row(2, "grpc module version", PHP_GRPC_VERSION); php_info_print_table_end(); - /* Remove comments if you have entries in php.ini DISPLAY_INI_ENTRIES(); */ diff --git a/src/php/ext/grpc/server.c b/src/php/ext/grpc/server.c index a65d233017..292d512e37 100644 --- a/src/php/ext/grpc/server.c +++ b/src/php/ext/grpc/server.c @@ -89,8 +89,6 @@ PHP_METHOD(Server, __construct) { if (args_array == NULL) { server->wrapped = grpc_server_create(NULL, NULL); } else { - //TODO(thinkerou): deal it if key of array is long, crash now on php7 - // and update unit test case php_grpc_read_args_array(args_array, &args TSRMLS_CC); server->wrapped = grpc_server_create(&args, NULL); efree(args.args); @@ -118,8 +116,8 @@ PHP_METHOD(Server, requestCall) { grpc_call_details_init(&details); grpc_metadata_array_init(&metadata); error_code = - grpc_server_request_call(server->wrapped, &call, &details, &metadata, - completion_queue, completion_queue, NULL); + grpc_server_request_call(server->wrapped, &call, &details, &metadata, + completion_queue, completion_queue, NULL); if (error_code != GRPC_CALL_OK) { zend_throw_exception(spl_ce_LogicException, "request_call failed", (long)error_code TSRMLS_CC); @@ -140,25 +138,12 @@ PHP_METHOD(Server, requestCall) { php_grpc_add_property_string(result, "host", host_text, true); gpr_free(method_text); gpr_free(host_text); -#if PHP_MAJOR_VERSION < 7 - add_property_zval(result, "call", grpc_php_wrap_call(call, true TSRMLS_CC)); - add_property_zval(result, "absolute_deadline", - grpc_php_wrap_timeval(details.deadline TSRMLS_CC)); - add_property_zval(result, "metadata", grpc_parse_metadata_array(&metadata - TSRMLS_CC)); -#else - zval zv_call; - zval zv_timeval; - zval zv_md; - //TODO(thinkerou): why use zval* to unit test error? - zv_call = *grpc_php_wrap_call(call, true); - zv_timeval = *grpc_php_wrap_timeval(details.deadline); - zv_md = *grpc_parse_metadata_array(&metadata); - - add_property_zval(result, "call", &zv_call); - add_property_zval(result, "absolute_deadline", &zv_timeval); - add_property_zval(result, "metadata", &zv_md); -#endif + php_grpc_add_property_zval(result, "call", + grpc_php_wrap_call(call, true TSRMLS_CC)); + php_grpc_add_property_zval(result, "absolute_deadline", + grpc_php_wrap_timeval(details.deadline TSRMLS_CC)); + php_grpc_add_property_zval(result, "metadata", + grpc_parse_metadata_array(&metadata TSRMLS_CC)); cleanup: grpc_call_details_destroy(&details); @@ -202,9 +187,9 @@ PHP_METHOD(Server, addSecureHttp2Port) { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO", &addr, &addr_len, &creds_obj, grpc_ce_server_credentials) == FAILURE) { - zend_throw_exception( - spl_ce_InvalidArgumentException, - "add_http2_port expects a string and a ServerCredentials", 1 TSRMLS_CC); + zend_throw_exception(spl_ce_InvalidArgumentException, + "add_http2_port expects a string and a " + "ServerCredentials", 1 TSRMLS_CC); return; } wrapped_grpc_server_credentials *creds = diff --git a/src/php/ext/grpc/version.h b/src/php/ext/grpc/version.h index dd2a701ada..407d6347e6 100644 --- a/src/php/ext/grpc/version.h +++ b/src/php/ext/grpc/version.h @@ -20,6 +20,6 @@ #ifndef VERSION_H #define VERSION_H -#define PHP_GRPC_VERSION "1.11.0dev" +#define PHP_GRPC_VERSION "1.13.0dev" #endif /* VERSION_H */ |