]> granicus.if.org Git - php/commitdiff
Persistent resources are "thread-local".
authorDmitry Stogov <dmitry@zend.com>
Wed, 1 Nov 2017 12:19:31 +0000 (15:19 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 1 Nov 2017 12:19:31 +0000 (15:19 +0300)
Register persistent resources through new functions zend_register_persistent_resource()/zend_register_persistent_resource_ex().

UPGRADING.INTERNALS
Zend/zend_list.c
Zend/zend_list.h
ext/dba/dba.c
ext/interbase/interbase.c
ext/mysqli/mysqli_nonapi.c
ext/oci8/oci8.c
ext/odbc/php_odbc.c
ext/pdo/pdo_dbh.c
ext/pgsql/pgsql.c
main/streams/streams.c

index b36e45fc9d6af3a772f5304318ad90c2e67c39dc..59ac0bbadc6d1ac223af1a9361ef67fb089a4d01 100644 (file)
@@ -16,6 +16,7 @@ PHP 7.2 INTERNALS UPGRADE NOTES
   m. AST and IS_CONSTANT
   n. GC_REFCOUNT()
   o. zend_get_parameters()
+  p. zend_register_persistent_resource()
 
 2. Build system changes
   a. Unix build system changes
@@ -112,6 +113,10 @@ PHP 7.2 INTERNALS UPGRADE NOTES
   o. The zend_get_parameters() and zend_get_parameters_ex() functions were
      removed. Instead zend_parse_parameters() should be used.
 
+  p. New functions zend_register_persistent_resource() or
+     zend_register_persistent_resource_ex() should beused to register
+     persistent resources, instead of manual insertion into EG(persistent_list).
+
 ========================
 2. Build system changes
 ========================
index 25e185946ecf8cbdde98d7e18c1267ce5780709a..c3401d85c04a3626135a437c2b4a397a9b9252d9 100644 (file)
@@ -337,6 +337,36 @@ const char *zend_rsrc_list_get_rsrc_type(zend_resource *res)
        }
 }
 
+ZEND_API zend_resource* zend_register_persistent_resource_ex(zend_string *key, void *rsrc_pointer, int rsrc_type)
+{
+       zval *zv;
+       zval tmp;
+
+       ZVAL_NEW_PERSISTENT_RES(&tmp, -1, rsrc_pointer, rsrc_type);
+       GC_MAKE_PERSISTENT_LOCAL(Z_COUNTED(tmp));
+       GC_MAKE_PERSISTENT_LOCAL(key);
+
+       zv = zend_hash_update(&EG(persistent_list), key, &tmp);
+       if (UNEXPECTED(zv == NULL)) {
+               free(Z_RES(tmp));
+               return NULL;
+       }
+
+       return Z_RES_P(zv);
+}
+
+ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type)
+{
+       zend_string *str = zend_string_init(key, key_len, 1);
+       zend_resource *ret  = zend_register_persistent_resource_ex(str, rsrc_pointer, rsrc_type);
+
+       if (UNEXPECTED(ret == NULL)) {
+               free(str);
+       }
+
+       return ret;
+}
+
 /*
  * Local variables:
  * tab-width: 4
index 2d6535c8053a7924e27af2168dd98afa8025a2c0..cc813be557fa59f5c373470ce28d114da8468899 100644 (file)
@@ -68,6 +68,9 @@ ZEND_API void *zend_fetch_resource2_ex(zval *res, const char *resource_type_name
 ZEND_API const char *zend_rsrc_list_get_rsrc_type(zend_resource *res);
 ZEND_API int zend_fetch_list_dtor_id(const char *type_name);
 
+ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type);
+ZEND_API zend_resource* zend_register_persistent_resource_ex(zend_string *key, void *rsrc_pointer, int rsrc_type);
+
 extern ZEND_API int le_index_ptr;  /* list entry type for index pointers */
 
 END_EXTERN_C()
