sdk-core
v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Toggle main menu visibility
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1
5
#ifndef LIST_H_
6
#define LIST_H_
7
8
#include <stddef.h>
9
10
#define container_of(ptr, type, member) ({ \
11
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
12
(type *)( (char *)__mptr - offsetof(type,member) ); })
13
14
struct
list_head
15
{
16
struct
list_head
*next, *prev;
17
};
18
19
static
inline
void
list_init(
struct
list_head
*list)
20
{
21
list->next = list;
22
list->prev = list;
23
}
24
25
static
inline
void
list_insert(
struct
list_head
*list,
struct
list_head
*node)
26
{
27
struct
list_head
*prev = list->prev;
28
29
node->next = list;
30
node->prev = list->prev;
31
list->prev = node;
32
prev->next = node;
33
}
34
35
static
inline
int
list_empty(
struct
list_head
*list)
36
{
37
return
list == list->next;
38
}
39
40
static
inline
void
list_join(
struct
list_head
*prev,
struct
list_head
*next)
41
{
42
prev->next = next;
43
next->prev = prev;
44
}
45
46
static
inline
void
list_remove(
struct
list_head
*node)
47
{
48
list_join(node->prev, node->next);
49
node->next = NULL;
50
node->prev = NULL;
51
}
52
53
static
inline
int
list_node_is_last(
struct
list_head
*list)
54
{
55
return
list->next == list->prev;
56
}
57
58
static
inline
int
list_same_node(
struct
list_head
*node1,
struct
list_head
*node2)
59
{
60
return
node1 == node2;
61
}
62
63
#define list_first_entry(ptr, type, member) \
64
container_of((ptr)->next, type, member)
65
66
#define list_next_entry(pos, member) \
67
container_of((pos)->member.next, typeof(*(pos)), member)
68
69
#define list_entry_is_head(pos, head, member) \
70
(&(pos)->member == (head))
71
72
#define list_for_each_it(var, list) \
73
for ((var) = (list)->next; \
74
!list_same_node((var), list); \
75
(var) = (var)->next)
76
77
#define list_for_each(var, head, member) \
78
for ((var) = list_first_entry(head, typeof(*(var)), member); \
79
!list_entry_is_head(var, head, member); \
80
(var) = list_next_entry(var, member))
81
82
#define list_for_each_safe_it(var, n, list) \
83
for ((var) = (list)->next, (n) = (var)->next; \
84
!list_same_node((var), list); \
85
(var) = (n), (n) = (var)->next)
86
87
#define list_for_each_safe(var, head, member) \
88
typeof((var)) var##__safe; \
89
for ((var) = list_first_entry(head, typeof(*(var)), member), \
90
(var##__safe) = list_next_entry(var, member); \
91
!list_entry_is_head(var, head, member); \
92
(var) = (var##__safe), (var##__safe) = list_next_entry(var##__safe, member))
93
94
static
inline
int
list_length(
struct
list_head
*list)
95
{
96
struct
list_head
*i;
97
int
len = 0;
98
99
list_for_each_it(i, list)
100
{
101
len++;
102
}
103
104
return
len;
105
}
106
107
108
#endif
// LIST_H_
list_head
Definition
list.h:15
core
threadman
src
include
list.h
Generated by
1.18.0