首页 > 代码库 > linux内核神级list
linux内核神级list
1 #ifndef _LINUX_LIST_H 2 #define _LINUX_LIST_H 3 4 struct list_head { 5 struct list_head *next, *prev; 6 }; 7 8 struct hlist_head { 9 struct hlist_node *first; 10 }; 11 12 struct hlist_node { 13 struct hlist_node *next, **pprev; 14 }; 15 16 #ifndef offsetof 17 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 18 #endif 19 20 #ifndef container_of 21 /** 22 * container_of - cast a member of a structure out to the containing structure 23 * @ptr: the pointer to the member. 24 * @type: the type of the container struct this is embedded in. 25 * @member: the name of the member within the struct. 26 * 27 */ 28 #define container_of(ptr, type, member) ({ 29 const typeof(((type *)0)->member) * __mptr = (ptr); 30 (type *)((char *)__mptr - offsetof(type, member)); }) 31 #endif 32 33 #define LIST_POISON1 NULL 34 #define LIST_POISON2 NULL 35 36 /* 37 * Simple doubly linked list implementation. 38 * 39 * Some of the internal functions ("__xxx") are useful when 40 * manipulating whole lists rather than single entries, as 41 * sometimes we already know the next/prev entries and we can 42 * generate better code by using them directly rather than 43 * using the generic single-entry routines. 44 */ 45 46 #define LIST_HEAD_INIT(name) { &(name), &(name) } 47 48 #define LIST_HEAD(name) 49 struct list_head name = LIST_HEAD_INIT(name) 50 51 static inline void INIT_LIST_HEAD(struct list_head *list) 52 { 53 list->next = list; 54 list->prev = list; 55 } 56 57 /* 58 * Insert a new entry between two known consecutive entries. 59 * 60 * This is only for internal list manipulation where we know 61 * the prev/next entries already! 62 */ 63 #ifndef CONFIG_DEBUG_LIST 64 static inline void __list_add(struct list_head *new, 65 struct list_head *prev, 66 struct list_head *next) 67 { 68 next->prev = new; 69 new->next = next; 70 new->prev = prev; 71 prev->next = new; 72 } 73 #else 74 extern void __list_add(struct list_head *new, 75 struct list_head *prev, 76 struct list_head *next); 77 #endif 78 79 /** 80 * list_add - add a new entry 81 * @new: new entry to be added 82 * @head: list head to add it after 83 * 84 * Insert a new entry after the specified head. 85 * This is good for implementing stacks. 86 */ 87 static inline void list_add(struct list_head *new, struct list_head *head) 88 { 89 __list_add(new, head, head->next); 90 } 91 92 93 /** 94 * list_add_tail - add a new entry 95 * @new: new entry to be added 96 * @head: list head to add it before 97 * 98 * Insert a new entry before the specified head. 99 * This is useful for implementing queues.100 */101 static inline void list_add_tail(struct list_head *new, struct list_head *head)102 {103 __list_add(new, head->prev, head);104 }105 106 /*107 * Delete a list entry by making the prev/next entries108 * point to each other.109 *110 * This is only for internal list manipulation where we know111 * the prev/next entries already!112 */113 static inline void __list_del(struct list_head * prev, struct list_head * next)114 {115 next->prev = prev;116 prev->next = next;117 }118 119 /**120 * list_del - deletes entry from list.121 * @entry: the element to delete from the list.122 * Note: list_empty() on entry does not return true after this, the entry is123 * in an undefined state.124 */125 #ifndef CONFIG_DEBUG_LIST126 static inline void __list_del_entry(struct list_head *entry)127 {128 __list_del(entry->prev, entry->next);129 }130 131 static inline void list_del(struct list_head *entry)132 {133 __list_del(entry->prev, entry->next);134 entry->next = LIST_POISON1;135 entry->prev = LIST_POISON2;136 }137 #else138 extern void __list_del_entry(struct list_head *entry);139 extern void list_del(struct list_head *entry);140 #endif141 142 /**143 * list_replace - replace old entry by new one144 * @old : the element to be replaced145 * @new : the new element to insert146 *147 * If @old was empty, it will be overwritten.148 */149 static inline void list_replace(struct list_head *old,150 struct list_head *new)151 {152 new->next = old->next;153 new->next->prev = new;154 new->prev = old->prev;155 new->prev->next = new;156 }157 158 static inline void list_replace_init(struct list_head *old,159 struct list_head *new)160 {161 list_replace(old, new);162 INIT_LIST_HEAD(old);163 }164 165 /**166 * list_del_init - deletes entry from list and reinitialize it.167 * @entry: the element to delete from the list.168 */169 static inline void list_del_init(struct list_head *entry)170 {171 __list_del_entry(entry);172 INIT_LIST_HEAD(entry);173 }174 175 /**176 * list_move - delete from one list and add as another‘s head177 * @list: the entry to move178 * @head: the head that will precede our entry179 */180 static inline void list_move(struct list_head *list, struct list_head *head)181 {182 __list_del_entry(list);183 list_add(list, head);184 }185 186 /**187 * list_move_tail - delete from one list and add as another‘s tail188 * @list: the entry to move189 * @head: the head that will follow our entry190 */191 static inline void list_move_tail(struct list_head *list,192 struct list_head *head)193 {194 __list_del_entry(list);195 list_add_tail(list, head);196 }197 198 /**199 * list_is_last - tests whether @list is the last entry in list @head200 * @list: the entry to test201 * @head: the head of the list202 */203 static inline int list_is_last(const struct list_head *list,204 const struct list_head *head)205 {206 return list->next == head;207 }208 209 /**210 * list_empty - tests whether a list is empty211 * @head: the list to test.212 */213 static inline int list_empty(const struct list_head *head)214 {215 return head->next == head;216 }217 218 /**219 * list_empty_careful - tests whether a list is empty and not being modified220 * @head: the list to test221 *222 * Description:223 * tests whether a list is empty _and_ checks that no other CPU might be224 * in the process of modifying either member (next or prev)225 *226 * NOTE: using list_empty_careful() without synchronization227 * can only be safe if the only activity that can happen228 * to the list entry is list_del_init(). Eg. it cannot be used229 * if another CPU could re-list_add() it.230 */231 static inline int list_empty_careful(const struct list_head *head)232 {233 struct list_head *next = head->next;234 return (next == head) && (next == head->prev);235 }236 237 /**238 * list_rotate_left - rotate the list to the left239 * @head: the head of the list240 */241 static inline void list_rotate_left(struct list_head *head)242 {243 struct list_head *first;244 245 if (!list_empty(head)) {246 first = head->next;247 list_move_tail(first, head);248 }249 }250 251 /**252 * list_is_singular - tests whether a list has just one entry.253 * @head: the list to test.254 */255 static inline int list_is_singular(const struct list_head *head)256 {257 return !list_empty(head) && (head->next == head->prev);258 }259 260 static inline void __list_cut_position(struct list_head *list,261 struct list_head *head, struct list_head *entry)262 {263 struct list_head *new_first = entry->next;264 list->next = head->next;265 list->next->prev = list;266 list->prev = entry;267 entry->next = list;268 head->next = new_first;269 new_first->prev = head;270 }271 272 /**273 * list_cut_position - cut a list into two274 * @list: a new list to add all removed entries275 * @head: a list with entries276 * @entry: an entry within head, could be the head itself277 * and if so we won‘t cut the list278 *279 * This helper moves the initial part of @head, up to and280 * including @entry, from @head to @list. You should281 * pass on @entry an element you know is on @head. @list282 * should be an empty list or a list you do not care about283 * losing its data.284 *285 */286 static inline void list_cut_position(struct list_head *list,287 struct list_head *head, struct list_head *entry)288 {289 if (list_empty(head))290 return;291 if (list_is_singular(head) &&292 (head->next != entry && head != entry))293 return;294 if (entry == head)295 INIT_LIST_HEAD(list);296 else297 __list_cut_position(list, head, entry);298 }299 300 static inline void __list_splice(const struct list_head *list,301 struct list_head *prev,302 struct list_head *next)303 {304 struct list_head *first = list->next;305 struct list_head *last = list->prev;306 307 first->prev = prev;308 prev->next = first;309 310 last->next = next;311 next->prev = last;312 }313 314 /**315 * list_splice - join two lists, this is designed for stacks316 * @list: the new list to add.317 * @head: the place to add it in the first list.318 */319 static inline void list_splice(const struct list_head *list,320 struct list_head *head)321 {322 if (!list_empty(list))323 __list_splice(list, head, head->next);324 }325 326 /**327 * list_splice_tail - join two lists, each list being a queue328 * @list: the new list to add.329 * @head: the place to add it in the first list.330 */331 static inline void list_splice_tail(struct list_head *list,332 struct list_head *head)333 {334 if (!list_empty(list))335 __list_splice(list, head->prev, head);336 }337 338 /**339 * list_splice_init - join two lists and reinitialise the emptied list.340 * @list: the new list to add.341 * @head: the place to add it in the first list.342 *343 * The list at @list is reinitialised344 */345 static inline void list_splice_init(struct list_head *list,346 struct list_head *head)347 {348 if (!list_empty(list)) {349 __list_splice(list, head, head->next);350 INIT_LIST_HEAD(list);351 }352 }353 354 /**355 * list_splice_tail_init - join two lists and reinitialise the emptied list356 * @list: the new list to add.357 * @head: the place to add it in the first list.358 *359 * Each of the lists is a queue.360 * The list at @list is reinitialised361 */362 static inline void list_splice_tail_init(struct list_head *list,363 struct list_head *head)364 {365 if (!list_empty(list)) {366 __list_splice(list, head->prev, head);367 INIT_LIST_HEAD(list);368 }369 }370 371 /**372 * list_entry - get the struct for this entry373 * @ptr: the &struct list_head pointer.374 * @type: the type of the struct this is embedded in.375 * @member: the name of the list_struct within the struct.376 */377 #define list_entry(ptr, type, member) 378 container_of(ptr, type, member)379 380 /**381 * list_first_entry - get the first element from a list382 * @ptr: the list head to take the element from.383 * @type: the type of the struct this is embedded in.384 * @member: the name of the list_struct within the struct.385 *386 * Note, that list is expected to be not empty.387 */388 #define list_first_entry(ptr, type, member) 389 list_entry((ptr)->next, type, member)390 391 /**392 * list_for_each - iterate over a list393 * @pos: the &struct list_head to use as a loop cursor.394 * @head: the head for your list.395 */396 #define list_for_each(pos, head) 397 for (pos = (head)->next; pos != (head); pos = pos->next)398 399 /**400 * __list_for_each - iterate over a list401 * @pos: the &struct list_head to use as a loop cursor.402 * @head: the head for your list.403 *404 * This variant doesn‘t differ from list_for_each() any more.405 * We don‘t do prefetching in either case.406 */407 #define __list_for_each(pos, head) 408 for (pos = (head)->next; pos != (head); pos = pos->next)409 410 /**411 * list_for_each_prev - iterate over a list backwards412 * @pos: the &struct list_head to use as a loop cursor.413 * @head: the head for your list.414 */415 #define list_for_each_prev(pos, head) 416 for (pos = (head)->prev; pos != (head); pos = pos->prev)417 418 /**419 * list_for_each_safe - iterate over a list safe against removal of list entry420 * @pos: the &struct list_head to use as a loop cursor.421 * @n: another &struct list_head to use as temporary storage422 * @head: the head for your list.423 */424 #define list_for_each_safe(pos, n, head) 425 for (pos = (head)->next, n = pos->next; pos != (head); 426 pos = n, n = pos->next)427 428 /**429 * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry430 * @pos: the &struct list_head to use as a loop cursor.431 * @n: another &struct list_head to use as temporary storage432 * @head: the head for your list.433 */434 #define list_for_each_prev_safe(pos, n, head) 435 for (pos = (head)->prev, n = pos->prev; 436 pos != (head); 437 pos = n, n = pos->prev)438 439 /**440 * list_for_each_entry - iterate over list of given type441 * @pos: the type * to use as a loop cursor.442 * @head: the head for your list.443 * @member: the name of the list_struct within the struct.444 */445 #define list_for_each_entry(pos, head, member) 446 for (pos = list_entry((head)->next, typeof(*pos), member); 447 &pos->member != (head); 448 pos = list_entry(pos->member.next, typeof(*pos), member))449 450 /**451 * list_for_each_entry_reverse - iterate backwards over list of given type.452 * @pos: the type * to use as a loop cursor.453 * @head: the head for your list.454 * @member: the name of the list_struct within the struct.455 */456 #define list_for_each_entry_reverse(pos, head, member) 457 for (pos = list_entry((head)->prev, typeof(*pos), member); 458 &pos->member != (head); 459 pos = list_entry(pos->member.prev, typeof(*pos), member))460 461 /**462 * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()463 * @pos: the type * to use as a start point464 * @head: the head of the list465 * @member: the name of the list_struct within the struct.466 *467 * Prepares a pos entry for use as a start point in list_for_each_entry_continue().468 */469 #define list_prepare_entry(pos, head, member) 470 ((pos) ? : list_entry(head, typeof(*pos), member))471 472 /**473 * list_for_each_entry_continue - continue iteration over list of given type474 * @pos: the type * to use as a loop cursor.475 * @head: the head for your list.476 * @member: the name of the list_struct within the struct.477 *478 * Continue to iterate over list of given type, continuing after479 * the current position.480 */481 #define list_for_each_entry_continue(pos, head, member) 482 for (pos = list_entry(pos->member.next, typeof(*pos), member); 483 &pos->member != (head); 484 pos = list_entry(pos->member.next, typeof(*pos), member))485 486 /**487 * list_for_each_entry_continue_reverse - iterate backwards from the given point488 * @pos: the type * to use as a loop cursor.489 * @head: the head for your list.490 * @member: the name of the list_struct within the struct.491 *492 * Start to iterate over list of given type backwards, continuing after493 * the current position.494 */495 #define list_for_each_entry_continue_reverse(pos, head, member) 496 for (pos = list_entry(pos->member.prev, typeof(*pos), member); 497 &pos->member != (head); 498 pos = list_entry(pos->member.prev, typeof(*pos), member))499 500 /**501 * list_for_each_entry_from - iterate over list of given type from the current point502 * @pos: the type * to use as a loop cursor.503 * @head: the head for your list.504 * @member: the name of the list_struct within the struct.505 *506 * Iterate over list of given type, continuing from current position.507 */508 #define list_for_each_entry_from(pos, head, member) 509 for (; &pos->member != (head); 510 pos = list_entry(pos->member.next, typeof(*pos), member))511 512 /**513 * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry514 * @pos: the type * to use as a loop cursor.515 * @n: another type * to use as temporary storage516 * @head: the head for your list.517 * @member: the name of the list_struct within the struct.518 */519 #define list_for_each_entry_safe(pos, n, head, member) 520 for (pos = list_entry((head)->next, typeof(*pos), member), 521 n = list_entry(pos->member.next, typeof(*pos), member); 522 &pos->member != (head); 523 pos = n, n = list_entry(n->member.next, typeof(*n), member))524 525 /**526 * list_for_each_entry_safe_continue - continue list iteration safe against removal527 * @pos: the type * to use as a loop cursor.528 * @n: another type * to use as temporary storage529 * @head: the head for your list.530 * @member: the name of the list_struct within the struct.531 *532 * Iterate over list of given type, continuing after current point,533 * safe against removal of list entry.534 */535 #define list_for_each_entry_safe_continue(pos, n, head, member) 536 for (pos = list_entry(pos->member.next, typeof(*pos), member), 537 n = list_entry(pos->member.next, typeof(*pos), member); 538 &pos->member != (head); 539 pos = n, n = list_entry(n->member.next, typeof(*n), member))540 541 /**542 * list_for_each_entry_safe_from - iterate over list from current point safe against removal543 * @pos: the type * to use as a loop cursor.544 * @n: another type * to use as temporary storage545 * @head: the head for your list.546 * @member: the name of the list_struct within the struct.547 *548 * Iterate over list of given type from current point, safe against549 * removal of list entry.550 */551 #define list_for_each_entry_safe_from(pos, n, head, member) 552 for (n = list_entry(pos->member.next, typeof(*pos), member); 553 &pos->member != (head); 554 pos = n, n = list_entry(n->member.next, typeof(*n), member))555 556 /**557 * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal558 * @pos: the type * to use as a loop cursor.559 * @n: another type * to use as temporary storage560 * @head: the head for your list.561 * @member: the name of the list_struct within the struct.562 *563 * Iterate backwards over list of given type, safe against removal564 * of list entry.565 */566 #define list_for_each_entry_safe_reverse(pos, n, head, member) 567 for (pos = list_entry((head)->prev, typeof(*pos), member), 568 n = list_entry(pos->member.prev, typeof(*pos), member); 569 &pos->member != (head); 570 pos = n, n = list_entry(n->member.prev, typeof(*n), member))571 572 /**573 * list_safe_reset_next - reset a stale list_for_each_entry_safe loop574 * @pos: the loop cursor used in the list_for_each_entry_safe loop575 * @n: temporary storage used in list_for_each_entry_safe576 * @member: the name of the list_struct within the struct.577 *578 * list_safe_reset_next is not safe to use in general if the list may be579 * modified concurrently (eg. the lock is dropped in the loop body). An580 * exception to this is if the cursor element (pos) is pinned in the list,581 * and list_safe_reset_next is called after re-taking the lock and before582 * completing the current iteration of the loop body.583 */584 #define list_safe_reset_next(pos, n, member) 585 n = list_entry(pos->member.next, typeof(*pos), member)586 587 /*588 * Double linked lists with a single pointer list head.589 * Mostly useful for hash tables where the two pointer list head is590 * too wasteful.591 * You lose the ability to access the tail in O(1).592 */593 594 #define HLIST_HEAD_INIT { .first = NULL }595 #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }596 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)597 static inline void INIT_HLIST_NODE(struct hlist_node *h)598 {599 h->next = NULL;600 h->pprev = NULL;601 }602 603 static inline int hlist_unhashed(const struct hlist_node *h)604 {605 return !h->pprev;606 }607 608 static inline int hlist_empty(const struct hlist_head *h)609 {610 return !h->first;611 }612 613 static inline void __hlist_del(struct hlist_node *n)614 {615 struct hlist_node *next = n->next;616 struct hlist_node **pprev = n->pprev;617 *pprev = next;618 if (next)619 next->pprev = pprev;620 }621 622 static inline void hlist_del(struct hlist_node *n)623 {624 __hlist_del(n);625 n->next = LIST_POISON1;626 n->pprev = LIST_POISON2;627 }628 629 static inline void hlist_del_init(struct hlist_node *n)630 {631 if (!hlist_unhashed(n)) {632 __hlist_del(n);633 INIT_HLIST_NODE(n);634 }635 }636 637 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)638 {639 struct hlist_node *first = h->first;640 n->next = first;641 if (first)642 first->pprev = &n->next;643 h->first = n;644 n->pprev = &h->first;645 }646 647 /* next must be != NULL */648 static inline void hlist_add_before(struct hlist_node *n,649 struct hlist_node *next)650 {651 n->pprev = next->pprev;652 n->next = next;653 next->pprev = &n->next;654 *(n->pprev) = n;655 }656 657 static inline void hlist_add_after(struct hlist_node *n,658 struct hlist_node *next)659 {660 next->next = n->next;661 n->next = next;662 next->pprev = &n->next;663 664 if(next->next)665 next->next->pprev = &next->next;666 }667 668 /* after that we‘ll appear to be on some hlist and hlist_del will work */669 static inline void hlist_add_fake(struct hlist_node *n)670 {671 n->pprev = &n->next;672 }673 674 /*675 * Move a list from one list head to another. Fixup the pprev676 * reference of the first entry if it exists.677 */678 static inline void hlist_move_list(struct hlist_head *old,679 struct hlist_head *new)680 {681 new->first = old->first;682 if (new->first)683 new->first->pprev = &new->first;684 old->first = NULL;685 }686 687 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)688 689 #define hlist_for_each(pos, head) 690 for (pos = (head)->first; pos ; pos = pos->next)691 692 #define hlist_for_each_safe(pos, n, head) 693 for (pos = (head)->first; pos && ({ n = pos->next; 1; }); 694 pos = n)695 696 /**697 * hlist_for_each_entry - iterate over list of given type698 * @tpos: the type * to use as a loop cursor.699 * @pos: the &struct hlist_node to use as a loop cursor.700 * @head: the head for your list.701 * @member: the name of the hlist_node within the struct.702 */703 #define hlist_for_each_entry(tpos, pos, head, member) 704 for (pos = (head)->first; 705 pos && 706 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 707 pos = pos->next)708 709 /**710 * hlist_for_each_entry_continue - iterate over a hlist continuing after current point711 * @tpos: the type * to use as a loop cursor.712 * @pos: the &struct hlist_node to use as a loop cursor.713 * @member: the name of the hlist_node within the struct.714 */715 #define hlist_for_each_entry_continue(tpos, pos, member) 716 for (pos = (pos)->next; 717 pos && 718 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 719 pos = pos->next)720 721 /**722 * hlist_for_each_entry_from - iterate over a hlist continuing from current point723 * @tpos: the type * to use as a loop cursor.724 * @pos: the &struct hlist_node to use as a loop cursor.725 * @member: the name of the hlist_node within the struct.726 */727 #define hlist_for_each_entry_from(tpos, pos, member) 728 for (; pos && 729 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 730 pos = pos->next)731 732 /**733 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry734 * @tpos: the type * to use as a loop cursor.735 * @pos: the &struct hlist_node to use as a loop cursor.736 * @n: another &struct hlist_node to use as temporary storage737 * @head: the head for your list.738 * @member: the name of the hlist_node within the struct.739 */740 #define hlist_for_each_entry_safe(tpos, pos, n, head, member) 741 for (pos = (head)->first; 742 pos && ({ n = pos->next; 1; }) && 743 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 744 pos = n)745 746 #endif
linux内核神级list
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。