idr.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/linux/idr.h
  3.  * 
  4.  * 2002-10-18  written by Jim Houston jim.houston@ccur.com
  5.  * Copyright (C) 2002 by Concurrent Computer Corporation
  6.  * Distributed under the GNU GPL license version 2.
  7.  *
  8.  * Small id to pointer translation service avoiding fixed sized
  9.  * tables.
  10.  */
  11. #include <linux/types.h>
  12. #include <linux/bitops.h>
  13. #if BITS_PER_LONG == 32
  14. # define IDR_BITS 5
  15. # define IDR_FULL 0xfffffffful
  16. /* We can only use two of the bits in the top level because there is
  17.    only one possible bit in the top level (5 bits * 7 levels = 35
  18.    bits, but you only use 31 bits in the id). */
  19. # define TOP_LEVEL_FULL (IDR_FULL >> 30)
  20. #elif BITS_PER_LONG == 64
  21. # define IDR_BITS 6
  22. # define IDR_FULL 0xfffffffffffffffful
  23. /* We can only use two of the bits in the top level because there is
  24.    only one possible bit in the top level (6 bits * 6 levels = 36
  25.    bits, but you only use 31 bits in the id). */
  26. # define TOP_LEVEL_FULL (IDR_FULL >> 62)
  27. #else
  28. # error "BITS_PER_LONG is not 32 or 64"
  29. #endif
  30. #define IDR_SIZE (1 << IDR_BITS)
  31. #define IDR_MASK ((1 << IDR_BITS)-1)
  32. #define MAX_ID_SHIFT (sizeof(int)*8 - 1)
  33. #define MAX_ID_BIT (1U << MAX_ID_SHIFT)
  34. #define MAX_ID_MASK (MAX_ID_BIT - 1)
  35. /* Leave the possibility of an incomplete final layer */
  36. #define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS - 1) / IDR_BITS
  37. /* Number of id_layer structs to leave in free list */
  38. #define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL
  39. struct idr_layer {
  40. unsigned long  bitmap; /* A zero bit means "space here" */
  41. struct idr_layer *ary[1<<IDR_BITS];
  42. int  count;  /* When zero, we can release it */
  43. };
  44. struct idr {
  45. struct idr_layer *top;
  46. struct idr_layer *id_free;
  47. int   layers;
  48. int   id_free_cnt;
  49. spinlock_t   lock;
  50. };
  51. #define IDR_INIT(name)
  52. {
  53. .top = NULL,
  54. .id_free = NULL,
  55. .layers  = 0,
  56. .id_free_cnt = 0,
  57. .lock = SPIN_LOCK_UNLOCKED,
  58. }
  59. #define DEFINE_IDR(name) struct idr name = IDR_INIT(name)
  60. /*
  61.  * This is what we export.
  62.  */
  63. void *idr_find(struct idr *idp, int id);
  64. int idr_pre_get(struct idr *idp, unsigned gfp_mask);
  65. int idr_get_new(struct idr *idp, void *ptr, int *id);
  66. int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
  67. void idr_remove(struct idr *idp, int id);
  68. void idr_destroy(struct idr *idp);
  69. void idr_init(struct idr *idp);