listhelp.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LISTHELP_H
  2. #define _LISTHELP_H
  3. #include <linux/config.h>
  4. #include <linux/list.h>
  5. /* Header to do more comprehensive job than linux/list.h; assume list
  6.    is first entry in structure. */
  7. /* Return pointer to first true entry, if any, or NULL.  A macro
  8.    required to allow inlining of cmpfn. */
  9. #define LIST_FIND(head, cmpfn, type, args...)
  10. ({
  11. const struct list_head *__i, *__j = NULL;
  12. ASSERT_READ_LOCK(head);
  13. list_for_each(__i, (head))
  14. if (cmpfn((const type)__i , ## args)) {
  15. __j = __i;
  16. break;
  17. }
  18. (type)__j;
  19. })
  20. #define LIST_FIND_W(head, cmpfn, type, args...)
  21. ({
  22. const struct list_head *__i, *__j = NULL;
  23. ASSERT_WRITE_LOCK(head);
  24. list_for_each(__i, (head))
  25. if (cmpfn((type)__i , ## args)) {
  26. __j = __i;
  27. break;
  28. }
  29. (type)__j;
  30. })
  31. /* Just like LIST_FIND but we search backwards */
  32. #define LIST_FIND_B(head, cmpfn, type, args...)
  33. ({
  34. const struct list_head *__i, *__j = NULL;
  35. ASSERT_READ_LOCK(head);
  36. list_for_each_prev(__i, (head))
  37. if (cmpfn((const type)__i , ## args)) {
  38. __j = __i;
  39. break;
  40. }
  41. (type)__j;
  42. })
  43. static inline int
  44. __list_cmp_same(const void *p1, const void *p2) { return p1 == p2; }
  45. /* Is this entry in the list? */
  46. static inline int
  47. list_inlist(struct list_head *head, const void *entry)
  48. {
  49. return LIST_FIND(head, __list_cmp_same, void *, entry) != NULL;
  50. }
  51. /* Delete from list. */
  52. #ifdef CONFIG_NETFILTER_DEBUG
  53. #define LIST_DELETE(head, oldentry)
  54. do {
  55. ASSERT_WRITE_LOCK(head);
  56. if (!list_inlist(head, oldentry))
  57. printk("LIST_DELETE: %s:%u `%s'(%p) not in %s.n",
  58.        __FILE__, __LINE__, #oldentry, oldentry, #head);
  59.         else list_del((struct list_head *)oldentry);
  60. } while(0)
  61. #else
  62. #define LIST_DELETE(head, oldentry) list_del((struct list_head *)oldentry)
  63. #endif
  64. /* Append. */
  65. static inline void
  66. list_append(struct list_head *head, void *new)
  67. {
  68. ASSERT_WRITE_LOCK(head);
  69. list_add((new), (head)->prev);
  70. }
  71. /* Prepend. */
  72. static inline void
  73. list_prepend(struct list_head *head, void *new)
  74. {
  75. ASSERT_WRITE_LOCK(head);
  76. list_add(new, head);
  77. }
  78. /* Insert according to ordering function; insert before first true. */
  79. #define LIST_INSERT(head, new, cmpfn)
  80. do {
  81. struct list_head *__i;
  82. ASSERT_WRITE_LOCK(head);
  83. list_for_each(__i, (head))
  84. if ((new), (typeof (new))__i)
  85. break;
  86. list_add((struct list_head *)(new), __i->prev);
  87. } while(0)
  88. /* If the field after the list_head is a nul-terminated string, you
  89.    can use these functions. */
  90. static inline int __list_cmp_name(const void *i, const char *name)
  91. {
  92. return strcmp(name, i+sizeof(struct list_head)) == 0;
  93. }
  94. /* Returns false if same name already in list, otherwise does insert. */
  95. static inline int
  96. list_named_insert(struct list_head *head, void *new)
  97. {
  98. if (LIST_FIND(head, __list_cmp_name, void *,
  99.       new + sizeof(struct list_head)))
  100. return 0;
  101. list_prepend(head, new);
  102. return 1;
  103. }
  104. /* Find this named element in the list. */
  105. #define list_named_find(head, name)
  106. LIST_FIND(head, __list_cmp_name, void *, name)
  107. #endif /*_LISTHELP_H*/