File: /Users/paulross/dev/linux/linux-3.13/include/linux/klist.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       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/kref.h>
      17: #include <linux/list.h>
      18: 
      19: struct klist_node;
      20: struct klist {
      21:     spinlock_t        k_lock;
      22:     struct list_head    k_list;
      23:     void            (*get)(struct klist_node *);
      24:     void            (*put)(struct klist_node *);
      25: } __attribute__ ((aligned (sizeof(void *))));
      26: 
      27: #define KLIST_INIT(_name, _get, _put)                    \
      28:     { .k_lock    = __SPIN_LOCK_UNLOCKED(_name.k_lock),        \
      29:       .k_list    = LIST_HEAD_INIT(_name.k_list),            \
      30:       .get        = _get,                        \
      31:       .put        = _put, }
      32: 
      33: #define DEFINE_KLIST(_name, _get, _put)                    \
      34:     struct klist _name = KLIST_INIT(_name, _get, _put)
      35: 
      36: extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
      37:                void (*put)(struct klist_node *));
      38: 
      39: struct klist_node {
      40:     void            *n_klist;    /* never access directly */
      41:     struct list_head    n_node;
      42:     struct kref        n_ref;
      43: };
      44: 
      45: extern void klist_add_tail(struct klist_node *n, struct klist *k);
      46: extern void klist_add_head(struct klist_node *n, struct klist *k);
      47: extern void klist_add_after(struct klist_node *n, struct klist_node *pos);
      48: extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
      49: 
      50: extern void klist_del(struct klist_node *n);
      51: extern void klist_remove(struct klist_node *n);
      52: 
      53: extern int klist_node_attached(struct klist_node *n);
      54: 
      55: 
      56: struct klist_iter {
      57:     struct klist        *i_klist;
      58:     struct klist_node    *i_cur;
      59: };
      60: 
      61: 
      62: extern void klist_iter_init(struct klist *k, struct klist_iter *i);
      63: extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
      64:                  struct klist_node *n);
      65: extern void klist_iter_exit(struct klist_iter *i);
      66: extern struct klist_node *klist_next(struct klist_iter *i);
      67: 
      68: #endif
      69: