| list.h | | list.h | |
| | | | |
| skipping to change at line 20 | | skipping to change at line 20 | |
| The GNU C Library is distributed in the hope that it will be useful, | | The GNU C Library is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| Lesser General Public License for more details. | | Lesser General Public License for more details. | |
| | | | |
| You should have received a copy of the GNU Lesser General Public | | You should have received a copy of the GNU Lesser General Public | |
| License along with the GNU C Library; if not, write to the Free | | License along with the GNU C Library; if not, write to the Free | |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
| 02111-1307 USA. */ | | 02111-1307 USA. */ | |
| | | | |
|
| #ifndef _LIST_H | | #ifndef _CDS_LIST_H | |
| #define _LIST_H 1 | | #define _CDS_LIST_H 1 | |
| | | | |
| /* The definitions of this file are adopted from those which can be | | /* The definitions of this file are adopted from those which can be | |
| found in the Linux kernel headers to enable people familiar with | | found in the Linux kernel headers to enable people familiar with | |
| the latter find their way in these sources as well. */ | | the latter find their way in these sources as well. */ | |
| | | | |
| /* Basic type for the double-link list. */ | | /* Basic type for the double-link list. */ | |
|
| typedef struct cds_list_head | | struct cds_list_head | |
| { | | { | |
| struct cds_list_head *next; | | struct cds_list_head *next; | |
| struct cds_list_head *prev; | | struct cds_list_head *prev; | |
|
| } list_t; | | }; | |
| | | | |
| /* Define a variable with the head and tail of the list. */ | | /* Define a variable with the head and tail of the list. */ | |
| #define CDS_LIST_HEAD(name) \ | | #define CDS_LIST_HEAD(name) \ | |
|
| list_t name = { &(name), &(name) } | | struct cds_list_head name = { &(name), &(name) } | |
| | | | |
| /* Initialize a new list head. */ | | /* Initialize a new list head. */ | |
| #define CDS_INIT_LIST_HEAD(ptr) \ | | #define CDS_INIT_LIST_HEAD(ptr) \ | |
| (ptr)->next = (ptr)->prev = (ptr) | | (ptr)->next = (ptr)->prev = (ptr) | |
| | | | |
| #define CDS_LIST_HEAD_INIT(name) { .prev = &(name), .next = &(name) } | | #define CDS_LIST_HEAD_INIT(name) { .prev = &(name), .next = &(name) } | |
| | | | |
| /* Add new element at the head of the list. */ | | /* Add new element at the head of the list. */ | |
| static inline void | | static inline void | |
|
| cds_list_add (list_t *newp, list_t *head) | | cds_list_add (struct cds_list_head *newp, struct cds_list_head *head) | |
| { | | { | |
| head->next->prev = newp; | | head->next->prev = newp; | |
| newp->next = head->next; | | newp->next = head->next; | |
| newp->prev = head; | | newp->prev = head; | |
| head->next = newp; | | head->next = newp; | |
| } | | } | |
| | | | |
| /* Add new element at the tail of the list. */ | | /* Add new element at the tail of the list. */ | |
| static inline void | | static inline void | |
|
| cds_list_add_tail (list_t *newp, list_t *head) | | cds_list_add_tail (struct cds_list_head *newp, struct cds_list_head *head) | |
| { | | { | |
| head->prev->next = newp; | | head->prev->next = newp; | |
| newp->next = head; | | newp->next = head; | |
| newp->prev = head->prev; | | newp->prev = head->prev; | |
| head->prev = newp; | | head->prev = newp; | |
| } | | } | |
| | | | |
| /* Remove element from list. */ | | /* Remove element from list. */ | |
| static inline void | | static inline void | |
|
| __cds_list_del (list_t *prev, list_t *next) | | __cds_list_del (struct cds_list_head *prev, struct cds_list_head *next) | |
| { | | { | |
| next->prev = prev; | | next->prev = prev; | |
| prev->next = next; | | prev->next = next; | |
| } | | } | |
| | | | |
| /* Remove element from list. */ | | /* Remove element from list. */ | |
| static inline void | | static inline void | |
|
| cds_list_del (list_t *elem) | | cds_list_del (struct cds_list_head *elem) | |
| { | | { | |
| __cds_list_del (elem->prev, elem->next); | | __cds_list_del (elem->prev, elem->next); | |
| } | | } | |
| | | | |
| /* delete from list, add to another list as head */ | | /* delete from list, add to another list as head */ | |
| static inline void | | static inline void | |
|
| cds_list_move (list_t *elem, list_t *head) | | cds_list_move (struct cds_list_head *elem, struct cds_list_head *head) | |
| { | | { | |
| __cds_list_del (elem->prev, elem->next); | | __cds_list_del (elem->prev, elem->next); | |
| cds_list_add (elem, head); | | cds_list_add (elem, head); | |
| } | | } | |
| | | | |
| /* replace an old entry. | | /* replace an old entry. | |
| */ | | */ | |
| static inline void | | static inline void | |
|
| cds_list_replace(list_t *old, list_t *_new) | | cds_list_replace(struct cds_list_head *old, struct cds_list_head *_new) | |
| { | | { | |
| _new->next = old->next; | | _new->next = old->next; | |
| _new->prev = old->prev; | | _new->prev = old->prev; | |
| _new->prev->next = _new; | | _new->prev->next = _new; | |
| _new->next->prev = _new; | | _new->next->prev = _new; | |
| } | | } | |
| | | | |
| /* Join two lists. */ | | /* Join two lists. */ | |
| static inline void | | static inline void | |
|
| cds_list_splice (list_t *add, list_t *head) | | cds_list_splice (struct cds_list_head *add, struct cds_list_head *head) | |
| { | | { | |
| /* Do nothing if the list which gets added is empty. */ | | /* Do nothing if the list which gets added is empty. */ | |
| if (add != add->next) | | if (add != add->next) | |
| { | | { | |
| add->next->prev = head; | | add->next->prev = head; | |
| add->prev->next = head->next; | | add->prev->next = head->next; | |
| head->next->prev = add->prev; | | head->next->prev = add->prev; | |
| head->next = add->next; | | head->next = add->next; | |
| } | | } | |
| } | | } | |
| | | | |
| skipping to change at line 147 | | skipping to change at line 147 | |
| for (pos = cds_list_entry((head)->prev, typeof(*pos), member); \ | | for (pos = cds_list_entry((head)->prev, typeof(*pos), member); \ | |
| &pos->member != (head); \ | | &pos->member != (head); \ | |
| pos = cds_list_entry(pos->member.prev, typeof(*pos), member)) | | pos = cds_list_entry(pos->member.prev, typeof(*pos), member)) | |
| | | | |
| #define cds_list_for_each_entry_safe(pos, p, head, member)
\ | | #define cds_list_for_each_entry_safe(pos, p, head, member)
\ | |
| for (pos = cds_list_entry((head)->next, typeof(*pos), member), \ | | for (pos = cds_list_entry((head)->next, typeof(*pos), member), \ | |
| p = cds_list_entry(pos->member.next,typeof(*pos), membe
r); \ | | p = cds_list_entry(pos->member.next,typeof(*pos), membe
r); \ | |
| &pos->member != (head); \ | | &pos->member != (head); \ | |
| pos = p, p = cds_list_entry(pos->member.next, typeof(*pos), mem
ber)) | | pos = p, p = cds_list_entry(pos->member.next, typeof(*pos), mem
ber)) | |
| | | | |
|
| static inline int cds_list_empty(list_t *head) | | static inline int cds_list_empty(struct cds_list_head *head) | |
| { | | { | |
| return head == head->next; | | return head == head->next; | |
| } | | } | |
| | | | |
|
| static inline void cds_list_replace_init(list_t *old, | | static inline void cds_list_replace_init(struct cds_list_head *old, | |
| list_t *_new) | | struct cds_list_head *_new) | |
| { | | { | |
|
| list_t *head = old->next; | | struct cds_list_head *head = old->next; | |
| cds_list_del(old); | | cds_list_del(old); | |
| cds_list_add_tail(_new, head); | | cds_list_add_tail(_new, head); | |
| CDS_INIT_LIST_HEAD(old); | | CDS_INIT_LIST_HEAD(old); | |
| } | | } | |
| | | | |
|
| #endif /* list.h */ | | #endif /* _CDS_LIST_H */ | |
| | | | |
End of changes. 15 change blocks. |
| 16 lines changed or deleted | | 16 lines changed or added | |
|