一、idr构建的结构可以看成是32叉树, 它需要用到2个结构体:
struct idr { struct idr_layer __rcu *top; /*根节点*/ struct idr_layer *id_free; /*空闲节点*/ int layers; /*树的高度*/ int id_free_cnt; /*空闲节点数*/ spinlock_t lock; }; struct idr_layer { unsigned long bitmap; /*位图*/ struct idr_layer __rcu *ary[1<<IDR_BITS]; /*孩子节点或者地址数据*/ int count; /*ary已存放数*/ int layer; /* 相对叶子节点的高度 */ struct rcu_head rcu_head; };
二、idr初始化:
1 #define IDR_INIT(name) \ 2 { \ 3 .top = NULL, \ 4 .id_free = NULL, \ 5 .layers = 0, \ 6 .id_free_cnt = 0, \ 7 .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ 8 } 9 #define DEFINE_IDR(name) struct idr name = IDR_INIT(name)