linux/include/linux/klist.h
<<
>>
Prefs
   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
  20struct klist_node;
  21struct 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};
  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
  37extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
  38                       void (*put)(struct klist_node *));
  39
  40struct klist_node {
  41        struct klist            *n_klist;
  42        struct list_head        n_node;
  43        struct kref             n_ref;
  44        struct completion       n_removed;
  45};
  46
  47extern void klist_add_tail(struct klist_node *n, struct klist *k);
  48extern void klist_add_head(struct klist_node *n, struct klist *k);
  49extern void klist_add_after(struct klist_node *n, struct klist_node *pos);
  50extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
  51
  52extern void klist_del(struct klist_node *n);
  53extern void klist_remove(struct klist_node *n);
  54
  55extern int klist_node_attached(struct klist_node *n);
  56
  57
  58struct klist_iter {
  59        struct klist            *i_klist;
  60        struct list_head        *i_head;
  61        struct klist_node       *i_cur;
  62};
  63
  64
  65extern void klist_iter_init(struct klist *k, struct klist_iter *i);
  66extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
  67                                 struct klist_node *n);
  68extern void klist_iter_exit(struct klist_iter *i);
  69extern struct klist_node *klist_next(struct klist_iter *i);
  70
  71#endif
  72
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.