]> granicus.if.org Git - php/commitdiff
Embeded zend_list into st_mysqlnd_error_info, to avoid extra allocation/deallocation.
authorDmitry Stogov <dmitry@zend.com>
Tue, 14 Nov 2017 21:53:51 +0000 (00:53 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 14 Nov 2017 21:53:51 +0000 (00:53 +0300)
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_nonapi.c
ext/mysqli/mysqli_prop.c
ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt
ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt
ext/mysqlnd/mysqlnd_connection.c
ext/mysqlnd/mysqlnd_ps.c
ext/mysqlnd/mysqlnd_structs.h

index 2c9915111d4df14b3b8565cb32709d3533fd9208..67ae750e8b1faef38532a0f7a780c7f374dd1e93 100644 (file)
@@ -1870,6 +1870,9 @@ PHP_FUNCTION(mysqli_prepare)
                        memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);
 #else
                        MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info;
+                       mysql->mysql->data->error_info->error_list.head = NULL;
+                       mysql->mysql->data->error_info->error_list.tail = NULL;
+                       mysql->mysql->data->error_info->error_list.count = 0;
 #endif
                        mysqli_stmt_close(stmt->stmt, FALSE);
                        stmt->stmt = NULL;
@@ -1880,6 +1883,7 @@ PHP_FUNCTION(mysqli_prepare)
                        memcpy(mysql->mysql->net.last_error, last_error, MYSQL_ERRMSG_SIZE);
                        memcpy(mysql->mysql->net.sqlstate, sqlstate, SQLSTATE_LENGTH+1);
 #else
+                       zend_llist_clean(&mysql->mysql->data->error_info->error_list);
                        *mysql->mysql->data->error_info = error_info;
 #endif
                }
index 9384b9355a8420a61b8d376cb8fa908fe0d019ae..1ec85cf88f11ccd0fb708ee2b26a8c9000b6ecae 100644 (file)
@@ -422,13 +422,13 @@ PHP_FUNCTION(mysqli_error_list)
        }
        MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
 #if defined(MYSQLI_USE_MYSQLND)
-       if (mysql->mysql->data->error_info->error_list) {
+       if (1) {
                MYSQLND_ERROR_LIST_ELEMENT * message;
                zend_llist_position pos;
                array_init(return_value);
-               for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(mysql->mysql->data->error_info->error_list, &pos);
+               for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&mysql->mysql->data->error_info->error_list, &pos);
                         message;
-                        message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(mysql->mysql->data->error_info->error_list, &pos))
+                        message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&mysql->mysql->data->error_info->error_list, &pos))
                {
                        zval single_error;
                        array_init(&single_error);
@@ -468,13 +468,13 @@ PHP_FUNCTION(mysqli_stmt_error_list)
        }
        MYSQLI_FETCH_RESOURCE_STMT(stmt, mysql_stmt, MYSQLI_STATUS_INITIALIZED);
 #if defined(MYSQLI_USE_MYSQLND)
-       if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info->error_list) {
+       if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info) {
                MYSQLND_ERROR_LIST_ELEMENT * message;
                zend_llist_position pos;
                array_init(return_value);
-               for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(stmt->stmt->data->error_info->error_list, &pos);
+               for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&stmt->stmt->data->error_info->error_list, &pos);
                         message;
