attempt to fix mem leaks

pull/8154/head
thinkerou 8 years ago
parent d449003fe6
commit 8d770144c2
  1. 2
      src/php/ext/grpc/call.c
  2. 10
      src/php/ext/grpc/call_credentials.c
  3. 12
      src/php/ext/grpc/channel_credentials.c
  4. 12
      src/php/ext/grpc/php7_wrapper.h
  5. 4
      src/php/ext/grpc/php_grpc.h
  6. 4
      src/php/ext/grpc/server_credentials.c
  7. 42
      src/php/ext/grpc/timeval.c

@ -478,6 +478,7 @@ PHP_METHOD(Call, startBatch) {
true); true);
add_property_zval(result, "status", recv_status); add_property_zval(result, "status", recv_status);
PHP_GRPC_DELREF(recv_status); PHP_GRPC_DELREF(recv_status);
PHP_GRPC_FREE_STD_ZVAL(recv_status);
break; break;
case GRPC_OP_RECV_CLOSE_ON_SERVER: case GRPC_OP_RECV_CLOSE_ON_SERVER:
add_property_bool(result, "cancelled", cancelled); add_property_bool(result, "cancelled", cancelled);
@ -501,6 +502,7 @@ cleanup:
} }
if (ops[i].op == GRPC_OP_RECV_MESSAGE) { if (ops[i].op == GRPC_OP_RECV_MESSAGE) {
grpc_byte_buffer_destroy(message); grpc_byte_buffer_destroy(message);
PHP_GRPC_FREE_STD_ZVAL(message_str);
} }
} }
RETURN_DESTROY_ZVAL(result); RETURN_DESTROY_ZVAL(result);

@ -111,9 +111,7 @@ PHP_METHOD(CallCredentials, createComposite) {
grpc_call_credentials *creds = grpc_call_credentials *creds =
grpc_composite_call_credentials_create(cred1->wrapped, cred2->wrapped, grpc_composite_call_credentials_create(cred1->wrapped, cred2->wrapped,
NULL); NULL);
zval *creds_object; zval *creds_object = grpc_php_wrap_call_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_call_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }
@ -155,9 +153,7 @@ PHP_METHOD(CallCredentials, createFromPlugin) {
grpc_call_credentials *creds = grpc_call_credentials *creds =
grpc_metadata_credentials_create_from_plugin(plugin, NULL); grpc_metadata_credentials_create_from_plugin(plugin, NULL);
zval *creds_object; zval *creds_object = grpc_php_wrap_call_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_call_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }
@ -211,6 +207,8 @@ void plugin_destroy_state(void *ptr) {
plugin_state *state = (plugin_state *)ptr; plugin_state *state = (plugin_state *)ptr;
efree(state->fci); efree(state->fci);
efree(state->fci_cache); efree(state->fci_cache);
PHP_GRPC_FREE_STD_ZVAL(state->fci->params);
PHP_GRPC_FREE_STD_ZVAL(state->fci->retval);
efree(state); efree(state);
} }

