2018-05-10 20:58:10 +08:00
|
|
|
/*
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| Copyright (c) The PHP Group |
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| 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: krakjoe@php.net |
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ZEND_WEAKREFS_H
|
|
|
|
#define ZEND_WEAKREFS_H
|
|
|
|
|
2023-01-16 19:22:54 +08:00
|
|
|
#include "zend_alloc.h"
|
2021-11-28 08:52:30 +08:00
|
|
|
|
2018-05-10 20:58:10 +08:00
|
|
|
BEGIN_EXTERN_C()
|
|
|
|
|
2019-03-13 08:08:38 +08:00
|
|
|
extern ZEND_API zend_class_entry *zend_ce_weakref;
|
2018-05-10 20:58:10 +08:00
|
|
|
|
|
|
|
void zend_register_weakref_ce(void);
|
|
|
|
|
2020-07-23 00:59:00 +08:00
|
|
|
void zend_weakrefs_init(void);
|
|
|
|
void zend_weakrefs_shutdown(void);
|
2018-05-10 20:58:10 +08:00
|
|
|
|
|
|
|
ZEND_API void zend_weakrefs_notify(zend_object *object);
|
|
|
|
|
2021-10-21 19:34:22 +08:00
|
|
|
ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pData);
|
|
|
|
ZEND_API zend_result zend_weakrefs_hash_del(HashTable *ht, zend_object *key);
|
|
|
|
static zend_always_inline void *zend_weakrefs_hash_add_ptr(HashTable *ht, zend_object *key, void *ptr) {
|
|
|
|
zval tmp, *zv;
|
|
|
|
ZVAL_PTR(&tmp, ptr);
|
|
|
|
if ((zv = zend_weakrefs_hash_add(ht, key, &tmp))) {
|
|
|
|
return Z_PTR_P(zv);
|
|
|
|
} else {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2024-10-15 00:57:08 +08:00
|
|
|
ZEND_API void zend_weakrefs_hash_clean(HashTable *ht);
|
|
|
|
static zend_always_inline void zend_weakrefs_hash_destroy(HashTable *ht) {
|
|
|
|
zend_weakrefs_hash_clean(ht);
|
|
|
|
ZEND_ASSERT(zend_hash_num_elements(ht) == 0);
|
|
|
|
zend_hash_destroy(ht);
|
|
|
|
}
|
2021-10-21 19:34:22 +08:00
|
|
|
|
2021-11-28 08:52:30 +08:00
|
|
|
/* Because php uses the raw numbers as a hash function, raw pointers will lead to hash collisions.
|
|
|
|
* We have a guarantee that the lowest ZEND_MM_ALIGNED_OFFSET_LOG2 bits of a pointer are zero.
|
|
|
|
*
|
|
|
|
* E.g. On most 64-bit platforms, pointers are aligned to 8 bytes, so the least significant 3 bits are always 0 and can be discarded.
|
|
|
|
*
|
|
|
|
* NOTE: This function is only used for EG(weakrefs) and zend_weakmap->ht.
|
|
|
|
* It is not used for the HashTable instances associated with ZEND_WEAKREF_TAG_HT tags (created in zend_weakref_register, which uses ZEND_WEAKREF_ENCODE instead).
|
|
|
|
* The ZEND_WEAKREF_TAG_HT instances are used to disambiguate between multiple weak references to the same zend_object.
|
|
|
|
*/
|
|
|
|
static zend_always_inline zend_ulong zend_object_to_weakref_key(const zend_object *object)
|
|
|
|
{
|
|
|
|
ZEND_ASSERT(((uintptr_t)object) % ZEND_MM_ALIGNMENT == 0);
|
|
|
|
return ((uintptr_t) object) >> ZEND_MM_ALIGNMENT_LOG2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static zend_always_inline zend_object *zend_weakref_key_to_object(zend_ulong key)
|
|
|
|
{
|
|
|
|
return (zend_object *) (((uintptr_t) key) << ZEND_MM_ALIGNMENT_LOG2);
|
|
|
|
}
|
|
|
|
|
2023-07-16 19:39:08 +08:00
|
|
|
HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n);
|
|
|
|
HashTable *zend_weakmap_get_key_entry_gc(zend_object *object, zval **table, int *n);
|
|
|
|
HashTable *zend_weakmap_get_entry_gc(zend_object *object, zval **table, int *n);
|
|
|
|
HashTable *zend_weakmap_get_object_key_entry_gc(zend_object *object, zval **table, int *n);
|
|
|
|
HashTable *zend_weakmap_get_object_entry_gc(zend_object *object, zval **table, int *n);
|
|
|
|
|
2018-05-10 20:58:10 +08:00
|
|
|
END_EXTERN_C()
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|