-                        message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(stmt->stmt->data->error_info->error_list, &pos))
+                        message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&stmt->stmt->data->error_info->error_list, &pos))
                {
                        zval single_error;
                        array_init(&single_error);
@@ -536,6 +536,9 @@ PHP_FUNCTION(mysqli_multi_query)
                s_errno = mysql_errno(mysql->mysql);
 #else
                MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info;
+               mysql->mysql->data->error_info->error_list.head = NULL;
+               mysql->mysql->data->error_info->error_list.tail = NULL;
+               mysql->mysql->data->error_info->error_list.count = 0;
 #endif
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                MYSQLI_DISABLE_MQ;
@@ -546,6 +549,7 @@ PHP_FUNCTION(mysqli_multi_query)
                strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
                mysql->mysql->net.last_errno = s_errno;
 #else
+               zend_llist_clean(&mysql->mysql->data->error_info->error_list);
                *mysql->mysql->data->error_info = error_info;
 #endif
                RETURN_FALSE;
index 0b3858d1c3d7ee36f542f57533b09d72234680ce..c4aeadf082f9b9fd31636be678a61aca7d687b55 100644 (file)
@@ -187,12 +187,12 @@ static zval *link_error_list_read(mysqli_object *obj, zval *retval)
        if (mysql) {
                array_init(retval);
 #if defined(MYSQLI_USE_MYSQLND)
-               if (mysql->mysql->data->error_info->error_list) {
+               if (1) {
                        MYSQLND_ERROR_LIST_ELEMENT * message;
                        zend_llist_position pos;
-                       for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(mysql->mysql->data->error_info->error_list, &pos);
+                       for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&mysql->mysql->data->error_info->error_list, &pos);
                                 message;
-                                message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(mysql->mysql->data->error_info->error_list, &pos))
+                                message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&mysql->mysql->data->error_info->error_list, &pos))
                        {
                                zval single_error;
                                array_init(&single_error);
@@ -379,12 +379,12 @@ static zval *stmt_error_list_read(mysqli_object *obj, zval *retval)
        if (stmt && stmt->stmt) {
                array_init(retval);
 #if defined(MYSQLI_USE_MYSQLND)
-               if (stmt->stmt->data && stmt->stmt->data->error_info->error_list) {
+               if (stmt->stmt->data && stmt->stmt->data->error_info) {
                        MYSQLND_ERROR_LIST_ELEMENT * message;
                        zend_llist_position pos;
-                       for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(stmt->stmt->data->error_info->error_list, &pos);
+                       for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&stmt->stmt->data->error_info->error_list, &pos);
                                 message;
-                                message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(stmt->stmt->data->error_info->error_list, &pos))
+                                message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&stmt->stmt->data->error_info->error_list, &pos))
                        {
                                zval single_error;
                                array_init(&single_error);
index b5ba9a5a05d66f403f20c04c7854aca5a1e84be3..9999d84395fca972f36fc167fa408aeb58b9915b 100644 (file)
@@ -207,8 +207,8 @@ if (!$IS_MYSQLND)
                // mysqlnd only option
                // m - trace memory allocations
                $trace = try_control_string($link, 't:O,' . $trace_file . ':m', $trace_file, 120);
-               if (!preg_match("@^[|\s]*>\_mysqlnd_pefree@ismU", $trace, $matches) &&
-                               !preg_match("@^[|\s]*>\_mysqlnd_pemalloc@ismU", $trace, $matches)) {
+               if (!preg_match("@^[|\s]*>\_mysqlnd_p?efree@ismU", $trace, $matches) &&
+                               !preg_match("@^[|\s]*>\_mysqlnd_p?emalloc@ismU", $trace, $matches)) {
                        printf("[125] Memory dump does neither contain _mysqlnd_pefree nor _mysqlnd_pemalloc calls - check manually.\n");
                        var_dump($trace);
                }
index 2886694440759950feefa1a0c9c65b297da11b13..603bb9bc32ce7017d0504c261365fdbd08c0216c 100644 (file)
@@ -90,9 +90,11 @@ if (!$IS_MYSQLND)
                if (isset($functions_trace[$name]))
                        $found++;
 
-       if ($found < (count($memory_funcs) - 3))
+       if ($found < 2) {
                printf("[016] Only %d memory functions have been found, expecting at least %d.\n",
-                       $found, count($memory_funcs) - 3);
+                       $found, 2);
+               var_dump($trace);
+       }
 
        $trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20);
        if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
@@ -112,9 +114,11 @@ if (!$IS_MYSQLND)
                if (isset($functions_trace[$name]))
                        $found++;
 
-       if ($found > 2)
+       if ($found > 2) {
                printf("[026] More than %d memory functions have been recorded, that's strange.\n",
                        $found);
+               var_dump($trace);
+       }
 
        mysqli_close($link);
        @unlink($trace_file);
