aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/php/ext/grpc
diff options
context:
space:
mode:
Diffstat (limited to 'src/php/ext/grpc')
-rw-r--r--src/php/ext/grpc/call_credentials.c3
-rw-r--r--src/php/ext/grpc/channel.c75
-rw-r--r--src/php/ext/grpc/php7_wrapper.h29
-rw-r--r--src/php/ext/grpc/php_grpc.c5
-rw-r--r--src/php/ext/grpc/server.c37
-rw-r--r--src/php/ext/grpc/version.h2
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 */