php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
dobject.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018-2019 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
8
9
10#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
11 #include <sanitizer/asan_interface.h>
12#endif
13
14
17{
18 return lexbor_calloc(1, sizeof(lexbor_dobject_t));
19}
20
23 size_t chunk_size, size_t struct_size)
24{
26
27 if (dobject == NULL) {
29 }
30
31 if (chunk_size == 0 || struct_size == 0) {
33 }
34
35 /* Set params */
36 dobject->allocated = 0UL;
37 dobject->struct_size = struct_size;
38
39 /* Init memory */
40 dobject->mem = lexbor_mem_create();
41
42 status = lexbor_mem_init(dobject->mem,
43 lexbor_mem_align(chunk_size * dobject->struct_size));
44 if (status) {
45 return status;
46 }
47
48#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
49 ASAN_POISON_MEMORY_REGION(dobject->mem->chunk->data,
50 dobject->mem->chunk->size);
51#endif
52
53 /* Array */
54 dobject->cache = lexbor_array_create();
55
56 status = lexbor_array_init(dobject->cache, chunk_size);
57 if (status)
58 return status;
59
60 return LXB_STATUS_OK;
61}
62
63void
65{
66 if (dobject != NULL) {
67 dobject->allocated = 0UL;
68
69 lexbor_mem_clean(dobject->mem);
70 lexbor_array_clean(dobject->cache);
71 }
72}
73
75lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
76{
77 if (dobject == NULL)
78 return NULL;
79
80 dobject->mem = lexbor_mem_destroy(dobject->mem, true);
81 dobject->cache = lexbor_array_destroy(dobject->cache, true);
82
83 if (destroy_self == true) {
84 return lexbor_free(dobject);
85 }
86
87 return dobject;
88}
89
90void *
92{
93 void *data;
94
95 if (lexbor_array_length(dobject->cache) != 0) {
96 dobject->allocated++;
97
98#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
99 data = lexbor_array_pop(dobject->cache);
100 ASAN_UNPOISON_MEMORY_REGION(data, dobject->struct_size);
101
102 return data;
103#else
104 return lexbor_array_pop(dobject->cache);
105#endif
106 }
107
108 data = lexbor_mem_alloc(dobject->mem, dobject->struct_size);
109 if (data == NULL) {
110 return NULL;
111 }
112
113#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
114 ASAN_UNPOISON_MEMORY_REGION(data, dobject->struct_size);
115#endif
116
117 dobject->allocated++;
118
119 return data;
120}
121
122void *
124{
125 void *data = lexbor_dobject_alloc(dobject);
126
127 if (data != NULL) {
128 memset(data, 0, dobject->struct_size);
129 }
130
131 return data;
132}
133
134void *
136{
137 if (data == NULL) {
138 return NULL;
139 }
140
141#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
142 ASAN_POISON_MEMORY_REGION(data, dobject->struct_size);
143#endif
144
145 if (lexbor_array_push(dobject->cache, data) == LXB_STATUS_OK) {
146 dobject->allocated--;
147 return NULL;
148 }
149
150 return data;
151}
152
153void *
155{
156 size_t chunk_idx, chunk_pos, i;
157 lexbor_mem_chunk_t *chunk;
158
159 if (pos >= dobject->allocated) {
160 return NULL;
161 }
162
163 chunk = dobject->mem->chunk_first;
164 chunk_pos = pos * dobject->struct_size;
165 chunk_idx = chunk_pos / dobject->mem->chunk_min_size;
166
167 for (i = 0; i < chunk_idx; i++) {
168 chunk = chunk->next;
169 }
170
171 return &chunk->data[chunk_pos % chunk->size];
172}
173
174/*
175 * No inline functions for ABI.
176 */
177size_t
182
183size_t
lxb_inline size_t lexbor_array_length(lexbor_array_t *array)
Definition array.h:72
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
Definition base.h:52
@ LXB_STATUS_ERROR_WRONG_ARGS
Definition base.h:58
@ LXB_STATUS_OK
Definition base.h:49
DNS_STATUS status
Definition dns_win32.c:49
void * lexbor_dobject_calloc(lexbor_dobject_t *dobject)
Definition dobject.c:123
lxb_status_t lexbor_dobject_init(lexbor_dobject_t *dobject, size_t chunk_size, size_t struct_size)
Definition dobject.c:22
void lexbor_dobject_clean(lexbor_dobject_t *dobject)
Definition dobject.c:64
lexbor_dobject_t * lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
Definition dobject.c:75
void * lexbor_dobject_free(lexbor_dobject_t *dobject, void *data)
Definition dobject.c:135
lexbor_dobject_t * lexbor_dobject_create(void)
Definition dobject.c:16
size_t lexbor_dobject_allocated_noi(lexbor_dobject_t *dobject)
Definition dobject.c:178
void * lexbor_dobject_by_absolute_position(lexbor_dobject_t *dobject, size_t pos)
Definition dobject.c:154
void * lexbor_dobject_alloc(lexbor_dobject_t *dobject)
Definition dobject.c:91
size_t lexbor_dobject_cache_length_noi(lexbor_dobject_t *dobject)
Definition dobject.c:184
lxb_inline size_t lexbor_dobject_cache_length(lexbor_dobject_t *dobject)
Definition dobject.h:71
lxb_inline size_t lexbor_dobject_allocated(lexbor_dobject_t *dobject)
Definition dobject.h:65
lexbor_array_t * lexbor_array_create(void)
Definition array.c:11
lexbor_array_t * lexbor_array_destroy(lexbor_array_t *array, bool self_destroy)
Definition array.c:47
void lexbor_array_clean(lexbor_array_t *array)
Definition array.c:39
lxb_status_t lexbor_array_push(lexbor_array_t *array, void *value)
Definition array.c:87
void * lexbor_array_pop(lexbor_array_t *array)
Definition array.c:102
lxb_status_t lexbor_array_init(lexbor_array_t *array, size_t size)
Definition array.c:17
memset(ptr, 0, type->size)
#define NULL
Definition gdcache.h:45
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_calloc(size_t num, size_t size)
Definition memory.c:27
lexbor_mem_t * lexbor_mem_create(void)
Definition mem.c:11
lexbor_mem_t * lexbor_mem_destroy(lexbor_mem_t *mem, bool destroy_self)
Definition mem.c:69
void * lexbor_mem_alloc(lexbor_mem_t *mem, size_t length)
Definition mem.c:157
lxb_status_t lexbor_mem_init(lexbor_mem_t *mem, size_t min_chunk_size)
Definition mem.c:17
void lexbor_mem_clean(lexbor_mem_t *mem)
Definition mem.c:42
lxb_inline size_t lexbor_mem_align(size_t size)
Definition mem.h:103
struct lexbor_mem_chunk lexbor_mem_chunk_t
Definition mem.h:19
unsigned const char * pos
Definition php_ffi.h:52
zend_constant * data
lexbor_mem_t * mem
Definition dobject.h:20
size_t struct_size
Definition dobject.h:24
lexbor_array_t * cache
Definition dobject.h:21
size_t allocated
Definition dobject.h:23
size_t size
Definition mem.h:25
uint8_t * data
Definition mem.h:23
size_t chunk_min_size
Definition mem.h:35
lexbor_mem_chunk_t * chunk_first
Definition mem.h:33
lexbor_mem_chunk_t * chunk
Definition mem.h:32
unsigned int lxb_status_t
Definition types.h:28