index 960b9f10b694c02320fcc3dbccf16305d40c4553..75a7e0292682cb40d36e8ec8f71c4f1829052096 100644 (file)
@@ -103,9 +103,7 @@ MYSQLND_METHOD(mysqlnd_error_info, reset)(MYSQLND_ERROR_INFO * const info)
        info->error_no = 0;
        info->error[0] = '\0';
        memset(&info->sqlstate, 0, sizeof(info->sqlstate));
-       if (info->error_list) {
-               zend_llist_clean(info->error_list);
-       }
+       zend_llist_clean(&info->error_list);
 
        DBG_VOID_RETURN;
 }
@@ -121,19 +119,18 @@ MYSQLND_METHOD(mysqlnd_error_info, set_client_error)(MYSQLND_ERROR_INFO * const
 {
        DBG_ENTER("mysqlnd_error_info::set_client_error");
        if (err_no) {
+               MYSQLND_ERROR_LIST_ELEMENT error_for_the_list = {0};
+
                info->error_no = err_no;
                strlcpy(info->sqlstate, sqlstate, sizeof(info->sqlstate));
                strlcpy(info->error, error, sizeof(info->error));
-               if (info->error_list) {
-                       MYSQLND_ERROR_LIST_ELEMENT error_for_the_list = {0};
-
-                       error_for_the_list.error_no = err_no;
-                       strlcpy(error_for_the_list.sqlstate, sqlstate, sizeof(error_for_the_list.sqlstate));
-                       error_for_the_list.error = mnd_pestrdup(error, TRUE);
-                       if (error_for_the_list.error) {
-                               DBG_INF_FMT("adding error [%s] to the list", error_for_the_list.error);
-                               zend_llist_add_element(info->error_list, &error_for_the_list);
-                       }
+
+               error_for_the_list.error_no = err_no;
+               strlcpy(error_for_the_list.sqlstate, sqlstate, sizeof(error_for_the_list.sqlstate));
+               error_for_the_list.error = mnd_pestrdup(error, TRUE);
+               if (error_for_the_list.error) {
+                       DBG_INF_FMT("adding error [%s] to the list", error_for_the_list.error);
+                       zend_llist_add_element(&info->error_list, &error_for_the_list);
                }
        } else {
                info->m->reset(info);
@@ -158,12 +155,9 @@ mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persist
        info->m = mysqlnd_error_info_get_methods();
        info->m->reset(info);
 
-       info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
-       if (info->error_list) {
-               zend_llist_init(info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent);
-       }
+       zend_llist_init(&info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent);
        info->persistent = persistent;
-       DBG_RETURN(info->error_list? PASS:FAIL);
+       DBG_RETURN(PASS);
 }
 /* }}} */
 
@@ -174,11 +168,6 @@ mysqlnd_error_info_free_contents(MYSQLND_ERROR_INFO * const info)
 {
        DBG_ENTER("mysqlnd_error_info_free_contents");
        info->m->reset(info);
-       if (info->error_list) {
-               mnd_pefree(info->error_list, info->persistent);
-               info->error_list = NULL;
-       }
-
        DBG_VOID_RETURN;
 }
 /* }}} */
index b41f125f6a37006564601a58d7720331f884d620..a34e434b8929a71d21e7413c6307bae4d44fd335 100644 (file)
@@ -2092,11 +2092,7 @@ MYSQLND_METHOD(mysqlnd_stmt, free_stmt_result)(MYSQLND_STMT * const s)
                stmt->result->m.free_result_internal(stmt->result);
                stmt->result = NULL;
        }
-       if (stmt->error_info->error_list) {
-               zend_llist_clean(stmt->error_info->error_list);
-               mnd_efree(stmt->error_info->error_list);
-               stmt->error_info->error_list = NULL;
-       }
+       zend_llist_clean(&stmt->error_info->error_list);
 
        DBG_VOID_RETURN;
 }
index 60ef3699998700ea926714057c594972566d4f03..86e7d787d5cfcccd9223c34f93a013631009189d 100644 (file)
@@ -152,7 +152,7 @@ struct st_mysqlnd_error_info
        char error[MYSQLND_ERRMSG_SIZE+1];
        char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
        unsigned int error_no;
-       zend_llist error_list;
+       zend_llist error_list;
 
        zend_bool persistent;
        MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *m;