Просмотр исходного кода

Reworked serialization bug fix

Oleg Stepanischev 4 лет назад
Родитель
Сommit
e57ee3139e
8 измененных файлов с 48 добавлено и 18 удалено
  1. 3 0
      gearman.stub.php
  2. 13 1
      gearman_arginfo.h
  3. 0 2
      php_gearman.c
  4. 18 5
      php_gearman_client.c
  5. 7 5
      php_gearman_job.c
  6. 0 1
      php_gearman_job.h
  7. 7 3
      php_gearman_worker.c
  8. 0 1
      php_gearman_worker.h

+ 3 - 0
gearman.stub.php

@@ -11,6 +11,7 @@ function gearman_worker_create(): GearmanWorker|false {}
 class GearmanClient {
 
     public function __construct() {}
+    public function __destruct() {}
 
     /** @alias gearman_client_return_code */
     public function returnCode(): int {}
@@ -188,6 +189,7 @@ function gearman_client_set_context(GearmanClient $obj, string $data): bool {}
 function gearman_client_enable_exception_handler(GearmanClient $obj): bool {}
 
 class GearmanJob {
+    public function __destruct() {}
 
     /** @alias gearman_job_return_code */
     public function returnCode(): ?int {}
@@ -299,6 +301,7 @@ 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 {}

+ 13 - 1
gearman_arginfo.h

@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c5850721215985dca036c41a5b4a827a15b32f66 */
+ * Stub hash: 7db1ae6e6603b0be9126ceb70d68ed76646159b7 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gearman_version, 0, 0, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -335,6 +335,8 @@ 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()
 
@@ -458,6 +460,8 @@ 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()
 
@@ -533,6 +537,8 @@ 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
 
 #define arginfo_class_GearmanWorker_error arginfo_class_GearmanClient_error
@@ -687,8 +693,11 @@ 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(GearmanWorker, __construct);
+ZEND_METHOD(GearmanWorker, __destruct);
 
 
 static const zend_function_entry ext_functions[] = {
@@ -791,6 +800,7 @@ 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)
@@ -839,6 +849,7 @@ 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)
@@ -876,6 +887,7 @@ 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)

+ 0 - 2
php_gearman.c

@@ -112,14 +112,12 @@ PHP_MINIT_FUNCTION(gearman) {
 	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)

+ 18 - 5
php_gearman_client.c

@@ -71,18 +71,31 @@ PHP_METHOD(GearmanClient, __construct)
 }
 /* }}} */
 
-void gearman_client_free_obj(zend_object *object) {
+/* {{{ proto object GearmanClient::__destruct()
+   cleans up GearmanClient object */
+PHP_METHOD(GearmanClient, __destruct)
+{
         char *context = NULL;
-        gearman_client_obj *intern = gearman_client_fetch_object(object);
+        gearman_client_obj *intern = Z_GEARMAN_CLIENT_P(getThis());
         if (!intern) {
                 return;
         }
 
-        context = gearman_client_context(&(intern->client));
-        efree(context);
-
         if (intern->flags & GEARMAN_CLIENT_OBJ_CREATED) {
+                context = gearman_client_context(&(intern->client));
+                efree(context);
+
                 gearman_client_free(&intern->client);
+                intern->flags &= ~GEARMAN_CLIENT_OBJ_CREATED;
+        }
+}
+/* }}} */
+
+void gearman_client_free_obj(zend_object *object) {
+        gearman_client_obj *intern = gearman_client_fetch_object(object);
+
+        if (!intern) {
+                return;
         }
 
         // Clear Callbacks

+ 7 - 5
php_gearman_job.c

@@ -15,18 +15,20 @@ inline gearman_job_obj *gearman_job_fetch_object(zend_object *obj) {
         return (gearman_job_obj *)((char*)(obj) - XtOffsetOf(gearman_job_obj, std));
 }
 
-void gearman_job_free_obj(zend_object *object) {
-        gearman_job_obj *intern = gearman_job_fetch_object(object);
+/* {{{ proto object GearmanJob::__destruct()
+   cleans up GearmanJob object */
+PHP_METHOD(GearmanJob, __destruct) {
+        gearman_job_obj *intern = Z_GEARMAN_JOB_P(getThis());
         if (!intern) {
                 return;
         }
 
         if (intern->flags & GEARMAN_JOB_OBJ_CREATED) {
-            gearman_job_free(intern->job);
+				gearman_job_free(intern->job);
+				intern->flags &= ~GEARMAN_JOB_OBJ_CREATED;
         }
-
-        zend_object_std_dtor(&intern->std);
 }
+/* }}} */
 
 zend_object *gearman_job_obj_new(zend_class_entry *ce) {
         gearman_job_obj *intern = ecalloc(1,

+ 0 - 1
php_gearman_job.h

@@ -28,7 +28,6 @@
 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 {

+ 7 - 3
php_gearman_worker.c

@@ -57,19 +57,23 @@ PHP_METHOD(GearmanWorker, __construct) {
 }
 /* }}} */
 
-void gearman_worker_free_obj(zend_object *object) {
-	gearman_worker_obj *intern = gearman_worker_fetch_object(object);
+/* {{{ proto object GearmanWorker::__destruct()
+   Destroys a worker object */
+PHP_METHOD(GearmanWorker, __destruct) {
+    gearman_worker_obj *intern = Z_GEARMAN_WORKER_P(getThis());
+
 	if (!intern)  {
 		return;
 	}
 
 	if (intern->flags & GEARMAN_WORKER_OBJ_CREATED) {
 		gearman_worker_free(&(intern->worker));
+		intern->flags &= ~GEARMAN_WORKER_OBJ_CREATED;
 	}
 
 	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);

+ 0 - 1
php_gearman_worker.h

@@ -30,7 +30,6 @@
 extern zend_class_entry *gearman_worker_ce;
 extern zend_object_handlers gearman_worker_obj_handlers;
 
-void gearman_worker_free_obj(zend_object *object);
 zend_object *gearman_worker_obj_new(zend_class_entry *ce);
 
 typedef struct {