home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / klist.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  1.9 KB  |  71 lines

  1. /*
  2.  *    klist.h - Some generic list helpers, extending struct list_head a bit.
  3.  *
  4.  *    Implementations are found in lib/klist.c
  5.  *
  6.  *
  7.  *    Copyright (C) 2005 Patrick Mochel
  8.  *
  9.  *    This file is rleased under the GPL v2.
  10.  */
  11.  
  12. #ifndef _LINUX_KLIST_H
  13. #define _LINUX_KLIST_H
  14.  
  15. #include <linux/spinlock.h>
  16. #include <linux/completion.h>
  17. #include <linux/kref.h>
  18. #include <linux/list.h>
  19.  
  20. struct klist_node;
  21. struct klist {
  22.     spinlock_t        k_lock;
  23.     struct list_head    k_list;
  24.     void            (*get)(struct klist_node *);
  25.     void            (*put)(struct klist_node *);
  26. } __attribute__ ((aligned (4)));
  27.  
  28. #define KLIST_INIT(_name, _get, _put)                    \
  29.     { .k_lock    = __SPIN_LOCK_UNLOCKED(_name.k_lock),        \
  30.       .k_list    = LIST_HEAD_INIT(_name.k_list),            \
  31.       .get        = _get,                        \
  32.       .put        = _put, }
  33.  
  34. #define DEFINE_KLIST(_name, _get, _put)                    \
  35.     struct klist _name = KLIST_INIT(_name, _get, _put)
  36.  
  37. extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
  38.                void (*put)(struct klist_node *));
  39.  
  40. struct klist_node {
  41.     void            *n_klist;    /* never access directly */
  42.     struct list_head    n_node;
  43.     struct kref        n_ref;
  44.     struct completion    n_removed;
  45. };
  46.  
  47. extern void klist_add_tail(struct klist_node *n, struct klist *k);
  48. extern void klist_add_head(struct klist_node *n, struct klist *k);
  49. extern void klist_add_after(struct klist_node *n, struct klist_node *pos);
  50. extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
  51.  
  52. extern void klist_del(struct klist_node *n);
  53. extern void klist_remove(struct klist_node *n);
  54.  
  55. extern int klist_node_attached(struct klist_node *n);
  56.  
  57.  
  58. struct klist_iter {
  59.     struct klist        *i_klist;
  60.     struct klist_node    *i_cur;
  61. };
  62.  
  63.  
  64. extern void klist_iter_init(struct klist *k, struct klist_iter *i);
  65. extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
  66.                  struct klist_node *n);
  67. extern void klist_iter_exit(struct klist_iter *i);
  68. extern struct klist_node *klist_next(struct klist_iter *i);
  69.  
  70. #endif
  71.