Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
sflist.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
27
28#ifndef ZEPHYR_INCLUDE_SYS_SFLIST_H_
29#define ZEPHYR_INCLUDE_SYS_SFLIST_H_
30
31#include <stdint.h>
32#include <stdbool.h>
33#include <zephyr/sys/__assert.h>
34#include "list_gen.h"
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
41struct _sfnode {
42 uintptr_t next_and_flags;
43};
45
47typedef struct _sfnode sys_sfnode_t;
48
50struct _sflist {
51 sys_sfnode_t *head;
52 sys_sfnode_t *tail;
53};
55
57typedef struct _sflist sys_sflist_t;
58
74#define SYS_SFLIST_FOR_EACH_NODE(__sl, __sn) \
75 Z_GENLIST_FOR_EACH_NODE(sflist, __sl, __sn)
76
97#define SYS_SFLIST_ITERATE_FROM_NODE(__sl, __sn) \
98 Z_GENLIST_ITERATE_FROM_NODE(sflist, __sl, __sn)
99
116#define SYS_SFLIST_FOR_EACH_NODE_SAFE(__sl, __sn, __sns) \
117 Z_GENLIST_FOR_EACH_NODE_SAFE(sflist, __sl, __sn, __sns)
118
127#define SYS_SFLIST_CONTAINER(__ln, __cn, __n) \
128 Z_GENLIST_CONTAINER(__ln, __cn, __n)
129
137#define SYS_SFLIST_PEEK_HEAD_CONTAINER(__sl, __cn, __n) \
138 Z_GENLIST_PEEK_HEAD_CONTAINER(sflist, __sl, __cn, __n)
139
147#define SYS_SFLIST_PEEK_TAIL_CONTAINER(__sl, __cn, __n) \
148 Z_GENLIST_PEEK_TAIL_CONTAINER(sflist, __sl, __cn, __n)
149
156#define SYS_SFLIST_PEEK_NEXT_CONTAINER(__cn, __n) \
157 Z_GENLIST_PEEK_NEXT_CONTAINER(sflist, __cn, __n)
158
173#define SYS_SFLIST_FOR_EACH_CONTAINER(__sl, __cn, __n) \
174 Z_GENLIST_FOR_EACH_CONTAINER(sflist, __sl, __cn, __n)
175
191#define SYS_SFLIST_FOR_EACH_CONTAINER_SAFE(__sl, __cn, __cns, __n) \
192 Z_GENLIST_FOR_EACH_CONTAINER_SAFE(sflist, __sl, __cn, __cns, __n)
193
194
195/*
196 * Required function definitions for the list_gen.h interface
197 *
198 * These are the only functions that do not treat the list/node pointers
199 * as completely opaque types.
200 */
201
207static inline void sys_sflist_init(sys_sflist_t *list)
208{
209 list->head = NULL;
210 list->tail = NULL;
211}
212
217#define SYS_SFLIST_STATIC_INIT(ptr_to_list) {NULL, NULL}
218
219/* Flag bits are stored in unused LSB of the sys_sfnode_t pointer */
220#define SYS_SFLIST_FLAGS_MASK ((uintptr_t)(__alignof__(sys_sfnode_t) - 1))
221/* At least 2 available flag bits are expected */
222BUILD_ASSERT(SYS_SFLIST_FLAGS_MASK >= 0x3);
223
224static inline sys_sfnode_t *z_sfnode_next_peek(const sys_sfnode_t *node)
225{
226 return (sys_sfnode_t *)(node->next_and_flags & ~SYS_SFLIST_FLAGS_MASK);
227}
228
229static inline uint8_t sys_sfnode_flags_get(const sys_sfnode_t *node);
230
231static inline void z_sfnode_next_set(sys_sfnode_t *parent,
232 sys_sfnode_t *child)
233{
234 uint8_t cur_flags = sys_sfnode_flags_get(parent);
235
236 parent->next_and_flags = cur_flags | (uintptr_t)child;
237}
238
239static inline void z_sflist_head_set(sys_sflist_t *list, sys_sfnode_t *node)
240{
241 list->head = node;
242}
243
244static inline void z_sflist_tail_set(sys_sflist_t *list, sys_sfnode_t *node)
245{
246 list->tail = node;
247}
248
257{
258 return list->head;
259}
260
269{
270 return list->tail;
271}
272
273/*
274 * APIs specific to sflist type
275 */
276
284static inline uint8_t sys_sfnode_flags_get(const sys_sfnode_t *node)
285{
286 return node->next_and_flags & SYS_SFLIST_FLAGS_MASK;
287}
288
303static inline void sys_sfnode_init(sys_sfnode_t *node, uint8_t flags)
304{
305 __ASSERT((flags & ~SYS_SFLIST_FLAGS_MASK) == 0UL, "flags too large");
306 node->next_and_flags = flags;
307}
308
321{
322 __ASSERT((flags & ~SYS_SFLIST_FLAGS_MASK) == 0UL, "flags too large");
323 node->next_and_flags = (uintptr_t)(z_sfnode_next_peek(node)) | flags;
324}
325
326/*
327 * Derived, generated APIs
328 */
329
337static inline bool sys_sflist_is_empty(const sys_sflist_t *list);
338
339Z_GENLIST_IS_EMPTY(sflist)
340
341
351
352Z_GENLIST_PEEK_NEXT_NO_CHECK(sflist, sfnode)
353
354
361static inline sys_sfnode_t *sys_sflist_peek_next(const sys_sfnode_t *node);
362
363Z_GENLIST_PEEK_NEXT(sflist, sfnode)
364
365
373static inline void sys_sflist_prepend(sys_sflist_t *list,
374 sys_sfnode_t *node);
375
376Z_GENLIST_PREPEND(sflist, sfnode)
377
378
386static inline void sys_sflist_append(sys_sflist_t *list,
387 sys_sfnode_t *node);
388
389Z_GENLIST_APPEND(sflist, sfnode)
390
391
402static inline void sys_sflist_append_list(sys_sflist_t *list,
403 void *head, void *tail);
404
405Z_GENLIST_APPEND_LIST(sflist, sfnode)
406
407
416static inline void sys_sflist_merge_sflist(sys_sflist_t *list,
417 sys_sflist_t *list_to_append);
418
419Z_GENLIST_MERGE_LIST(sflist, sfnode)
420
421
430static inline void sys_sflist_insert(sys_sflist_t *list,
431 sys_sfnode_t *prev,
432 sys_sfnode_t *node);
433
434Z_GENLIST_INSERT(sflist, sfnode)
435
436
447
448Z_GENLIST_GET_NOT_EMPTY(sflist, sfnode)
449
450
459static inline sys_sfnode_t *sys_sflist_get(sys_sflist_t *list);
460
461Z_GENLIST_GET(sflist, sfnode)
462
463
473static inline void sys_sflist_remove(sys_sflist_t *list,
474 sys_sfnode_t *prev_node,
475 sys_sfnode_t *node);
476
477Z_GENLIST_REMOVE(sflist, sfnode)
478
479
489static inline bool sys_sflist_find_and_remove(sys_sflist_t *list,
490 sys_sfnode_t *node);
491
492Z_GENLIST_FIND_AND_REMOVE(sflist, sfnode)
493
494
501static inline size_t sys_sflist_len(const sys_sflist_t *list);
502
503Z_GENLIST_LEN(sflist, sfnode)
504
505
506
507#ifdef __cplusplus
508}
509#endif
510
511#endif /* ZEPHYR_INCLUDE_SYS_SFLIST_H_ */
struct _sfnode sys_sfnode_t
Flagged single-linked list node structure.
Definition sflist.h:47
static bool sys_sflist_is_empty(const sys_sflist_t *list)
Test if the given list is empty.
Definition sflist.h:339
static sys_sfnode_t * sys_sflist_get_not_empty(sys_sflist_t *list)
Fetch and remove the first node of the given list.
Definition sflist.h:448
static sys_sfnode_t * sys_sflist_get(sys_sflist_t *list)
Fetch and remove the first node of the given list.
Definition sflist.h:461
static sys_sfnode_t * sys_sflist_peek_next_no_check(const sys_sfnode_t *node)
Peek the next node from current node, node is not NULL.
Definition sflist.h:352
static size_t sys_sflist_len(const sys_sflist_t *list)
Compute the size of the given list in O(n) time.
Definition sflist.h:503
#define SYS_SFLIST_FLAGS_MASK
Definition sflist.h:220
static void sys_sflist_remove(sys_sflist_t *list, sys_sfnode_t *prev_node, sys_sfnode_t *node)
Remove a node.
Definition sflist.h:477
static void sys_sflist_merge_sflist(sys_sflist_t *list, sys_sflist_t *list_to_append)
merge two sflists, appending the second one to the first
Definition sflist.h:419
static void sys_sflist_append(sys_sflist_t *list, sys_sfnode_t *node)
Append a node to the given list.
Definition sflist.h:389
static void sys_sflist_prepend(sys_sflist_t *list, sys_sfnode_t *node)
Prepend a node to the given list.
Definition sflist.h:376
static void sys_sfnode_flags_set(sys_sfnode_t *node, uint8_t flags)
Set flags value for an sflist node.
Definition sflist.h:320
static void sys_sflist_insert(sys_sflist_t *list, sys_sfnode_t *prev, sys_sfnode_t *node)
Insert a node to the given list.
Definition sflist.h:434
static sys_sfnode_t * sys_sflist_peek_tail(const sys_sflist_t *list)
Peek the last node from the list.
Definition sflist.h:268
static void sys_sflist_init(sys_sflist_t *list)
Initialize a list.
Definition sflist.h:207
struct _sflist sys_sflist_t
Flagged single-linked list structure.
Definition sflist.h:57
static sys_sfnode_t * sys_sflist_peek_head(const sys_sflist_t *list)
Peek the first node from the list.
Definition sflist.h:256
static sys_sfnode_t * sys_sflist_peek_next(const sys_sfnode_t *node)
Peek the next node from current node.
Definition sflist.h:363
static void sys_sflist_append_list(sys_sflist_t *list, void *head, void *tail)
Append a list to the given list.
Definition sflist.h:405
static uint8_t sys_sfnode_flags_get(const sys_sfnode_t *node)
Fetch flags value for a particular sfnode.
Definition sflist.h:284
static bool sys_sflist_find_and_remove(sys_sflist_t *list, sys_sfnode_t *node)
Find and remove a node from a list.
Definition sflist.h:492
static void sys_sfnode_init(sys_sfnode_t *node, uint8_t flags)
Initialize an sflist node.
Definition sflist.h:303
Internal generic linked-list macro generators shared by slist/dlist/sflist.
flags
Definition parser.h:97
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105