]> granicus.if.org Git - php/commitdiff
Refactor sysvsem, sysvshm, sysmsg
authorXinchen Hui <laruence@php.net>
Fri, 9 May 2014 15:28:21 +0000 (23:28 +0800)
committerXinchen Hui <laruence@php.net>
Fri, 9 May 2014 15:28:21 +0000 (23:28 +0800)
ext/sysvmsg/sysvmsg.c
ext/sysvsem/sysvsem.c
ext/sysvshm/sysvshm.c
ext/sysvshm/tests/003.phpt
ext/sysvshm/tests/007.phpt

index adf1d2d6be849c46eed3c3ee6f1cbebd1448d6e5..83875ac9eeee9691fda0aebf27680a87f0286ae9 100644 (file)
@@ -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 {
index c30def8ba5d211c2f285645c5f8ce8c02d798c0b..75c5f8baa57c372433988278a01cb3b406342433 100644 (file)
@@ -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;
index 72ffe0b1879f502b4295880cd3a769d9c35dfef5..b6e27ffbb1cde5ffb0ae5444fe01c9d58e1518b0 100644 (file)
@@ -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;
        }
index 8ce272aefc701edd8c6a41137b616473de6d72b6..8f37d625a7d557a1aed4101d01ac9c284292fefb 100644 (file)
@@ -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
index bcbbacf643242789353e3e47b89cb3e8f3bb21e2..e1ba1e413a5e6ec0bcf3456b81e8bedf8bfc51b0 100644 (file)
@@ -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