diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 7bf3f5a78d302..e5c78b2d6e42c 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -31,6 +31,7 @@ PHP 8.1 INTERNALS UPGRADE NOTES - The ZVAL_NEW_ARR() macro has been removed. Use array_init() or ZVAL_ARR with zend_new_array() instead. - The IGNORE_URL_WIN macro has been removed; it had no effect as of PHP 5.0.0. + - TsHashTable has been removed, it was not used in php-src and was not useful outside of php-src. b. Zend Stream API has been changed to use "zend_string*" instead of "char*" - zend_file_handle.filename now is zend_string* - zend_file_handle.free_filename is removed. Now zend_file_handle.filename is always released. diff --git a/Zend/zend_ts_hash.c b/Zend/zend_ts_hash.c deleted file mode 100644 index 9bbf42c66dc44..0000000000000 --- a/Zend/zend_ts_hash.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Harald Radi | - +----------------------------------------------------------------------+ -*/ - -#include "zend.h" -#include "zend_ts_hash.h" - -/* ts management functions */ -static void begin_read(TsHashTable *ht) -{ -#ifdef ZTS - tsrm_mutex_lock(ht->mx_reader); - if ((++(ht->reader)) == 1) { - tsrm_mutex_lock(ht->mx_writer); - } - tsrm_mutex_unlock(ht->mx_reader); -#endif -} - -static void end_read(TsHashTable *ht) -{ -#ifdef ZTS - tsrm_mutex_lock(ht->mx_reader); - if ((--(ht->reader)) == 0) { - tsrm_mutex_unlock(ht->mx_writer); - } - tsrm_mutex_unlock(ht->mx_reader); -#endif -} - -static void begin_write(TsHashTable *ht) -{ -#ifdef ZTS - tsrm_mutex_lock(ht->mx_writer); -#endif -} - -static void end_write(TsHashTable *ht) -{ -#ifdef ZTS - tsrm_mutex_unlock(ht->mx_writer); -#endif -} - -/* delegates */ -ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent) -{ -#ifdef ZTS - ht->mx_reader = tsrm_mutex_alloc(); - ht->mx_writer = tsrm_mutex_alloc(); - ht->reader = 0; -#endif - _zend_hash_init(TS_HASH(ht), nSize, pDestructor, persistent); -} - -ZEND_API void zend_ts_hash_destroy(TsHashTable *ht) -{ - begin_write(ht); - zend_hash_destroy(TS_HASH(ht)); - end_write(ht); - -#ifdef ZTS - tsrm_mutex_free(ht->mx_reader); - tsrm_mutex_free(ht->mx_writer); -#endif -} - -ZEND_API void zend_ts_hash_clean(TsHashTable *ht) -{ - ht->reader = 0; - begin_write(ht); - zend_hash_clean(TS_HASH(ht)); - end_write(ht); -} - -ZEND_API zval *zend_ts_hash_add(TsHashTable *ht, zend_string *key, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_add(TS_HASH(ht), key, pData); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_update(TsHashTable *ht, zend_string *key, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_update(TS_HASH(ht), key, pData); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_next_index_insert(TsHashTable *ht, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_next_index_insert(TS_HASH(ht), pData); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_index_update(TsHashTable *ht, zend_ulong h, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_index_update(TS_HASH(ht), h, pData); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_add_empty_element(TsHashTable *ht, zend_string *key) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_add_empty_element(TS_HASH(ht), key); - end_write(ht); - - return retval; -} - -ZEND_API void zend_ts_hash_graceful_destroy(TsHashTable *ht) -{ - begin_write(ht); - zend_hash_graceful_destroy(TS_HASH(ht)); - end_write(ht); - -#ifdef ZTS - tsrm_mutex_free(ht->mx_reader); - tsrm_mutex_free(ht->mx_writer); -#endif -} - -ZEND_API void zend_ts_hash_apply(TsHashTable *ht, apply_func_t apply_func) -{ - begin_write(ht); - zend_hash_apply(TS_HASH(ht), apply_func); - end_write(ht); -} - -ZEND_API void zend_ts_hash_apply_with_argument(TsHashTable *ht, apply_func_arg_t apply_func, void *argument) -{ - begin_write(ht); - zend_hash_apply_with_argument(TS_HASH(ht), apply_func, argument); - end_write(ht); -} - -ZEND_API void zend_ts_hash_apply_with_arguments(TsHashTable *ht, apply_func_args_t apply_func, int num_args, ...) -{ - va_list args; - - va_start(args, num_args); - begin_write(ht); - zend_hash_apply_with_arguments(TS_HASH(ht), apply_func, num_args, args); - end_write(ht); - va_end(args); -} - -ZEND_API void zend_ts_hash_reverse_apply(TsHashTable *ht, apply_func_t apply_func) -{ - begin_write(ht); - zend_hash_reverse_apply(TS_HASH(ht), apply_func); - end_write(ht); -} - -ZEND_API zend_result zend_ts_hash_del(TsHashTable *ht, zend_string *key) -{ - zend_result retval; - - begin_write(ht); - retval = zend_hash_del(TS_HASH(ht), key); - end_write(ht); - - return retval; -} - -ZEND_API zend_result zend_ts_hash_index_del(TsHashTable *ht, zend_ulong h) -{ - zend_result retval; - - begin_write(ht); - retval = zend_hash_index_del(TS_HASH(ht), h); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_find(TsHashTable *ht, zend_string *key) -{ - zval *retval; - - begin_read(ht); - retval = zend_hash_find(TS_HASH(ht), key); - end_read(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_index_find(TsHashTable *ht, zend_ulong h) -{ - zval *retval; - - begin_read(ht); - retval = zend_hash_index_find(TS_HASH(ht), h); - end_read(ht); - - return retval; -} - -ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor) -{ - begin_read(source); - begin_write(target); - zend_hash_copy(TS_HASH(target), TS_HASH(source), pCopyConstructor); - end_write(target); - end_read(source); -} - -ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor) -{ - begin_read(source); - zend_hash_copy(target, TS_HASH(source), pCopyConstructor); - end_read(source); -} - -ZEND_API void zend_ts_hash_merge(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite) -{ - begin_read(source); - begin_write(target); - zend_hash_merge(TS_HASH(target), TS_HASH(source), pCopyConstructor, overwrite); - end_write(target); - end_read(source); -} - -ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam) -{ - begin_read(source); - begin_write(target); - zend_hash_merge_ex(TS_HASH(target), TS_HASH(source), pCopyConstructor, pMergeSource, pParam); - end_write(target); - end_read(source); -} - -ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber) -{ - begin_write(ht); - zend_hash_sort_ex(TS_HASH(ht), sort_func, compare_func, renumber); - end_write(ht); -} - -ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, bool ordered) -{ - int retval; - - begin_read(ht1); - begin_read(ht2); - retval = zend_hash_compare(TS_HASH(ht1), TS_HASH(ht2), compar, ordered); - end_read(ht2); - end_read(ht1); - - return retval; -} - -ZEND_API zval *zend_ts_hash_minmax(TsHashTable *ht, bucket_compare_func_t compar, int flag) -{ - zval *retval; - - begin_read(ht); - retval = zend_hash_minmax(TS_HASH(ht), compar, flag); - end_read(ht); - - return retval; -} - -ZEND_API int zend_ts_hash_num_elements(TsHashTable *ht) -{ - int retval; - - begin_read(ht); - retval = zend_hash_num_elements(TS_HASH(ht)); - end_read(ht); - - return retval; -} - -ZEND_API void zend_ts_hash_rehash(TsHashTable *ht) -{ - begin_write(ht); - zend_hash_rehash(TS_HASH(ht)); - end_write(ht); -} - -ZEND_API zval *zend_ts_hash_str_find(TsHashTable *ht, const char *key, size_t len) -{ - zval *retval; - - begin_read(ht); - retval = zend_hash_str_find(TS_HASH(ht), key, len); - end_read(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_str_update(TS_HASH(ht), key, len, pData); - end_write(ht); - - return retval; -} - -ZEND_API zval *zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData) -{ - zval *retval; - - begin_write(ht); - retval = zend_hash_str_add(TS_HASH(ht), key, len, pData); - end_write(ht); - - return retval; -} diff --git a/Zend/zend_ts_hash.h b/Zend/zend_ts_hash.h deleted file mode 100644 index 12d3c65eb18d4..0000000000000 --- a/Zend/zend_ts_hash.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Harald Radi | - +----------------------------------------------------------------------+ -*/ - -#ifndef ZEND_TS_HASH_H -#define ZEND_TS_HASH_H - -#include "zend.h" - -typedef struct _zend_ts_hashtable { - HashTable hash; - uint32_t reader; -#ifdef ZTS - MUTEX_T mx_reader; - MUTEX_T mx_writer; -#endif -} TsHashTable; - -BEGIN_EXTERN_C() - -#define TS_HASH(table) (&(table->hash)) - -/* startup/shutdown */ -ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent); -ZEND_API void zend_ts_hash_destroy(TsHashTable *ht); -ZEND_API void zend_ts_hash_clean(TsHashTable *ht); - - -/* additions/updates/changes */ -ZEND_API zval *zend_ts_hash_update(TsHashTable *ht, zend_string *key, zval *pData); -ZEND_API zval *zend_ts_hash_add(TsHashTable *ht, zend_string *key, zval *pData); -ZEND_API zval *zend_ts_hash_index_update(TsHashTable *ht, zend_ulong h, zval *pData); -ZEND_API zval *zend_ts_hash_next_index_insert(TsHashTable *ht, zval *pData); -ZEND_API zval* zend_ts_hash_add_empty_element(TsHashTable *ht, zend_string *key); - -ZEND_API void zend_ts_hash_graceful_destroy(TsHashTable *ht); -ZEND_API void zend_ts_hash_apply(TsHashTable *ht, apply_func_t apply_func); -ZEND_API void zend_ts_hash_apply_with_argument(TsHashTable *ht, apply_func_arg_t apply_func, void *); -ZEND_API void zend_ts_hash_apply_with_arguments(TsHashTable *ht, apply_func_args_t apply_func, int, ...); - -ZEND_API void zend_ts_hash_reverse_apply(TsHashTable *ht, apply_func_t apply_func); - - -/* Deletes */ -ZEND_API zend_result zend_ts_hash_del(TsHashTable *ht, zend_string *key); -ZEND_API zend_result zend_ts_hash_index_del(TsHashTable *ht, zend_ulong h); - -/* Data retrieval */ -ZEND_API zval *zend_ts_hash_find(TsHashTable *ht, zend_string *key); -ZEND_API zval *zend_ts_hash_index_find(TsHashTable *ht, zend_ulong); - -/* Copying, merging and sorting */ -ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor); -ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor); -ZEND_API void zend_ts_hash_merge(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite); -ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam); -ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber); -ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, bool ordered); -ZEND_API zval *zend_ts_hash_minmax(TsHashTable *ht, bucket_compare_func_t compar, int flag); - -ZEND_API int zend_ts_hash_num_elements(TsHashTable *ht); - -ZEND_API void zend_ts_hash_rehash(TsHashTable *ht); - -#if ZEND_DEBUG -/* debug */ -void zend_ts_hash_display_pListTail(TsHashTable *ht); -void zend_ts_hash_display(TsHashTable *ht); -#endif - -ZEND_API zval *zend_ts_hash_str_find(TsHashTable *ht, const char *key, size_t len); -ZEND_API zval *zend_ts_hash_str_update(TsHashTable *ht, const char *key, size_t len, zval *pData); -ZEND_API zval *zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len, zval *pData); - -static zend_always_inline void *zend_ts_hash_str_find_ptr(TsHashTable *ht, const char *str, size_t len) -{ - zval *zv; - - zv = zend_ts_hash_str_find(ht, str, len); - return zv ? Z_PTR_P(zv) : NULL; -} - -static zend_always_inline void *zend_ts_hash_str_update_ptr(TsHashTable *ht, const char *str, size_t len, void *pData) -{ - zval tmp, *zv; - - ZVAL_PTR(&tmp, pData); - zv = zend_ts_hash_str_update(ht, str, len, &tmp); - return zv ? Z_PTR_P(zv) : NULL; -} - -static zend_always_inline void *zend_ts_hash_str_add_ptr(TsHashTable *ht, const char *str, size_t len, void *pData) -{ - zval tmp, *zv; - - ZVAL_PTR(&tmp, pData); - zv = zend_ts_hash_str_add(ht, str, len, &tmp); - return zv ? Z_PTR_P(zv) : NULL; -} - -static zend_always_inline bool zend_ts_hash_exists(TsHashTable *ht, zend_string *key) -{ - return zend_ts_hash_find(ht, key) != NULL; -} - -static zend_always_inline bool zend_ts_hash_index_exists(TsHashTable *ht, zend_ulong h) -{ - return zend_ts_hash_index_find(ht, h) != NULL; -} - -END_EXTERN_C() - -#define ZEND_TS_INIT_SYMTABLE(ht) \ - ZEND_TS_INIT_SYMTABLE_EX(ht, 2, 0) - -#define ZEND_TS_INIT_SYMTABLE_EX(ht, n, persistent) \ - zend_ts_hash_init(ht, n, ZVAL_PTR_DTOR, persistent) - -#endif /* ZEND_HASH_H */ diff --git a/configure.ac b/configure.ac index ba9985ed05665..f23cca2013281 100644 --- a/configure.ac +++ b/configure.ac @@ -1614,7 +1614,7 @@ PHP_ADD_SOURCES(Zend, \ zend_vm_opcodes.c zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \ zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \ zend_list.c zend_builtin_functions.c zend_attributes.c zend_execute.c \ - zend_ini.c zend_sort.c zend_multibyte.c zend_ts_hash.c zend_stream.c \ + zend_ini.c zend_sort.c zend_multibyte.c zend_stream.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \ zend_closures.c zend_weakrefs.c zend_float.c zend_string.c zend_signal.c zend_generators.c \ zend_virtual_cwd.c zend_ast.c zend_objects.c zend_object_handlers.c zend_objects_API.c \ diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 28f9a1f320793..b28a97672e3ff 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -232,7 +232,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_llist.c zend_vm_opcodes.c zend_opcode.c zend_operators.c zend_ptr_stack.c \ zend_stack.c zend_variables.c zend.c zend_API.c zend_extensions.c \ zend_hash.c zend_list.c zend_builtin_functions.c zend_attributes.c \ - zend_ini.c zend_sort.c zend_multibyte.c zend_ts_hash.c \ + zend_ini.c zend_sort.c zend_multibyte.c \ zend_stream.c zend_iterators.c zend_interfaces.c zend_objects.c \ zend_object_handlers.c zend_objects_API.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c zend_weakrefs.c \