Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.14.15.
 1#ifndef _LINUX_XLIST_H
 2#define _LINUX_XLIST_H
 3
 4#include <linux/stddef.h>
 5#include <linux/poison.h>
 6#include <linux/prefetch.h>
 7#include <asm/system.h>
 8
 9struct xlist_head {
10	struct xlist_head *next;
11};
12
13static inline void INIT_XLIST_HEAD(struct xlist_head *list)
14{
15	list->next = NULL;
16}
17
18static inline int xlist_empty(struct xlist_head *head)
19{
20	return head->next == NULL;
21}
22
23static inline void xlist_add(struct xlist_head *new, struct xlist_head *tail,
24			     struct xlist_head *head)
25{
26	struct xlist_head *cur;
27	struct xlist_head *check;
28
29	while (1) {
30		cur = head->next;
31		tail->next = cur;
32		check = cmpxchg(&head->next, cur, new);
33		if (check == cur)
34			break;
35	}
36}
37
38static inline struct xlist_head *xlist_del_head(struct xlist_head *head)
39{
40	struct xlist_head *cur;
41	struct xlist_head *check;
42	struct xlist_head *next;
43
44	while (1) {
45		cur = head->next;
46		if (!cur)
47			goto out;
48
49		next = cur->next;
50		check = cmpxchg(&head->next, cur, next);
51		if (check == cur)
52			goto out;
53	}
54out:
55	return cur;
56}
57
58static inline struct xlist_head *xlist_del_head_fast(struct xlist_head *head)
59{
60	struct xlist_head *cur;
61
62	cur = head->next;
63	if (!cur)
64		return NULL;
65
66	head->next = cur->next;
67	return cur;
68}
69
70static inline void xlist_splice(struct xlist_head *list,
71				struct xlist_head *head)
72{
73	struct xlist_head *cur;
74
75	WARN_ON(head->next);
76	cur = xchg(&list->next, NULL);
77	head->next = cur;
78}
79
80#endif