Lines Matching +full:- +full:- +full:head
2 * libwebsockets - small server side websockets and web server implementation
4 * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
25 #include "private-lib-core.h"
26 #include "private-lib-misc-lwsac.h"
29 lws_list_ptr_insert(lws_list_ptr *head, lws_list_ptr *add, in lws_list_ptr_insert() argument
32 while (sort_func && *head) { in lws_list_ptr_insert()
33 if (sort_func(add, *head) <= 0) in lws_list_ptr_insert()
36 head = *head; in lws_list_ptr_insert()
39 *add = *head; in lws_list_ptr_insert()
40 *head = add; in lws_list_ptr_insert()
48 if (length & (align - 1)) in lwsac_align()
49 length += align - (length & (align - 1)); in lwsac_align()
63 return lac->ofs; in lwsac_get_tail_pos()
69 return lac->next; in lwsac_get_next()
73 lwsac_extend(struct lwsac *head, size_t amount) in lwsac_extend() argument
78 assert(head); in lwsac_extend()
79 lachead = (struct lwsac_head *)&head[1]; in lwsac_extend()
81 bf = lachead->curr; in lwsac_extend()
84 if (bf->alloc_size - bf->ofs < lwsac_align(amount)) in lwsac_extend()
89 memset(((uint8_t *)bf) + bf->ofs, 0, lwsac_align(amount)); in lwsac_extend()
90 bf->ofs += lwsac_align(amount); in lwsac_extend()
96 _lwsac_use(struct lwsac **head, size_t ensure, size_t chunk_size, char backfill) in _lwsac_use() argument
100 struct lwsac *bf = *head; in _lwsac_use()
114 if (bf->alloc_size - bf->ofs >= ensure) in _lwsac_use()
117 bf = bf->next; in _lwsac_use()
123 if (lachead && lachead->curr) { in _lwsac_use()
124 bf = lachead->curr; in _lwsac_use()
125 if (bf->alloc_size - bf->ofs >= ensure) in _lwsac_use()
133 if (!*head) in _lwsac_use()
146 if (al >= alloc - hp) in _lwsac_use()
161 bf->ofs = sizeof(*bf); in _lwsac_use()
163 if (!*head) { in _lwsac_use()
165 * We are the first, head, entry... in _lwsac_use()
167 *head = bf; in _lwsac_use()
169 * ... allocate for the special head block in _lwsac_use()
171 bf->ofs += sizeof(*lachead); in _lwsac_use()
175 if (lachead->curr) in _lwsac_use()
176 lachead->curr->next = bf; in _lwsac_use()
178 lachead->curr = bf; in _lwsac_use()
179 bf->head = *head; in _lwsac_use()
180 bf->next = NULL; in _lwsac_use()
181 bf->alloc_size = alloc; in _lwsac_use()
183 lachead->total_alloc_size += alloc; in _lwsac_use()
184 lachead->total_blocks++; in _lwsac_use()
188 ofs = bf->ofs; in _lwsac_use()
192 memset((char *)bf + ofs + ensure, 0, al - ensure); in _lwsac_use()
194 bf->ofs += al; in _lwsac_use()
195 if (bf->ofs >= bf->alloc_size) in _lwsac_use()
196 bf->ofs = bf->alloc_size; in _lwsac_use()
202 lwsac_use(struct lwsac **head, size_t ensure, size_t chunk_size) in lwsac_use() argument
204 return _lwsac_use(head, ensure, chunk_size, 0); in lwsac_use()
208 lwsac_use_backfill(struct lwsac **head, size_t ensure, size_t chunk_size) in lwsac_use_backfill() argument
210 return _lwsac_use(head, ensure, chunk_size, 1); in lwsac_use_backfill()
214 lwsac_scan_extant(struct lwsac *head, uint8_t *find, size_t len, int nul) in lwsac_scan_extant() argument
216 while (head) { in lwsac_scan_extant()
217 uint8_t *pos = (uint8_t *)&head[1], in lwsac_scan_extant()
218 *end = ((uint8_t *)head) + head->ofs - len; in lwsac_scan_extant()
220 if (head->ofs - sizeof(*head) >= len) in lwsac_scan_extant()
223 pos[len - 1] == find[len - 1] && in lwsac_scan_extant()
230 head = head->next; in lwsac_scan_extant()
237 lwsac_total_overhead(struct lwsac *head) in lwsac_total_overhead() argument
241 while (head) { in lwsac_total_overhead()
242 overhead += (head->alloc_size - head->ofs) + sizeof(*head); in lwsac_total_overhead()
244 head = head->next; in lwsac_total_overhead()
251 lwsac_use_zero(struct lwsac **head, size_t ensure, size_t chunk_size) in lwsac_use_zero() argument
253 void *p = lwsac_use(head, ensure, chunk_size); in lwsac_use_zero()
262 lwsac_free(struct lwsac **head) in lwsac_free() argument
264 struct lwsac *it = *head; in lwsac_free()
266 *head = NULL; in lwsac_free()
267 lwsl_debug("%s: head %p\n", __func__, *head); in lwsac_free()
270 struct lwsac *tmp = it->next; in lwsac_free()
278 lwsac_info(struct lwsac *head) in lwsac_info() argument
283 if (!head) { in lwsac_info()
288 lachead = (struct lwsac_head *)&head[1]; in lwsac_info()
290 lwsl_debug("%s: lac %p: %dKiB in %d blocks\n", __func__, head, in lwsac_info()
291 (int)(lachead->total_alloc_size >> 10), lachead->total_blocks); in lwsac_info()
296 lwsac_total_alloc(struct lwsac *head) in lwsac_total_alloc() argument
300 if (!head) in lwsac_total_alloc()
303 lachead = (struct lwsac_head *)&head[1]; in lwsac_total_alloc()
304 return lachead->total_alloc_size; in lwsac_total_alloc()
308 lwsac_reference(struct lwsac *head) in lwsac_reference() argument
310 struct lwsac_head *lachead = (struct lwsac_head *)&head[1]; in lwsac_reference()
312 lachead->refcount++; in lwsac_reference()
313 lwsl_debug("%s: head %p: (det %d) refcount -> %d\n", in lwsac_reference()
314 __func__, head, lachead->detached, lachead->refcount); in lwsac_reference()
318 lwsac_unreference(struct lwsac **head) in lwsac_unreference() argument
322 if (!(*head)) in lwsac_unreference()
325 lachead = (struct lwsac_head *)&(*head)[1]; in lwsac_unreference()
327 if (!lachead->refcount) in lwsac_unreference()
330 lachead->refcount--; in lwsac_unreference()
332 lwsl_debug("%s: head %p: (det %d) refcount -> %d\n", in lwsac_unreference()
333 __func__, *head, lachead->detached, lachead->refcount); in lwsac_unreference()
335 if (lachead->detached && !lachead->refcount) { in lwsac_unreference()
336 lwsl_debug("%s: head %p: FREED\n", __func__, *head); in lwsac_unreference()
337 lwsac_free(head); in lwsac_unreference()
342 lwsac_detach(struct lwsac **head) in lwsac_detach() argument
346 if (!(*head)) in lwsac_detach()
349 lachead = (struct lwsac_head *)&(*head)[1]; in lwsac_detach()
351 lachead->detached = 1; in lwsac_detach()
352 if (!lachead->refcount) { in lwsac_detach()
353 lwsl_debug("%s: head %p: FREED\n", __func__, *head); in lwsac_detach()
354 lwsac_free(head); in lwsac_detach()
356 lwsl_debug("%s: head %p: refcount %d: Marked as detached\n", in lwsac_detach()
357 __func__, *head, lachead->refcount); in lwsac_detach()