/src/php-src/ext/opcache/zend_accelerator_hash.h
Line | Count | Source |
1 | | /* |
2 | | +----------------------------------------------------------------------+ |
3 | | | Zend OPcache | |
4 | | +----------------------------------------------------------------------+ |
5 | | | Copyright (c) The PHP Group | |
6 | | +----------------------------------------------------------------------+ |
7 | | | This source file is subject to version 3.01 of the PHP license, | |
8 | | | that is bundled with this package in the file LICENSE, and is | |
9 | | | available through the world-wide-web at the following url: | |
10 | | | https://www.php.net/license/3_01.txt | |
11 | | | If you did not receive a copy of the PHP license and are unable to | |
12 | | | obtain it through the world-wide-web, please send a note to | |
13 | | | license@php.net so we can mail you a copy immediately. | |
14 | | +----------------------------------------------------------------------+ |
15 | | | Authors: Andi Gutmans <andi@php.net> | |
16 | | | Zeev Suraski <zeev@php.net> | |
17 | | | Stanislav Malyshev <stas@zend.com> | |
18 | | | Dmitry Stogov <dmitry@php.net> | |
19 | | +----------------------------------------------------------------------+ |
20 | | */ |
21 | | |
22 | | #ifndef ZEND_ACCELERATOR_HASH_H |
23 | | #define ZEND_ACCELERATOR_HASH_H |
24 | | |
25 | | #include "zend.h" |
26 | | |
27 | | /* |
28 | | zend_accel_hash - is a hash table allocated in shared memory and |
29 | | distributed across simultaneously running processes. The hash tables have |
30 | | fixed sizen selected during construction by zend_accel_hash_init(). All the |
31 | | hash entries are preallocated in the 'hash_entries' array. 'num_entries' is |
32 | | initialized by zero and grows when new data is added. |
33 | | zend_accel_hash_update() just takes the next entry from 'hash_entries' |
34 | | array and puts it into appropriate place of 'hash_table'. |
35 | | Hash collisions are resolved by separate chaining with linked lists, |
36 | | however, entries are still taken from the same 'hash_entries' array. |
37 | | 'key' and 'data' passed to zend_accel_hash_update() must be already |
38 | | allocated in shared memory. Few keys may be resolved to the same data. |
39 | | using 'indirect' entries, that point to other entries ('data' is actually |
40 | | a pointer to another zend_accel_hash_entry). |
41 | | zend_accel_hash_update() requires exclusive lock, however, |
42 | | zend_accel_hash_find() does not. |
43 | | */ |
44 | | |
45 | | typedef struct _zend_accel_hash_entry zend_accel_hash_entry; |
46 | | |
47 | | struct _zend_accel_hash_entry { |
48 | | zend_ulong hash_value; |
49 | | zend_string *key; |
50 | | zend_accel_hash_entry *next; |
51 | | void *data; |
52 | | bool indirect; |
53 | | }; |
54 | | |
55 | | typedef struct _zend_accel_hash { |
56 | | zend_accel_hash_entry **hash_table; |
57 | | zend_accel_hash_entry *hash_entries; |
58 | | uint32_t num_entries; |
59 | | uint32_t max_num_entries; |
60 | | uint32_t num_direct_entries; |
61 | | } zend_accel_hash; |
62 | | |
63 | | BEGIN_EXTERN_C() |
64 | | |
65 | | void zend_accel_hash_init(zend_accel_hash *accel_hash, uint32_t hash_size); |
66 | | void zend_accel_hash_clean(zend_accel_hash *accel_hash); |
67 | | |
68 | | zend_accel_hash_entry* zend_accel_hash_update( |
69 | | zend_accel_hash *accel_hash, |
70 | | zend_string *key, |
71 | | bool indirect, |
72 | | void *data); |
73 | | |
74 | | void* zend_accel_hash_find( |
75 | | zend_accel_hash *accel_hash, |
76 | | zend_string *key); |
77 | | |
78 | | zend_accel_hash_entry* zend_accel_hash_find_entry( |
79 | | zend_accel_hash *accel_hash, |
80 | | zend_string *key); |
81 | | |
82 | | int zend_accel_hash_unlink( |
83 | | zend_accel_hash *accel_hash, |
84 | | zend_string *key); |
85 | | |
86 | | static inline bool zend_accel_hash_is_full(zend_accel_hash *accel_hash) |
87 | 60.4k | { |
88 | 60.4k | if (accel_hash->num_entries == accel_hash->max_num_entries) { |
89 | 0 | return true; |
90 | 60.4k | } else { |
91 | | return false; |
92 | 60.4k | } |
93 | 60.4k | } Unexecuted instantiation: shared_alloc_mmap.c:zend_accel_hash_is_full Unexecuted instantiation: shared_alloc_posix.c:zend_accel_hash_is_full Unexecuted instantiation: shared_alloc_shm.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_api.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_blacklist.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_debug.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_hash.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_module.c:zend_accel_hash_is_full Unexecuted instantiation: zend_accelerator_util_funcs.c:zend_accel_hash_is_full Unexecuted instantiation: zend_file_cache.c:zend_accel_hash_is_full Unexecuted instantiation: zend_persist_calc.c:zend_accel_hash_is_full Unexecuted instantiation: zend_persist.c:zend_accel_hash_is_full Unexecuted instantiation: zend_shared_alloc.c:zend_accel_hash_is_full ZendAccelerator.c:zend_accel_hash_is_full Line | Count | Source | 87 | 60.4k | { | 88 | 60.4k | if (accel_hash->num_entries == accel_hash->max_num_entries) { | 89 | 0 | return true; | 90 | 60.4k | } else { | 91 | | return false; | 92 | 60.4k | } | 93 | 60.4k | } |
Unexecuted instantiation: zend_jit_vm_helpers.c:zend_accel_hash_is_full Unexecuted instantiation: zend_jit.c:zend_accel_hash_is_full Unexecuted instantiation: main.c:zend_accel_hash_is_full |
94 | | |
95 | | END_EXTERN_C() |
96 | | |
97 | | #endif /* ZEND_ACCELERATOR_HASH_H */ |