index 671cb293e3f6745f740e17ccfbe8655fc6deb546..9da1ba500e2802d84eb39afd4d81a65b4a795462 100644 (file)
@@ -997,10 +997,7 @@ restart:
        info->argv = NULL;
 
        if (persistent) {
-               zval new_le;
-
-               ZVAL_NEW_PERSISTENT_RES(&new_le, -1, info, le_pdb);
-               if (zend_hash_str_update(&EG(persistent_list), key, keylen, &new_le) == NULL) {
+               if (zend_register_persistent_resource(key, keylen, info, le_pdb) == NULL) {
                        dba_close(info);
                        php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Could not register persistent resource");
                        FREENOW;
index f944c0e4c41172f43429b1965fcd803838f833ad..e777962f535659fea7136b5f7f011083525c9527 100644 (file)
@@ -991,18 +991,13 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /*
                        ib_link = (ibase_db_link *) emalloc(sizeof(ibase_db_link));
                        RETVAL_RES(zend_register_resource(ib_link, le_link));
                } else {
-                       zend_resource new_le;
-
                        ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link));
                        if (!ib_link) {
                                RETURN_FALSE;
                        }
 
                        /* hash it up */
-                       new_le.type = le_plink;
-                       new_le.ptr = ib_link;
-                       if (zend_hash_str_update_mem(&EG(persistent_list), hash, sizeof(hash)-1,
-                                       (void *) &new_le, sizeof(zend_resource)) == NULL) {
+                       if (zend_register_persistent_resource(hash, sizeof(hash)-1, ib_link, le_plink) == NULL) {
                                free(ib_link);
                                RETURN_FALSE;
                        }
index 6d4f648a7f87834b408f5aa3c47e4bcabf996e40..9384b9355a8420a61b8d376cb8fa908fe0d019ae 100644 (file)
@@ -196,12 +196,10 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
                                        } while (0);
                                }
                        } else {
-                               zend_resource le;
-                               le.type = php_le_pmysqli();
-                               le.ptr = plist = calloc(1, sizeof(mysqli_plist_entry));
+                               plist = calloc(1, sizeof(mysqli_plist_entry));
 
                                zend_ptr_stack_init_ex(&plist->free_links, 1);
-                               zend_hash_str_update_mem(&EG(persistent_list), ZSTR_VAL(hash_key), ZSTR_LEN(hash_key), &le, sizeof(le));
+                               zend_register_persistent_resource(ZSTR_VAL(hash_key), ZSTR_LEN(hash_key), plist, php_le_pmysqli());
                        }
                }
        }
