Browse Source

Fix SegFault on serialization of objects A slight refactor of PR #2 - thanks @SwenVanZanten

Rasmus Lerdorf 4 years ago
parent
commit
9dc5082e63
10 changed files with 20 additions and 124 deletions
  1. 0 7
      gearman.stub.php
  2. 1 17
      gearman_arginfo.h
  3. 4 0
      php_gearman.c
  4. 2 5
      php_gearman_client.c
  5. 1 47
      php_gearman_client.h
  6. 4 6
      php_gearman_job.c
  7. 3 17
      php_gearman_job.h
  8. 2 4
      php_gearman_task.c
  9. 1 15
      php_gearman_task.h
  10. 2 6
      php_gearman_worker.c

+ 0 - 7
gearman.stub.php

@@ -11,7 +11,6 @@ function gearman_worker_create(): GearmanWorker|false {}
 class GearmanClient {
 
     public function __construct() {}
-    public function __destruct() {}
 
     /** @alias gearman_client_return_code */
     public function returnCode(): int {}
@@ -190,8 +189,6 @@ function gearman_client_enable_exception_handler(GearmanClient $obj): bool {}
 
 class GearmanJob {
 
-    public function __destruct() {}
-
     /** @alias gearman_job_return_code */
     public function returnCode(): ?int {}
 
@@ -250,8 +247,6 @@ class GearmanTask {
 
     public function __construct() {}
 
-    public function __destruct() {}
-
     /** @alias gearman_task_return_code */
     public function returnCode(): ?int {}
 
@@ -305,8 +300,6 @@ function gearman_task_recv_data(GearmanTask $obj, int $data_len): bool|array {}
 class GearmanWorker {
     public function __construct() {}
 
-    public function __destruct() {}
-
     /** @alias gearman_worker_return_code */
     public function returnCode(): ?int {}
 

+ 1 - 17
gearman_arginfo.h

@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 65cf41fa0f919b8cfa946208297d23ad20ce6a0d */
+ * Stub hash: 83876596992a2d5bc630b6c217f0f52c469872a3 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gearman_version, 0, 0, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -333,8 +333,6 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_GearmanClient___construct, 0, 0, 0)
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_GearmanClient___destruct arginfo_class_GearmanClient___construct
-
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_GearmanClient_returnCode, 0, 0, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
@@ -457,8 +455,6 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_GearmanClient_enableExceptionHandler arginfo_class_GearmanClient_wait
 
-#define arginfo_class_GearmanJob___destruct arginfo_class_GearmanClient___construct
-
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_GearmanJob_returnCode, 0, 0, IS_LONG, 1)
 ZEND_END_ARG_INFO()
 
@@ -502,8 +498,6 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_GearmanTask___construct arginfo_class_GearmanClient___construct
 
-#define arginfo_class_GearmanTask___destruct arginfo_class_GearmanClient___construct
-
 #define arginfo_class_GearmanTask_returnCode arginfo_class_GearmanJob_returnCode
 
 #define arginfo_class_GearmanTask_functionName arginfo_class_GearmanJob_handle
@@ -536,8 +530,6 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_GearmanWorker___construct arginfo_class_GearmanClient___construct
 
-#define arginfo_class_GearmanWorker___destruct arginfo_class_GearmanClient___construct
-
 #define arginfo_class_GearmanWorker_returnCode arginfo_class_GearmanJob_returnCode
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_GearmanWorker_error, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
@@ -693,12 +685,8 @@ ZEND_FUNCTION(gearman_worker_add_function);
 ZEND_FUNCTION(gearman_worker_work);
 ZEND_FUNCTION(gearman_worker_ping);
 ZEND_METHOD(GearmanClient, __construct);
-ZEND_METHOD(GearmanClient, __destruct);
-ZEND_METHOD(GearmanJob, __destruct);
 ZEND_METHOD(GearmanTask, __construct);
-ZEND_METHOD(GearmanTask, __destruct);
 ZEND_METHOD(GearmanWorker, __construct);
-ZEND_METHOD(GearmanWorker, __destruct);
 
 
 static const zend_function_entry ext_functions[] = {
@@ -801,7 +789,6 @@ static const zend_function_entry ext_functions[] = {
 
 static const zend_function_entry class_GearmanClient_methods[] = {
 	ZEND_ME(GearmanClient, __construct, arginfo_class_GearmanClient___construct, ZEND_ACC_PUBLIC)
-	ZEND_ME(GearmanClient, __destruct, arginfo_class_GearmanClient___destruct, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(returnCode, gearman_client_return_code, arginfo_class_GearmanClient_returnCode, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(error, gearman_client_error, arginfo_class_GearmanClient_error, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(getErrno, gearman_client_get_errno, arginfo_class_GearmanClient_getErrno, ZEND_ACC_PUBLIC)
@@ -850,7 +837,6 @@ static const zend_function_entry class_GearmanClient_methods[] = {
 
 
 static const zend_function_entry class_GearmanJob_methods[] = {
-	ZEND_ME(GearmanJob, __destruct, arginfo_class_GearmanJob___destruct, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(returnCode, gearman_job_return_code, arginfo_class_GearmanJob_returnCode, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(setReturn, gearman_job_set_return, arginfo_class_GearmanJob_setReturn, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(sendData, gearman_job_send_data, arginfo_class_GearmanJob_sendData, ZEND_ACC_PUBLIC)
@@ -870,7 +856,6 @@ static const zend_function_entry class_GearmanJob_methods[] = {
 
 static const zend_function_entry class_GearmanTask_methods[] = {
 	ZEND_ME(GearmanTask, __construct, arginfo_class_GearmanTask___construct, ZEND_ACC_PUBLIC)
-	ZEND_ME(GearmanTask, __destruct, arginfo_class_GearmanTask___destruct, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(returnCode, gearman_task_return_code, arginfo_class_GearmanTask_returnCode, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(functionName, gearman_task_function_name, arginfo_class_GearmanTask_functionName, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(unique, gearman_task_unique, arginfo_class_GearmanTask_unique, ZEND_ACC_PUBLIC)
@@ -889,7 +874,6 @@ static const zend_function_entry class_GearmanTask_methods[] = {
 
 static const zend_function_entry class_GearmanWorker_methods[] = {
 	ZEND_ME(GearmanWorker, __construct, arginfo_class_GearmanWorker___construct, ZEND_ACC_PUBLIC)
-	ZEND_ME(GearmanWorker, __destruct, arginfo_class_GearmanWorker___destruct, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(returnCode, gearman_worker_return_code, arginfo_class_GearmanWorker_returnCode, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(error, gearman_worker_error, arginfo_class_GearmanWorker_error, ZEND_ACC_PUBLIC)
 	ZEND_ME_MAPPING(getErrno, gearman_worker_errno, arginfo_class_GearmanWorker_getErrno, ZEND_ACC_PUBLIC)

+ 4 - 0
php_gearman.c

@@ -98,24 +98,28 @@ PHP_MINIT_FUNCTION(gearman) {
 	gearman_client_ce->create_object = gearman_client_obj_new;
 	memcpy(&gearman_client_obj_handlers, zend_get_std_object_handlers(), sizeof(gearman_client_obj_handlers));
 	gearman_client_obj_handlers.offset = XtOffsetOf(gearman_client_obj, std);
+	gearman_client_obj_handlers.free_obj = gearman_client_free_obj;
 
 	INIT_CLASS_ENTRY(ce, "GearmanTask", class_GearmanTask_methods);
 	gearman_task_ce = zend_register_internal_class(&ce);
 	gearman_task_ce->create_object = gearman_task_obj_new;
 	memcpy(&gearman_task_obj_handlers, zend_get_std_object_handlers(), sizeof(gearman_task_obj_handlers));
 	gearman_task_obj_handlers.offset = XtOffsetOf(gearman_task_obj, std);
+	gearman_task_obj_handlers.free_obj = gearman_task_free_obj;
 
 	INIT_CLASS_ENTRY(ce, "GearmanWorker", class_GearmanWorker_methods);
 	gearman_worker_ce = zend_register_internal_class(&ce);
 	gearman_worker_ce->create_object = gearman_worker_obj_new;
 	memcpy(&gearman_worker_obj_handlers, zend_get_std_object_handlers(), sizeof(gearman_worker_obj_handlers));
 	gearman_worker_obj_handlers.offset = XtOffsetOf(gearman_worker_obj, std);
+	gearman_worker_obj_handlers.free_obj = gearman_worker_free_obj;
 
 	INIT_CLASS_ENTRY(ce, "GearmanJob", class_GearmanJob_methods);
 	gearman_job_ce = zend_register_internal_class(&ce);
 	gearman_job_ce->create_object = gearman_job_obj_new;
 	memcpy(&gearman_job_obj_handlers, zend_get_std_object_handlers(), sizeof(gearman_job_obj_handlers));
 	gearman_job_obj_handlers.offset = XtOffsetOf(gearman_job_obj, std);
+	gearman_job_obj_handlers.free_obj = gearman_job_free_obj;
 
 	/* XXX exception class */
 	INIT_CLASS_ENTRY(ce, "GearmanException", class_GearmanException_methods)

+ 2 - 5
php_gearman_client.c

@@ -71,12 +71,9 @@ PHP_METHOD(GearmanClient, __construct)
 }
 /* }}} */
 
-/* {{{ proto object GearmanClient::__destruct()
-   cleans up GearmanClient object */
-PHP_METHOD(GearmanClient, __destruct)
-{
+void gearman_client_free_obj(zend_object *object) {
         char *context = NULL;
-        gearman_client_obj *intern = Z_GEARMAN_CLIENT_P(getThis());
+        gearman_client_obj *intern = gearman_client_fetch_object(object);
         if (!intern) {
                 return;
         }

+ 1 - 47
php_gearman_client.h

@@ -28,6 +28,7 @@
 extern zend_class_entry *gearman_client_ce;
 extern zend_object_handlers gearman_client_obj_handlers;
 
+void gearman_client_free_obj(zend_object *object);
 zend_object *gearman_client_obj_new(zend_class_entry *ce);
 
 typedef enum {
@@ -72,51 +73,4 @@ gearman_client_obj *gearman_client_fetch_object(zend_object *obj);
 					  (__ret) == GEARMAN_WORK_WARNING || \
 					  (__ret) == GEARMAN_WORK_FAIL)
 
-PHP_FUNCTION(gearman_client_create);
-PHP_METHOD(GearmanClient, __construct);
-PHP_METHOD(GearmanClient, __destruct);
-PHP_FUNCTION(gearman_client_return_code);
-PHP_FUNCTION(gearman_client_error);
-PHP_FUNCTION(gearman_client_get_errno);
-PHP_FUNCTION(gearman_client_options);
-PHP_FUNCTION(gearman_client_set_options);
-PHP_FUNCTION(gearman_client_add_options);
-PHP_FUNCTION(gearman_client_remove_options);
-PHP_FUNCTION(gearman_client_timeout);
-PHP_FUNCTION(gearman_client_set_timeout);
-PHP_FUNCTION(gearman_client_add_server);
-PHP_FUNCTION(gearman_client_add_servers);
-PHP_FUNCTION(gearman_client_wait);
-PHP_FUNCTION(gearman_client_do_normal);
-PHP_FUNCTION(gearman_client_do_high);
-PHP_FUNCTION(gearman_client_do_low);
-PHP_FUNCTION(gearman_client_do_background);
-PHP_FUNCTION(gearman_client_do_high_background);
-PHP_FUNCTION(gearman_client_do_low_background);
-PHP_FUNCTION(gearman_client_do_job_handle);
-PHP_FUNCTION(gearman_client_do_status);
-PHP_FUNCTION(gearman_client_job_status);
-PHP_FUNCTION(gearman_client_job_status_by_unique_key);
-PHP_FUNCTION(gearman_client_ping);
-PHP_FUNCTION(gearman_client_add_task);
-PHP_FUNCTION(gearman_client_add_task_high);
-PHP_FUNCTION(gearman_client_add_task_low);
-PHP_FUNCTION(gearman_client_add_task_background);
-PHP_FUNCTION(gearman_client_add_task_high_background);
-PHP_FUNCTION(gearman_client_add_task_low_background);
-PHP_FUNCTION(gearman_client_run_tasks);
-PHP_FUNCTION(gearman_client_add_task_status);
-PHP_FUNCTION(gearman_client_set_workload_callback);
-PHP_FUNCTION(gearman_client_set_created_callback);
-PHP_FUNCTION(gearman_client_set_data_callback);
-PHP_FUNCTION(gearman_client_set_warning_callback);
-PHP_FUNCTION(gearman_client_set_status_callback);
-PHP_FUNCTION(gearman_client_set_complete_callback);
-PHP_FUNCTION(gearman_client_set_exception_callback);
-PHP_FUNCTION(gearman_client_set_fail_callback);
-PHP_FUNCTION(gearman_client_clear_callbacks);
-PHP_FUNCTION(gearman_client_context);
-PHP_FUNCTION(gearman_client_set_context);
-PHP_FUNCTION(gearman_client_enable_exception_handler);
-
 #endif  /* __PHP_GEARMAN_CLIENT_H */

+ 4 - 6
php_gearman_job.c

@@ -11,20 +11,18 @@
 
 #include "php_gearman_job.h"
 
-gearman_job_obj *gearman_job_fetch_object(zend_object *obj) {
+inline gearman_job_obj *gearman_job_fetch_object(zend_object *obj) {
         return (gearman_job_obj *)((char*)(obj) - XtOffsetOf(gearman_job_obj, std));
 }
 
-/* {{{ proto object GearmanJob::__destruct()
-   cleans up GearmanJob object */
-PHP_METHOD(GearmanJob, __destruct) {
-        gearman_job_obj *intern = Z_GEARMAN_JOB_P(getThis());
+void gearman_job_free_obj(zend_object *object) {
+        gearman_job_obj *intern = gearman_job_fetch_object(object);
         if (!intern) {
                 return;
         }
 
         if (intern->flags & GEARMAN_JOB_OBJ_CREATED) {
-                gearman_job_free(intern->job);
+            gearman_job_free(intern->job);
         }
 
         zend_object_std_dtor(&intern->std);

+ 3 - 17
php_gearman_job.h

@@ -28,6 +28,7 @@
 extern zend_class_entry *gearman_job_ce;
 extern zend_object_handlers gearman_job_obj_handlers;
 
+void gearman_job_free_obj(zend_object *object);
 zend_object *gearman_job_obj_new(zend_class_entry *ce);
 
 typedef enum {
@@ -35,29 +36,14 @@ typedef enum {
 } gearman_job_obj_flags_t;
 
 typedef struct {
-        gearman_return_t ret; 
+        gearman_return_t ret;
         gearman_job_obj_flags_t flags;
         gearman_job_st *job;
 
-        zend_object std; 
+        zend_object std;
 } gearman_job_obj;
 
 gearman_job_obj *gearman_job_fetch_object(zend_object *obj);
 #define Z_GEARMAN_JOB_P(zv) gearman_job_fetch_object(Z_OBJ_P((zv)))
 
-PHP_METHOD(GearmanJob, __destruct);
-PHP_FUNCTION(gearman_job_return_code);
-PHP_FUNCTION(gearman_job_set_return);
-PHP_FUNCTION(gearman_job_send_data);
-PHP_FUNCTION(gearman_job_send_warning);
-PHP_FUNCTION(gearman_job_send_status);
-PHP_FUNCTION(gearman_job_send_complete);
-PHP_FUNCTION(gearman_job_send_exception);
-PHP_FUNCTION(gearman_job_send_fail);
-PHP_FUNCTION(gearman_job_handle);
-PHP_FUNCTION(gearman_job_function_name);
-PHP_FUNCTION(gearman_job_unique);
-PHP_FUNCTION(gearman_job_workload);
-PHP_FUNCTION(gearman_job_workload_size);
-
 #endif  /* __PHP_GEARMAN_JOB_H */

+ 2 - 4
php_gearman_task.c

@@ -127,10 +127,8 @@ gearman_return_t _php_task_fail_fn(gearman_task_st *task) {
 PHP_METHOD(GearmanTask, __construct) {
 }
 
-/* {{{ proto object GearmanTask::__destruct()
-   Destroys a task object */
-PHP_METHOD(GearmanTask, __destruct) {
-        gearman_task_obj *intern = Z_GEARMAN_TASK_P(getThis());
+void gearman_task_free_obj(zend_object *object) {
+        gearman_task_obj *intern = gearman_task_fetch_object(object);
         if (!intern) {
                 return;
         }

+ 1 - 15
php_gearman_task.h

@@ -26,6 +26,7 @@
 #include <libgearman-1.0/interface/status.h>
 #include <libgearman-1.0/status.h>
 
+void gearman_task_free_obj(zend_object *object);
 zend_object *gearman_task_obj_new(zend_class_entry *ce);
 extern zend_class_entry *gearman_task_ce;
 extern zend_object_handlers gearman_task_obj_handlers;
@@ -61,19 +62,4 @@ gearman_return_t _php_task_complete_fn(gearman_task_st *task);
 gearman_return_t _php_task_exception_fn(gearman_task_st *task);
 gearman_return_t _php_task_fail_fn(gearman_task_st *task);
 
-PHP_METHOD(GearmanTask, __construct);
-PHP_METHOD(GearmanTask, __destruct);
-PHP_FUNCTION(gearman_task_return_code);
-PHP_FUNCTION(gearman_task_function_name);
-PHP_FUNCTION(gearman_task_unique);
-PHP_FUNCTION(gearman_task_job_handle);
-PHP_FUNCTION(gearman_task_is_known);
-PHP_FUNCTION(gearman_task_is_running);
-PHP_FUNCTION(gearman_task_numerator);
-PHP_FUNCTION(gearman_task_denominator);
-PHP_FUNCTION(gearman_task_data);
-PHP_FUNCTION(gearman_task_data_size);
-PHP_FUNCTION(gearman_task_send_workload);
-PHP_FUNCTION(gearman_task_recv_data);
-
 #endif  /* __PHP_GEARMAN_TASK_H */

+ 2 - 6
php_gearman_worker.c

@@ -57,11 +57,8 @@ PHP_METHOD(GearmanWorker, __construct) {
 }
 /* }}} */
 
-/* {{{ proto object GearmanWorker::__destruct()
-   Destroys a worker object */
-PHP_METHOD(GearmanWorker, __destruct) {
-	gearman_worker_obj *intern = Z_GEARMAN_WORKER_P(getThis());
-
+void gearman_worker_free_obj(zend_object *object) {
+	gearman_worker_obj *intern = gearman_worker_fetch_object(object);
 	if (!intern)  {
 		return;
 	}
@@ -73,7 +70,6 @@ PHP_METHOD(GearmanWorker, __destruct) {
 	zval_dtor(&intern->cb_list);
 	zend_object_std_dtor(&intern->std);
 }
-/* }}} */
 
 static inline void cb_list_dtor(zval *zv) {
 	gearman_worker_cb_obj *worker_cb = Z_PTR_P(zv);

Some files were not shown because too many files changed in this diff