Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.38 80 lines 1.4 kB view raw
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