index 9d656851705b033c3370ccfdb30abeb49d45cb5f..20734d8f88b03f43dd2c3d1a4f0170aa07122a74 100644 (file)
@@ -2041,8 +2041,10 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
 
        /* add to the appropriate hash */
        if (connection->is_persistent) {
+#if PHP_VERSION_ID < 70300
                new_le.ptr = connection;
                new_le.type = le_pconnection;
+#endif
                connection->used_this_request = 1;
                PHP_OCI_REGISTER_RESOURCE(connection, le_pconnection);
 
@@ -2053,7 +2055,11 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
                if (OCI_G(old_oci_close_semantics)) {
                        GC_ADDREF(connection->id);
                }
+#if PHP_VERSION_ID < 70300
                zend_hash_update_mem(&EG(persistent_list), connection->hash_key, (void *)&new_le, sizeof(zend_resource));
+#else
+               zend_register_persistent_resource_ex(connection->hash_key, connection, le_pconnection);
+#endif
                OCI_G(num_persistent)++;
                OCI_G(num_links)++;
        } else if (!exclusive) {
@@ -2874,7 +2880,9 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *
 {
        smart_str spool_hashed_details = {0};
        php_oci_spool *session_pool = NULL;
+#if PHP_VERSION_ID < 70300
        zend_resource spool_le = {{0}};
+#endif
        zend_resource *spool_out_le = NULL;
        zend_bool iserror = 0;
        zval *spool_out_zv = NULL;
@@ -2921,10 +2929,14 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *
                        iserror = 1;
                        goto exit_get_spool;
                }
+#if PHP_VERSION_ID < 70300
                spool_le.ptr  = session_pool;
                spool_le.type = le_psessionpool;
                PHP_OCI_REGISTER_RESOURCE(session_pool, le_psessionpool);
                zend_hash_update_mem(&EG(persistent_list), session_pool->spool_hash_key, (void *)&spool_le, sizeof(zend_resource));
+#else
+               zend_register_persistent_resource_ex(session_pool->spool_hash_key, session_pool, le_psessionpool);
+#endif
        } else if (spool_out_le->type == le_psessionpool &&
                ZSTR_LEN(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == ZSTR_LEN(spool_hashed_details.s) &&
                memcmp(ZSTR_VAL(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key), ZSTR_VAL(spool_hashed_details.s), ZSTR_LEN(spool_hashed_details.s)) == 0) {
index be8fd12e116036b5e7c0befc919f770c9a4ee3c1..8bfa5b3dad686a18ce9ec8ec50e7a55ea50174f3 100644 (file)
@@ -2571,8 +2571,6 @@ try_and_get_another_connection:
                
                /* the link is not in the persistent list */
                if ((le = zend_hash_str_find_ptr(&EG(persistent_list), hashed_details, hashed_len)) == NULL) {
-                       zend_resource new_le;
-                       
                        if (ODBCG(max_links) != -1 && ODBCG(num_links) >= ODBCG(max_links)) {
                                php_error_docref(NULL, E_WARNING, "Too many open links (%ld)", ODBCG(num_links));
                                efree(hashed_details);
@@ -2589,11 +2587,7 @@ try_and_get_another_connection:
                                RETURN_FALSE;
                        }
                        
-                       new_le.type = le_pconn;
-                       new_le.ptr = db_conn;
-                       new_le.handle = -1;
-                       if (zend_hash_str_update_mem(&EG(persistent_list), hashed_details, hashed_len, &new_le,
-                                               sizeof(zend_resource)) == NULL) {
+                       if (zend_register_persistent_resource(hashed_details, hashed_len, db_conn, le_pconn) == NULL) {
                                free(db_conn);
                                efree(hashed_details);
                                RETURN_FALSE;
index a89276cfcecc15b6201e25bfc48f19d799e45388..bfb65f48e2527b5cc4c6218700e42394657a2fbd 100644 (file)
@@ -359,18 +359,11 @@ static PHP_METHOD(PDO, dbh_constructor)
                /* all set */
 
                if (is_persistent) {
-                       zend_resource le;
-
                        /* register in the persistent list etc. */
                        /* we should also need to replace the object store entry,
                           since it was created with emalloc */
-
-                       le.type = php_pdo_list_entry();
-                       le.ptr = dbh;
-                       GC_SET_REFCOUNT(&le, 1);
-
-                       if ((zend_hash_str_update_mem(&EG(persistent_list),
-                                               (char*)dbh->persistent_id, dbh->persistent_id_len, &le, sizeof(le))) == NULL) {
+                       if ((zend_register_persistent_resource(
+                                               (char*)dbh->persistent_id, dbh->persistent_id_len, dbh, php_pdo_list_entry())) == NULL) {
                                php_error_docref(NULL, E_ERROR, "Failed to register persistent entry");
                        }
                }
index f1bc779cfe90c18239815c92ce6d1116ba5fda61..286c862885cab74562f8245e9dfe0d245f1b2ca9 100644 (file)
@@ -1357,8 +1357,6 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 
                /* try to find if we already have this link in our persistent list */
                if ((le = zend_hash_find_ptr(&EG(persistent_list), str.s)) == NULL) {  /* we don't */
-                       zend_resource new_le;
-
                        if (PGG(max_links) != -1 && PGG(num_links) >= PGG(max_links)) {
                                php_error_docref(NULL, E_WARNING,
                                                                 "Cannot create new link. Too many open links (" ZEND_LONG_FMT ")", PGG(num_links));
@@ -1385,9 +1383,7 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                        }
 
                        /* hash it up */
-                       new_le.type = le_plink;
-                       new_le.ptr = pgsql;
-                       if (zend_hash_str_update_mem(&EG(persistent_list), ZSTR_VAL(str.s), ZSTR_LEN(str.s), &new_le, sizeof(zend_resource)) == NULL) {
+                       if (zend_register_persistent_resource(ZSTR_VAL(str.s), ZSTR_LEN(str.s), pgsql, le_plink) == NULL) {
                                goto err;
                        }
                        PGG(num_links)++;
index 7f130fcb15af4d8b85e3e68349a2b4e345ac6807..1c3a144e9bb8af0c382fe801f72c99ce983d7c19 100644 (file)
@@ -296,12 +296,7 @@ fprintf(stderr, "stream_alloc: %s:%p persistent=%s\n", ops->label, ret, persiste
        }
 
        if (persistent_id) {
-               zval tmp;
-
-               ZVAL_NEW_PERSISTENT_RES(&tmp, -1, ret, le_pstream);
-
-               if (NULL == zend_hash_str_update(&EG(persistent_list), persistent_id,
-                                       strlen(persistent_id), &tmp)) {
+               if (NULL == zend_register_persistent_resource(persistent_id, strlen(persistent_id), ret, le_pstream)) {
                        pefree(ret, 1);
                        return NULL;
                }