From e2890e3a0f3ea5a9ce4b9c8e9e78777f012a4b74 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 9 May 2014 23:28:21 +0800 Subject: [PATCH] Refactor sysvsem, sysvshm, sysmsg --- ext/sysvmsg/sysvmsg.c | 65 ++++++++++++++++++++------------------ ext/sysvsem/sysvsem.c | 9 +++--- ext/sysvshm/sysvshm.c | 14 ++++---- ext/sysvshm/tests/003.phpt | 4 +-- ext/sysvshm/tests/007.phpt | 2 +- 5 files changed, 49 insertions(+), 45 deletions(-) diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index adf1d2d6be..83875ac9ee 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -119,9 +119,9 @@ zend_module_entry sysvmsg_module_entry = { ZEND_GET_MODULE(sysvmsg) #endif -static void sysvmsg_release(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void sysvmsg_release(zend_resource *rsrc TSRMLS_DC) { - sysvmsg_queue_t * mq = (sysvmsg_queue_t *) rsrc->ptr; + sysvmsg_queue_t *mq = (sysvmsg_queue_t *) rsrc->ptr; efree(mq); } @@ -164,27 +164,27 @@ PHP_FUNCTION(msg_set_queue) return; } - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_STAT, &stat) == 0) { - zval **item; + zval *item; /* now pull out members of data and set them in the stat buffer */ - if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.uid", sizeof("msg_perm.uid"), (void **) &item) == SUCCESS) { + if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.uid", sizeof("msg_perm.uid") - 1)) != NULL) { convert_to_long_ex(item); - stat.msg_perm.uid = Z_LVAL_PP(item); + stat.msg_perm.uid = Z_LVAL_P(item); } - if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.gid", sizeof("msg_perm.gid"), (void **) &item) == SUCCESS) { + if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.gid", sizeof("msg_perm.gid") - 1)) != NULL) { convert_to_long_ex(item); - stat.msg_perm.gid = Z_LVAL_PP(item); + stat.msg_perm.gid = Z_LVAL_P(item); } - if (zend_hash_find(Z_ARRVAL_P(data), "msg_perm.mode", sizeof("msg_perm.mode"), (void **) &item) == SUCCESS) { + if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_perm.mode", sizeof("msg_perm.mode") - 1)) != NULL) { convert_to_long_ex(item); - stat.msg_perm.mode = Z_LVAL_PP(item); + stat.msg_perm.mode = Z_LVAL_P(item); } - if (zend_hash_find(Z_ARRVAL_P(data), "msg_qbytes", sizeof("msg_qbytes"), (void **) &item) == SUCCESS) { + if ((item = zend_hash_str_find(Z_ARRVAL_P(data), "msg_qbytes", sizeof("msg_qbytes") - 1)) != NULL) { convert_to_long_ex(item); - stat.msg_qbytes = Z_LVAL_PP(item); + stat.msg_qbytes = Z_LVAL_P(item); } if (msgctl(mq->id, IPC_SET, &stat) == 0) { RETVAL_TRUE; @@ -207,7 +207,7 @@ PHP_FUNCTION(msg_stat_queue) return; } - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_STAT, &stat) == 0) { array_init(return_value); @@ -226,7 +226,6 @@ PHP_FUNCTION(msg_stat_queue) } /* }}} */ - /* {{{ proto bool msg_queue_exists(int key) Check whether a message queue exists */ PHP_FUNCTION(msg_queue_exists) @@ -245,7 +244,6 @@ PHP_FUNCTION(msg_queue_exists) } /* }}} */ - /* {{{ proto resource msg_get_queue(int key [, int perms]) Attach to a message queue */ PHP_FUNCTION(msg_get_queue) @@ -271,7 +269,7 @@ PHP_FUNCTION(msg_get_queue) RETURN_FALSE; } } - RETVAL_RESOURCE(zend_list_insert(mq, le_sysvmsg TSRMLS_CC)); + RETVAL_ZVAL(zend_list_insert(mq, le_sysvmsg TSRMLS_CC), 0, 0); } /* }}} */ @@ -286,7 +284,7 @@ PHP_FUNCTION(msg_remove_queue) return; } - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg); if (msgctl(mq->id, IPC_RMID, NULL) == 0) { RETVAL_TRUE; @@ -338,18 +336,21 @@ PHP_FUNCTION(msg_receive) } } - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, &queue, -1, "sysvmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t *, queue, -1, "sysvmsg queue", le_sysvmsg); messagebuffer = (struct php_msgbuf *) safe_emalloc(maxsize, 1, sizeof(struct php_msgbuf)); result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags); + ZVAL_DEREF(out_msgtype); + ZVAL_DEREF(out_message); zval_dtor(out_msgtype); zval_dtor(out_message); ZVAL_LONG(out_msgtype, 0); ZVAL_FALSE(out_message); if (zerrcode) { + ZVAL_DEREF(zerrcode); zval_dtor(zerrcode); ZVAL_LONG(zerrcode, 0); } @@ -361,21 +362,19 @@ PHP_FUNCTION(msg_receive) RETVAL_TRUE; if (do_unserialize) { php_unserialize_data_t var_hash; - zval *tmp = NULL; + zval tmp; const unsigned char *p = (const unsigned char *) messagebuffer->mtext; - MAKE_STD_ZVAL(tmp); PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(&tmp, &p, p + result, &var_hash TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "message corrupted"); RETVAL_FALSE; } else { - REPLACE_ZVAL_VALUE(&out_message, tmp, 0); + ZVAL_COPY_VALUE(out_message, &tmp); } - FREE_ZVAL(tmp); PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } else { - ZVAL_STRINGL(out_message, messagebuffer->mtext, result, 1); + ZVAL_STRINGL(out_message, messagebuffer->mtext, result); } } else if (zerrcode) { ZVAL_LONG(zerrcode, errno); @@ -403,21 +402,21 @@ PHP_FUNCTION(msg_send) return; } - ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, &queue, -1, "sysvmsg queue", le_sysvmsg); + ZEND_FETCH_RESOURCE(mq, sysvmsg_queue_t*, queue, -1, "sysvmsg queue", le_sysvmsg); if (do_serialize) { smart_str msg_var = {0}; php_serialize_data_t var_hash; PHP_VAR_SERIALIZE_INIT(var_hash); - php_var_serialize(&msg_var, &message, &var_hash TSRMLS_CC); + php_var_serialize(&msg_var, message, &var_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(var_hash); /* NB: php_msgbuf is 1 char bigger than a long, so there is no need to * allocate the extra byte. */ - messagebuffer = safe_emalloc(msg_var.len, 1, sizeof(struct php_msgbuf)); - memcpy(messagebuffer->mtext, msg_var.c, msg_var.len + 1); - message_len = msg_var.len; + messagebuffer = safe_emalloc(msg_var.s->len, 1, sizeof(struct php_msgbuf)); + memcpy(messagebuffer->mtext, msg_var.s->val, msg_var.s->len + 1); + message_len = msg_var.s->len; smart_str_free(&msg_var); } else { char *p; @@ -428,14 +427,17 @@ PHP_FUNCTION(msg_send) break; case IS_LONG: - case IS_BOOL: message_len = spprintf(&p, 0, "%ld", Z_LVAL_P(message)); break; - + case IS_FALSE: + message_len = spprintf(&p, 0, "0"); + break; + case IS_TRUE: + message_len = spprintf(&p, 0, "1"); + break; case IS_DOUBLE: message_len = spprintf(&p, 0, "%F", Z_DVAL_P(message)); break; - default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Message parameter must be either a string or a number."); RETURN_FALSE; @@ -459,6 +461,7 @@ PHP_FUNCTION(msg_send) if (result == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "msgsnd failed: %s", strerror(errno)); if (zerror) { + ZVAL_DEREF(zerror); ZVAL_LONG(zerror, errno); } } else { diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index c30def8ba5..75c5f8baa5 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -132,7 +132,7 @@ THREAD_LS sysvsem_module php_sysvsem_module; /* {{{ release_sysvsem_sem */ -static void release_sysvsem_sem(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void release_sysvsem_sem(zend_resource *rsrc TSRMLS_DC) { sysvsem_sem *sem_ptr = (sysvsem_sem *)rsrc->ptr; struct sembuf sop[2]; @@ -289,7 +289,8 @@ PHP_FUNCTION(sem_get) sem_ptr->count = 0; sem_ptr->auto_release = auto_release; - sem_ptr->id = ZEND_REGISTER_RESOURCE(return_value, sem_ptr, php_sysvsem_module.le_sem); + ZEND_REGISTER_RESOURCE(return_value, sem_ptr, php_sysvsem_module.le_sem); + sem_ptr->id = Z_RES_HANDLE_P(return_value); } /* }}} */ @@ -305,7 +306,7 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire) return; } - ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); + ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); if (!acquire && sem_ptr->count == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "SysV semaphore %ld (key 0x%x) is not currently acquired", Z_LVAL_P(arg_id), sem_ptr->key); @@ -365,7 +366,7 @@ PHP_FUNCTION(sem_remove) return; } - ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); + ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); #if HAVE_SEMUN un.buf = &buf; diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index 72ffe0b187..b6e27ffbb1 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -112,7 +112,7 @@ ZEND_GET_MODULE(sysvshm) #undef shm_ptr /* undefine AIX-specific macro */ -#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, &z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm) +#define SHM_FETCH_RESOURCE(shm_ptr, z_ptr) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm) THREAD_LS sysvshm_module php_sysvshm; @@ -122,7 +122,7 @@ static int php_remove_shm_data(sysvshm_chunk_head *ptr, long shm_varpos); /* {{{ php_release_sysvshm */ -static void php_release_sysvshm(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void php_release_sysvshm(zend_resource *rsrc TSRMLS_DC) { sysvshm_shm *shm_ptr = (sysvshm_shm *) rsrc->ptr; shmdt((void *) shm_ptr->ptr); @@ -212,7 +212,7 @@ PHP_FUNCTION(shm_detach) return; } SHM_FETCH_RESOURCE(shm_list_ptr, shm_id); - RETURN_BOOL(SUCCESS == zend_list_delete(Z_LVAL_P(shm_id))); + RETURN_BOOL(SUCCESS == zend_list_delete(Z_RES_P(shm_id))); } /* }}} */ @@ -254,17 +254,17 @@ PHP_FUNCTION(shm_put_var) /* setup string-variable and serialize */ PHP_VAR_SERIALIZE_INIT(var_hash); - php_var_serialize(&shm_var, &arg_var, &var_hash TSRMLS_CC); + php_var_serialize(&shm_var, arg_var, &var_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(var_hash); - shm_list_ptr = zend_fetch_resource(&shm_id TSRMLS_CC, -1, PHP_SHM_RSRC_NAME, NULL, 1, php_sysvshm.le_shm); + shm_list_ptr = zend_fetch_resource(shm_id TSRMLS_CC, -1, PHP_SHM_RSRC_NAME, NULL, 1, php_sysvshm.le_shm); if (!shm_list_ptr) { smart_str_free(&shm_var); RETURN_FALSE; } /* insert serialized variable into shared memory */ - ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.c, shm_var.len); + ret = php_put_shm_data(shm_list_ptr->ptr, shm_key, shm_var.s? shm_var.s->val : NULL, shm_var.s? shm_var.s->len : 0); /* free string */ smart_str_free(&shm_var); @@ -306,7 +306,7 @@ PHP_FUNCTION(shm_get_var) shm_data = &shm_var->mem; PHP_VAR_UNSERIALIZE_INIT(var_hash); - if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) { + if (php_var_unserialize(return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable data in shared memory is corrupted"); RETVAL_FALSE; } diff --git a/ext/sysvshm/tests/003.phpt b/ext/sysvshm/tests/003.phpt index 8ce272aefc..8f37d625a7 100644 --- a/ext/sysvshm/tests/003.phpt +++ b/ext/sysvshm/tests/003.phpt @@ -38,10 +38,10 @@ Warning: shm_detach() expects exactly 1 parameter, 2 given in %s003.php on line NULL bool(true) -Warning: shm_detach(): %d is not a valid sysvshm resource in %s003.php on line %d +Warning: shm_detach(): supplied resource is not a valid sysvshm resource in %s003.php on line %d bool(false) -Warning: shm_remove(): %d is not a valid sysvshm resource in %s003.php on line %d +Warning: shm_remove(): supplied resource is not a valid sysvshm resource in %s003.php on line %d Warning: shm_detach() expects parameter 1 to be resource, integer given in %s003.php on line %d NULL diff --git a/ext/sysvshm/tests/007.phpt b/ext/sysvshm/tests/007.phpt index bcbbacf643..e1ba1e413a 100644 --- a/ext/sysvshm/tests/007.phpt +++ b/ext/sysvshm/tests/007.phpt @@ -37,7 +37,7 @@ NULL bool(true) bool(true) -Warning: shm_remove(): %d is not a valid sysvshm resource in %s007.php on line %d +Warning: shm_remove(): supplied resource is not a valid sysvshm resource in %s007.php on line %d bool(false) Done -- 2.40.0