48#define lws_start_foreach_ll(type, it, start)\
52 int _c_##it = 0, _b_##it = 0; \
53 for (; !_c_##it; _c_##it = 1) {
69#define lws_end_foreach_ll(it, nxt) \
72 if (!_b_##it) break; \
96#define lws_start_foreach_ll_safe(type, it, start, nxt)\
99 for (type it = start; it && ((next_##it = it->nxt), 1); it = next_##it) {
115#define lws_end_foreach_ll_safe(it) \
139#define lws_start_foreach_llp(type, it, start)\
141 type it = &(start); \
143 int _c_##it = 0, _b_##it = 0; \
144 for (; !_c_##it; _c_##it = 1) {
146#define lws_start_foreach_llp_safe(type, it, start, nxt)\
149 for (type it = &(start); *(it) && ((next = &((*(it))->nxt)), 1); it = next) {
165#define lws_end_foreach_llp(it, nxt) \
168 if (!_b_##it) break; \
169 it = &(*(it))->nxt; \
173#define lws_end_foreach_llp_safe(it) \
177#define lws_ll_fwd_insert(\
182 ___new_object->___m_list = ___list_head; \
183 ___list_head = ___new_object; \
186#define lws_ll_fwd_remove(\
192 lws_start_foreach_llp(___type **, ___ppss, ___list_head) { \
193 if (*___ppss == ___target) { \
194 *___ppss = ___target->___m_list; \
197 } lws_end_foreach_llp(___ppss, ___m_list); \
225#define LWS_DLL2_ARM_TOTAL_BAN 1
227#if LWS_DLL2_ARM_TOTAL_BAN && \
228 (defined(LWS_BUILDING_STATIC) || defined(LWS_BUILDING_SHARED))
230#undef lws_start_foreach_ll
231#undef lws_end_foreach_ll
232#undef lws_start_foreach_ll_safe
233#undef lws_end_foreach_ll_safe
234#undef lws_start_foreach_llp
235#undef lws_end_foreach_llp
236#undef lws_start_foreach_llp_safe
237#undef lws_end_foreach_llp_safe
238#undef lws_ll_fwd_insert
239#undef lws_ll_fwd_remove
241#define lws_start_foreach_ll(...) \
242 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
243#define lws_end_foreach_ll(...) \
244 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
245#define lws_start_foreach_ll_safe(...) \
246 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
247#define lws_end_foreach_ll_safe(...) \
248 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
249#define lws_start_foreach_llp(...) \
250 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
251#define lws_end_foreach_llp(...) \
252 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
253#define lws_start_foreach_llp_safe(...) \
254 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
255#define lws_end_foreach_llp_safe(...) \
256 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
257#define lws_ll_fwd_insert(...) \
258 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
259#define lws_ll_fwd_remove(...) \
260 LWS_LIB_MAY_NOT_USE_LEGACY_LIST_MACROS_see_lws_dll2_h
345 return !lws_dll2_count(
owner);
349lws_dll2_get_next(
const struct lws_dll2 *d) {
return d ? d->
next : NULL; }
352lws_dll2_get_prev(
const struct lws_dll2 *d) {
return d ? d->
prev : NULL; }
387 int (*compare3)(
void *priv,
const lws_dll2_t *d,
442 size_t dll2_ofs,
size_t ptr_ofs);
450#define lws_dll2_search_sz_pl(own, name, namelen, type, membd2list, membptr) \
451 ((type *)_lws_dll2_search_sz_pl(own, name, namelen, \
452 offsetof(type, membd2list), \
453 offsetof(type, membptr)))
456_lws_dll2_owner_container(
const struct lws_dll2 *d,
size_t owner_ofs)
458 return d && d->
owner ?
459 (
void *)((
char *)d->
owner - owner_ofs) : NULL;
476#define lws_dll2_owner_container(___d, ___type, ___membowner) \
477 ((___type *)_lws_dll2_owner_container(___d, \
478 offsetof(___type, ___membowner)))
484#define lws_dll2_describe(x, y)
509#define lws_start_foreach_dll_safe(___type, ___it, ___tmp, ___start) \
512 struct lws_dll2 *___st_##___it = (___start); \
513 struct lws_dll2_owner *___ow_##___it = \
514 ___st_##___it ? ___st_##___it->owner : NULL; \
515 uint32_t ___gen_##___it = ___ow_##___it ? \
516 ___ow_##___it->generation : 0; \
517 for (___type ___it = ___st_##___it; \
518 ___it && (((___tmp) = (___it)->next), 1); \
519 ___it = _lws_dll2_safe_next(___ow_##___it, &___gen_##___it, \
522#define lws_end_foreach_dll_safe(___it, ___tmp) \
526#define lws_start_foreach_dll(___type, ___it, ___start) \
528 for (___type ___it = (___start); ___it; ___it = (___it)->next) {
530#define lws_end_foreach_dll(___it) \
542#define lws_start_foreach_dll_back(___type, ___it, ___start) \
544 for (___type ___it = (___start); ___it; ___it = (___it)->prev) {
546#define lws_end_foreach_dll_back(___it) \
563#define lws_start_foreach_dll_safe_back(___type, ___it, ___tmp, ___start) \
566 struct lws_dll2 *___st_##___it = (___start); \
567 struct lws_dll2_owner *___ow_##___it = \
568 ___st_##___it ? ___st_##___it->owner : NULL; \
569 uint32_t ___gen_##___it = ___ow_##___it ? \
570 ___ow_##___it->generation : 0; \
571 for (___type ___it = ___st_##___it; \
572 ___it && (((___tmp) = (___it)->prev), 1); \
573 ___it = _lws_dll2_safe_prev(___ow_##___it, &___gen_##___it, \
576#define lws_end_foreach_dll_safe_back(___it, ___tmp) \
struct lws_dll2_owner * owner
struct lws_dll2 lws_dll2_t
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_tail(struct lws_dll2 *d, struct lws_dll2_owner *owner)
LWS_VISIBLE LWS_EXTERN struct lws_dll2 * _lws_dll2_safe_next(struct lws_dll2_owner *ow, uint32_t *gen, struct lws_dll2 *cand)
LWS_VISIBLE LWS_EXTERN void lws_dll2_owner_clear(struct lws_dll2_owner *d)
LWS_VISIBLE LWS_EXTERN struct lws_dll2 * _lws_dll2_safe_prev(struct lws_dll2_owner *ow, uint32_t *gen, struct lws_dll2 *cand)
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_sorted_priv(lws_dll2_t *d, lws_dll2_owner_t *own, void *priv, int(*compare3)(void *priv, const lws_dll2_t *d, const lws_dll2_t *i))
LWS_VISIBLE LWS_EXTERN int lws_dll2_is_in_list(struct lws_dll2_owner *owner, struct lws_dll2 *d)
#define lws_dll2_describe(x, y)
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_sorted(lws_dll2_t *d, lws_dll2_owner_t *own, int(*compare)(const lws_dll2_t *d, const lws_dll2_t *i))
struct lws_dll2_owner lws_dll2_owner_t
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_insert(struct lws_dll2 *d, struct lws_dll2 *prev)
LWS_VISIBLE LWS_EXTERN void * _lws_dll2_search_sz_pl(lws_dll2_owner_t *own, const char *name, size_t namelen, size_t dll2_ofs, size_t ptr_ofs)
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_before(struct lws_dll2 *d, struct lws_dll2 *after)
int(* lws_dll2_foreach_cb_t)(struct lws_dll2 *d, void *user)
LWS_VISIBLE LWS_EXTERN int lws_dll2_is_detached(const struct lws_dll2 *d)
LWS_VISIBLE LWS_EXTERN void lws_dll2_remove(struct lws_dll2 *d)
LWS_VISIBLE LWS_EXTERN_FOR_DATA int lws_dll2_guard_quiet
LWS_VISIBLE LWS_EXTERN void lws_dll2_clear(struct lws_dll2 *d)
LWS_VISIBLE LWS_EXTERN int lws_dll2_foreach_safe(struct lws_dll2_owner *owner, void *user, lws_dll2_foreach_cb_t cb)
LWS_VISIBLE LWS_EXTERN void lws_dll2_add_head(struct lws_dll2 *d, struct lws_dll2_owner *owner)
#define LWS_EXTERN_FOR_DATA