@ -121,9 +121,7 @@ PHP_METHOD(ChannelCredentials, setDefaultRootsPem) {
*/ */
PHP_METHOD(ChannelCredentials, createDefault) { PHP_METHOD(ChannelCredentials, createDefault) {
grpc_channel_credentials *creds = grpc_google_default_credentials_create(); grpc_channel_credentials *creds = grpc_google_default_credentials_create();
zval *creds_object; zval *creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }
@ -160,9 +158,7 @@ PHP_METHOD(ChannelCredentials, createSsl) {
grpc_channel_credentials *creds = grpc_ssl_credentials_create( grpc_channel_credentials *creds = grpc_ssl_credentials_create(
pem_root_certs, pem_root_certs,
pem_key_cert_pair.private_key == NULL ? NULL : &pem_key_cert_pair, NULL); pem_key_cert_pair.private_key == NULL ? NULL : &pem_key_cert_pair, NULL);
zval *creds_object; zval *creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }
@ -191,9 +187,7 @@ PHP_METHOD(ChannelCredentials, createComposite) {
grpc_channel_credentials *creds = grpc_channel_credentials *creds =
grpc_composite_channel_credentials_create(cred1->wrapped, cred2->wrapped, grpc_composite_channel_credentials_create(cred1->wrapped, cred2->wrapped,
NULL); NULL);
zval *creds_object; zval *creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_channel_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }

@ -50,8 +50,13 @@
#define PHP_GRPC_RETURN_STRING(val, dup) RETURN_STRING(val, dup) #define PHP_GRPC_RETURN_STRING(val, dup) RETURN_STRING(val, dup)
#define PHP_GRPC_MAKE_STD_ZVAL(pzv) MAKE_STD_ZVAL(pzv) #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_DELREF(zv) Z_DELREF_P(zv)
#define RETURN_DESTROY_ZVAL(val) \
RETURN_ZVAL(val, false /* Don't execute copy constructor */, \
true /* Dealloc original before returning */)
#define PHP_GRPC_WRAP_OBJECT_START(name) \ #define PHP_GRPC_WRAP_OBJECT_START(name) \
typedef struct name { \ typedef struct name { \
zend_object std; zend_object std;
@ -144,8 +149,15 @@ static inline int php_grpc_zend_hash_find(HashTable *ht, char *key, int len,
#define PHP_GRPC_RETURN_STRING(val, dup) RETURN_STRING(val) #define PHP_GRPC_RETURN_STRING(val, dup) RETURN_STRING(val)
#define PHP_GRPC_MAKE_STD_ZVAL(pzv) \ #define PHP_GRPC_MAKE_STD_ZVAL(pzv) \
pzv = (zval *)emalloc(sizeof(zval)); pzv = (zval *)emalloc(sizeof(zval));
#define PHP_GRPC_FREE_STD_ZVAL(pzv) efree(pzv);
#define PHP_GRPC_DELREF(zv) #define PHP_GRPC_DELREF(zv)
#define RETURN_DESTROY_ZVAL(val) \
RETVAL_ZVAL(val, false /* Don't execute copy constructor */, \
true /* Dealloc original before returning */); \
efree(val); \
return
#define PHP_GRPC_WRAP_OBJECT_START(name) \ #define PHP_GRPC_WRAP_OBJECT_START(name) \
typedef struct name { typedef struct name {
#define PHP_GRPC_WRAP_OBJECT_END(name) \ #define PHP_GRPC_WRAP_OBJECT_END(name) \

@ -61,10 +61,6 @@ extern zend_module_entry grpc_module_entry;
#include "grpc/grpc.h" #include "grpc/grpc.h"
#define RETURN_DESTROY_ZVAL(val) \
RETURN_ZVAL(val, false /* Don't execute copy constructor */, \
true /* Dealloc original before returning */)
/* These are all function declarations */ /* These are all function declarations */
/* Code that runs at module initialization */ /* Code that runs at module initialization */
PHP_MINIT_FUNCTION(grpc); PHP_MINIT_FUNCTION(grpc);

@ -113,9 +113,7 @@ PHP_METHOD(ServerCredentials, createSsl) {
grpc_server_credentials *creds = grpc_ssl_server_credentials_create_ex( grpc_server_credentials *creds = grpc_ssl_server_credentials_create_ex(
pem_root_certs, &pem_key_cert_pair, 1, pem_root_certs, &pem_key_cert_pair, 1,
GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, NULL); GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, NULL);
zval *creds_object; zval *creds_object = grpc_php_wrap_server_credentials(creds TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(creds_object);
creds_object = grpc_php_wrap_server_credentials(creds TSRMLS_CC);
RETURN_DESTROY_ZVAL(creds_object); RETURN_DESTROY_ZVAL(creds_object);
} }

@ -115,11 +115,9 @@ PHP_METHOD(Timeval, add) {
} }
wrapped_grpc_timeval *self = Z_WRAPPED_GRPC_TIMEVAL_P(getThis()); wrapped_grpc_timeval *self = Z_WRAPPED_GRPC_TIMEVAL_P(getThis());
wrapped_grpc_timeval *other = Z_WRAPPED_GRPC_TIMEVAL_P(other_obj); wrapped_grpc_timeval *other = Z_WRAPPED_GRPC_TIMEVAL_P(other_obj);
zval *sum; zval *sum =
PHP_GRPC_MAKE_STD_ZVAL(sum); grpc_php_wrap_timeval(gpr_time_add(self->wrapped, other->wrapped)
sum = TSRMLS_CC);
grpc_php_wrap_timeval(gpr_time_add(self->wrapped, other->wrapped)
TSRMLS_CC);
RETURN_DESTROY_ZVAL(sum); RETURN_DESTROY_ZVAL(sum);
} }
@ -141,11 +139,9 @@ PHP_METHOD(Timeval, subtract) {
} }
wrapped_grpc_timeval *self = Z_WRAPPED_GRPC_TIMEVAL_P(getThis()); wrapped_grpc_timeval *self = Z_WRAPPED_GRPC_TIMEVAL_P(getThis());
wrapped_grpc_timeval *other = Z_WRAPPED_GRPC_TIMEVAL_P(other_obj); wrapped_grpc_timeval *other = Z_WRAPPED_GRPC_TIMEVAL_P(other_obj);
zval *diff; zval *diff =
PHP_GRPC_MAKE_STD_ZVAL(diff); grpc_php_wrap_timeval(gpr_time_sub(self->wrapped, other->wrapped)
diff = TSRMLS_CC);
grpc_php_wrap_timeval(gpr_time_sub(self->wrapped, other->wrapped)
TSRMLS_CC);
RETURN_DESTROY_ZVAL(diff); RETURN_DESTROY_ZVAL(diff);
} }
@ -206,9 +202,7 @@ PHP_METHOD(Timeval, similar) {
* @return Timeval The current time * @return Timeval The current time
*/ */
PHP_METHOD(Timeval, now) { PHP_METHOD(Timeval, now) {
zval *now; zval *now = grpc_php_wrap_timeval(gpr_now(GPR_CLOCK_REALTIME) TSRMLS_CC);
PHP_GRPC_MAKE_STD_ZVAL(now);
now = grpc_php_wrap_timeval(gpr_now(GPR_CLOCK_REALTIME) TSRMLS_CC);
RETURN_DESTROY_ZVAL(now); RETURN_DESTROY_ZVAL(now);
} }
@ -217,13 +211,9 @@ PHP_METHOD(Timeval, now) {
* @return Timeval Zero length time interval * @return Timeval Zero length time interval
*/ */
PHP_METHOD(Timeval, zero) { PHP_METHOD(Timeval, zero) {
zval *grpc_php_timeval_zero; zval *grpc_php_timeval_zero =
PHP_GRPC_MAKE_STD_ZVAL(grpc_php_timeval_zero); grpc_php_wrap_timeval(gpr_time_0(GPR_CLOCK_REALTIME) TSRMLS_CC);
grpc_php_timeval_zero = RETURN_DESTROY_ZVAL(grpc_php_timeval_zero);
grpc_php_wrap_timeval(gpr_time_0(GPR_CLOCK_REALTIME) TSRMLS_CC);
RETURN_ZVAL(grpc_php_timeval_zero,
false, /* Copy original before returning? */
true /* Destroy original before returning */);
} }
/** /**
@ -231,10 +221,8 @@ PHP_METHOD(Timeval, zero) {
* @return Timeval Infinite future time value * @return Timeval Infinite future time value
*/ */
PHP_METHOD(Timeval, infFuture) { PHP_METHOD(Timeval, infFuture) {
zval *grpc_php_timeval_inf_future; zval *grpc_php_timeval_inf_future =
PHP_GRPC_MAKE_STD_ZVAL(grpc_php_timeval_inf_future); grpc_php_wrap_timeval(gpr_inf_future(GPR_CLOCK_REALTIME) TSRMLS_CC);
grpc_php_timeval_inf_future =
grpc_php_wrap_timeval(gpr_inf_future(GPR_CLOCK_REALTIME) TSRMLS_CC);
RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_future); RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_future);
} }
@ -243,10 +231,8 @@ PHP_METHOD(Timeval, infFuture) {
* @return Timeval Infinite past time value * @return Timeval Infinite past time value
*/ */
PHP_METHOD(Timeval, infPast) { PHP_METHOD(Timeval, infPast) {
zval *grpc_php_timeval_inf_past; zval *grpc_php_timeval_inf_past =
PHP_GRPC_MAKE_STD_ZVAL(grpc_php_timeval_inf_past); grpc_php_wrap_timeval(gpr_inf_past(GPR_CLOCK_REALTIME) TSRMLS_CC);
grpc_php_timeval_inf_past =
grpc_php_wrap_timeval(gpr_inf_past(GPR_CLOCK_REALTIME) TSRMLS_CC);
RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_past); RETURN_DESTROY_ZVAL(grpc_php_timeval_inf_past);
} }

Loading…
Cancel
Save