Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  klist.h - Some generic list helpers, extending struct list_head a bit.
0004  *
0005  *  Implementations are found in lib/klist.c
0006  *
0007  *  Copyright (C) 2005 Patrick Mochel
0008  */
0009 
0010 #ifndef _LINUX_KLIST_H
0011 #define _LINUX_KLIST_H
0012 
0013 #include <linux/spinlock.h>
0014 #include <linux/kref.h>
0015 #include <linux/list.h>
0016 
0017 struct klist_node;
0018 struct klist {
0019     spinlock_t      k_lock;
0020     struct list_head    k_list;
0021     void            (*get)(struct klist_node *);
0022     void            (*put)(struct klist_node *);
0023 } __attribute__ ((aligned (sizeof(void *))));
0024 
0025 #define KLIST_INIT(_name, _get, _put)                   \
0026     { .k_lock   = __SPIN_LOCK_UNLOCKED(_name.k_lock),       \
0027       .k_list   = LIST_HEAD_INIT(_name.k_list),         \
0028       .get      = _get,                     \
0029       .put      = _put, }
0030 
0031 #define DEFINE_KLIST(_name, _get, _put)                 \
0032     struct klist _name = KLIST_INIT(_name, _get, _put)
0033 
0034 extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
0035                void (*put)(struct klist_node *));
0036 
0037 struct klist_node {
0038     void            *n_klist;   /* never access directly */
0039     struct list_head    n_node;
0040     struct kref     n_ref;
0041 };
0042 
0043 extern void klist_add_tail(struct klist_node *n, struct klist *k);
0044 extern void klist_add_head(struct klist_node *n, struct klist *k);
0045 extern void klist_add_behind(struct klist_node *n, struct klist_node *pos);
0046 extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
0047 
0048 extern void klist_del(struct klist_node *n);
0049 extern void klist_remove(struct klist_node *n);
0050 
0051 extern int klist_node_attached(struct klist_node *n);
0052 
0053 
0054 struct klist_iter {
0055     struct klist        *i_klist;
0056     struct klist_node   *i_cur;
0057 };
0058 
0059 
0060 extern void klist_iter_init(struct klist *k, struct klist_iter *i);
0061 extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
0062                  struct klist_node *n);
0063 extern void klist_iter_exit(struct klist_iter *i);
0064 extern struct klist_node *klist_prev(struct klist_iter *i);
0065 extern struct klist_node *klist_next(struct klist_iter *i);
0066 
0067 #endif