LCOV - code coverage report
Current view: top level - crtools/include - list.h (source / functions) Hit Total Coverage
Test: crtools.info Lines: 27 27 100.0 %
Date: 2012-12-28 Functions: 0 0 -
Branches: 2 2 100.0 %

           Branch data     Line data    Source code
       1                 :            : #ifndef __CR_LIST_H__
       2                 :            : #define __CR_LIST_H__
       3                 :            : 
       4                 :            : /*
       5                 :            :  * Double linked lists.
       6                 :            :  */
       7                 :            : 
       8                 :            : #include "compiler.h"
       9                 :            : 
      10                 :            : #define POISON_POINTER_DELTA 0
      11                 :            : #define LIST_POISON1  ((void *) 0x00100100 + POISON_POINTER_DELTA)
      12                 :            : #define LIST_POISON2  ((void *) 0x00200200 + POISON_POINTER_DELTA)
      13                 :            : 
      14                 :            : struct list_head {
      15                 :            :         struct list_head *prev, *next;
      16                 :            : };
      17                 :            : 
      18                 :            : #define LIST_HEAD_INIT(name)    { &(name), &(name) }
      19                 :            : #define LIST_HEAD(name)         struct list_head name = LIST_HEAD_INIT(name)
      20                 :            : 
      21                 :            : static inline void INIT_LIST_HEAD(struct list_head *list)
      22                 :            : {
      23                 :      65434 :         list->next = list;
      24                 :      65434 :         list->prev = list;
      25                 :            : }
      26                 :            : 
      27                 :            : static inline void __list_add(struct list_head *new,
      28                 :            :                               struct list_head *prev,
      29                 :            :                               struct list_head *next)
      30                 :            : {
      31                 :      71189 :         next->prev   = new;
      32                 :      71189 :         new->next    = next;
      33                 :      71189 :         new->prev    = prev;
      34                 :      69712 :         prev->next   = new;
      35                 :            : }
      36                 :            : 
      37                 :            : static inline void list_add(struct list_head *new, struct list_head *head)
      38                 :            : {
      39                 :       1915 :         __list_add(new, head, head->next);
      40                 :            : }
      41                 :            : 
      42                 :            : static inline void list_add_tail(struct list_head *new, struct list_head *head)
      43                 :            : {
      44                 :      69274 :         __list_add(new, head->prev, head);
      45                 :            : }
      46                 :            : 
      47                 :            : static inline void __list_del(struct list_head * prev, struct list_head * next)
      48                 :            : {
      49                 :       5705 :         next->prev = prev;
      50                 :       5705 :         prev->next = next;
      51                 :            : }
      52                 :            : 
      53                 :            : static inline void __list_del_entry(struct list_head *entry)
      54                 :            : {
      55                 :        521 :         __list_del(entry->prev, entry->next);
      56                 :            : }
      57                 :            : 
      58                 :            : static inline void list_del(struct list_head *entry)
      59                 :            : {
      60                 :       5184 :         __list_del(entry->prev, entry->next);
      61                 :       5184 :         entry->next = LIST_POISON1;
      62                 :       5184 :         entry->prev = LIST_POISON2;
      63                 :            : }
      64                 :            : 
      65                 :            : static inline void list_replace(struct list_head *old,
      66                 :            :                                 struct list_head *new)
      67                 :            : {
      68                 :        624 :         new->next            = old->next;
      69                 :        624 :         new->next->prev           = new;
      70                 :        624 :         new->prev            = old->prev;
      71                 :        624 :         new->prev->next           = new;
      72                 :            : }
      73                 :            : 
      74                 :            : static inline void list_replace_init(struct list_head *old,
      75                 :            :                                         struct list_head *new)
      76                 :            : {
      77                 :            :         list_replace(old, new);
      78                 :            :         INIT_LIST_HEAD(old);
      79                 :            : }
      80                 :            : 
      81                 :            : static inline void list_del_init(struct list_head *entry)
      82                 :            : {
      83                 :            :         __list_del_entry(entry);
      84                 :            :         INIT_LIST_HEAD(entry);
      85                 :            : }
      86                 :            : 
      87                 :            : static inline void list_move(struct list_head *list, struct list_head *head)
      88                 :            : {
      89                 :            :         __list_del_entry(list);
      90                 :            :         list_add(list, head);
      91                 :            : }
      92                 :            : 
      93                 :            : static inline void list_move_tail(struct list_head *list,
      94                 :            :                                   struct list_head *head)
      95                 :            : {
      96                 :            :         __list_del_entry(list);
      97                 :            :         list_add_tail(list, head);
      98                 :            : }
      99                 :            : 
     100                 :            : static inline int list_is_last(const struct list_head *list,
     101                 :            :                                 const struct list_head *head)
     102                 :            : {
     103                 :            :         return list->next == head;
     104                 :            : }
     105                 :            : 
     106                 :            : static inline int list_is_first(const struct list_head *list,
     107                 :            :                                 const struct list_head *head)
     108                 :            : {
     109                 :            :         return list->prev == head;
     110                 :            : }
     111                 :            : 
     112                 :            : static inline int list_empty(const struct list_head *head)
     113                 :            : {
     114                 :      19949 :         return head->next == head;
     115                 :            : }
     116                 :            : 
     117                 :            : static inline int list_empty_careful(const struct list_head *head)
     118                 :            : {
     119                 :            :         struct list_head *next = head->next;
     120                 :            :         return (next == head) && (next == head->prev);
     121                 :            : }
     122                 :            : static inline void list_rotate_left(struct list_head *head)
     123                 :            : {
     124                 :            :         struct list_head *first;
     125                 :            : 
     126                 :            :         if (!list_empty(head)) {
     127                 :            :                 first = head->next;
     128                 :            :                 list_move_tail(first, head);
     129                 :            :         }
     130                 :            : }
     131                 :            : 
     132                 :            : static inline int list_is_singular(const struct list_head *head)
     133                 :            : {
     134                 :            :         return !list_empty(head) && (head->next == head->prev);
     135                 :            : }
     136                 :            : 
     137                 :            : static inline void __list_cut_position(struct list_head *list,
     138                 :            :                 struct list_head *head, struct list_head *entry)
     139                 :            : {
     140                 :            :         struct list_head *new_first = entry->next;
     141                 :            :         list->next = head->next;
     142                 :            :         list->next->prev = list;
     143                 :            :         list->prev = entry;
     144                 :            :         entry->next = list;
     145                 :            :         head->next = new_first;
     146                 :            :         new_first->prev = head;
     147                 :            : }
     148                 :            : 
     149                 :            : static inline void list_cut_position(struct list_head *list,
     150                 :            :                 struct list_head *head, struct list_head *entry)
     151                 :            : {
     152                 :            :         if (list_empty(head))
     153                 :            :                 return;
     154                 :            :         if (list_is_singular(head) &&
     155                 :            :                 (head->next != entry && head != entry))
     156                 :            :                 return;
     157                 :            :         if (entry == head)
     158                 :            :                 INIT_LIST_HEAD(list);
     159                 :            :         else
     160                 :            :                 __list_cut_position(list, head, entry);
     161                 :            : }
     162                 :            : 
     163                 :            : static inline void __list_splice(const struct list_head *list,
     164                 :            :                                  struct list_head *prev,
     165                 :            :                                  struct list_head *next)
     166                 :            : {
     167                 :        320 :         struct list_head *first = list->next;
     168                 :        320 :         struct list_head *last = list->prev;
     169                 :            : 
     170                 :        320 :         first->prev  = prev;
     171                 :        320 :         prev->next   = first;
     172                 :            : 
     173                 :        320 :         last->next   = next;
     174                 :        320 :         next->prev   = last;
     175                 :            : }
     176                 :            : 
     177                 :            : static inline void list_splice(const struct list_head *list,
     178                 :            :                                 struct list_head *head)
     179                 :            : {
     180         [ +  + ]:       1417 :         if (!list_empty(list))
     181                 :        320 :                 __list_splice(list, head, head->next);
     182                 :            : }
     183                 :            : 
     184                 :            : static inline void list_splice_tail(struct list_head *list,
     185                 :            :                                 struct list_head *head)
     186                 :            : {
     187                 :            :         if (!list_empty(list))
     188                 :            :                 __list_splice(list, head->prev, head);
     189                 :            : }
     190                 :            : 
     191                 :            : static inline void list_splice_init(struct list_head *list,
     192                 :            :                                     struct list_head *head)
     193                 :            : {
     194                 :            :         if (!list_empty(list)) {
     195                 :            :                 __list_splice(list, head, head->next);
     196                 :            :                 INIT_LIST_HEAD(list);
     197                 :            :         }
     198                 :            : }
     199                 :            : 
     200                 :            : static inline void list_splice_tail_init(struct list_head *list,
     201                 :            :                                          struct list_head *head)
     202                 :            : {
     203                 :            :         if (!list_empty(list)) {
     204                 :            :                 __list_splice(list, head->prev, head);
     205                 :            :                 INIT_LIST_HEAD(list);
     206                 :            :         }
     207                 :            : }
     208                 :            : 
     209                 :            : #define list_entry(ptr, type, member)                           \
     210                 :            :         container_of(ptr, type, member)
     211                 :            : 
     212                 :            : #define list_first_entry(ptr, type, member)                     \
     213                 :            :         list_entry((ptr)->next, type, member)
     214                 :            : 
     215                 :            : #define list_for_each(pos, head)                                \
     216                 :            :         for (pos = (head)->next; pos != (head); pos = pos->next)
     217                 :            : 
     218                 :            : #define __list_for_each(pos, head)                              \
     219                 :            :         for (pos = (head)->next; pos != (head); pos = pos->next)
     220                 :            : 
     221                 :            : #define list_for_each_prev(pos, head)                           \
     222                 :            :         for (pos = (head)->prev; pos != (head); pos = pos->prev)
     223                 :            : 
     224                 :            : #define list_for_each_safe(pos, n, head)                        \
     225                 :            :         for (pos = (head)->next, n = pos->next; pos != (head);    \
     226                 :            :                 pos = n, n = pos->next)
     227                 :            : 
     228                 :            : #define list_for_each_prev_safe(pos, n, head)                   \
     229                 :            :         for (pos = (head)->prev, n = pos->prev;                   \
     230                 :            :              pos != (head);                                     \
     231                 :            :              pos = n, n = pos->prev)
     232                 :            : 
     233                 :            : #define list_for_each_entry(pos, head, member)                          \
     234                 :            :         for (pos = list_entry((head)->next, typeof(*pos), member);   \
     235                 :            :              &pos->member != (head);                                     \
     236                 :            :              pos = list_entry(pos->member.next, typeof(*pos), member))
     237                 :            : 
     238                 :            : #define list_for_each_entry_reverse(pos, head, member)                  \
     239                 :            :         for (pos = list_entry((head)->prev, typeof(*pos), member);   \
     240                 :            :              &pos->member != (head);                                     \
     241                 :            :              pos = list_entry(pos->member.prev, typeof(*pos), member))
     242                 :            : 
     243                 :            : #define list_prepare_entry(pos, head, member)                           \
     244                 :            :         ((pos) ? : list_entry(head, typeof(*pos), member))
     245                 :            : 
     246                 :            : #define list_for_each_entry_continue(pos, head, member)                 \
     247                 :            :         for (pos = list_entry(pos->member.next, typeof(*pos), member);       \
     248                 :            :              &pos->member != (head);                                     \
     249                 :            :              pos = list_entry(pos->member.next, typeof(*pos), member))
     250                 :            : 
     251                 :            : #define list_for_each_entry_continue_reverse(pos, head, member)         \
     252                 :            :         for (pos = list_entry(pos->member.prev, typeof(*pos), member);       \
     253                 :            :              &pos->member != (head);                                     \
     254                 :            :              pos = list_entry(pos->member.prev, typeof(*pos), member))
     255                 :            : 
     256                 :            : #define list_for_each_entry_from(pos, head, member)                     \
     257                 :            :         for (; &pos->member != (head);                                   \
     258                 :            :              pos = list_entry(pos->member.next, typeof(*pos), member))
     259                 :            : 
     260                 :            : #define list_for_each_entry_safe(pos, n, head, member)                  \
     261                 :            :         for (pos = list_entry((head)->next, typeof(*pos), member),   \
     262                 :            :                 n = list_entry(pos->member.next, typeof(*pos), member);      \
     263                 :            :              &pos->member != (head);                                     \
     264                 :            :              pos = n, n = list_entry(n->member.next, typeof(*n), member))
     265                 :            : 
     266                 :            : #define list_for_each_entry_safe_continue(pos, n, head, member)                 \
     267                 :            :         for (pos = list_entry(pos->member.next, typeof(*pos), member),               \
     268                 :            :                 n = list_entry(pos->member.next, typeof(*pos), member);              \
     269                 :            :              &pos->member != (head);                                             \
     270                 :            :              pos = n, n = list_entry(n->member.next, typeof(*n), member))
     271                 :            : 
     272                 :            : #define list_for_each_entry_safe_from(pos, n, head, member)                     \
     273                 :            :         for (n = list_entry(pos->member.next, typeof(*pos), member);         \
     274                 :            :              &pos->member != (head);                                             \
     275                 :            :              pos = n, n = list_entry(n->member.next, typeof(*n), member))
     276                 :            : 
     277                 :            : #define list_for_each_entry_safe_reverse(pos, n, head, member)          \
     278                 :            :         for (pos = list_entry((head)->prev, typeof(*pos), member),   \
     279                 :            :                 n = list_entry(pos->member.prev, typeof(*pos), member);      \
     280                 :            :              &pos->member != (head);                                     \
     281                 :            :              pos = n, n = list_entry(n->member.prev, typeof(*n), member))
     282                 :            : 
     283                 :            : #define list_safe_reset_next(pos, n, member)                            \
     284                 :            :         n = list_entry(pos->member.next, typeof(*pos), member)
     285                 :            : 
     286                 :            : #endif /* __CR_LIST_H__ */

Generated by: LCOV version 1.9