rid_bitmap.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-12-07 Shell First version
  9. */
  10. #include "rid_bitmap.h"
  11. #include <bitmap.h>
  12. #include <rtdef.h>
  13. void rid_bitmap_init(rid_bitmap_t mgr, int min_id, int total_id_count,
  14. rt_bitmap_t *set, struct rt_mutex *id_lock)
  15. {
  16. mgr->min_id = min_id;
  17. mgr->total_id_count = total_id_count;
  18. mgr->bitset = set;
  19. mgr->id_lock = id_lock;
  20. return;
  21. }
  22. long rid_bitmap_get(rid_bitmap_t mgr)
  23. {
  24. long id;
  25. long overflow;
  26. if (mgr->id_lock)
  27. {
  28. rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
  29. }
  30. overflow = mgr->total_id_count;
  31. id = rt_bitmap_next_clear_bit(mgr->bitset, 0, overflow);
  32. if (id == overflow)
  33. {
  34. id = -1;
  35. }
  36. else
  37. {
  38. rt_bitmap_set_bit(mgr->bitset, id);
  39. id += mgr->min_id;
  40. }
  41. if (mgr->id_lock)
  42. {
  43. rt_mutex_release(mgr->id_lock);
  44. }
  45. return id;
  46. }
  47. long rid_bitmap_get_named(rid_bitmap_t mgr, long no)
  48. {
  49. long id_relative;
  50. long overflow;
  51. long min;
  52. if (mgr->id_lock)
  53. {
  54. rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
  55. }
  56. min = mgr->min_id;
  57. id_relative = no - min;
  58. overflow = mgr->total_id_count;
  59. if (id_relative >= min && id_relative < overflow)
  60. {
  61. if (rt_bitmap_test_bit(mgr->bitset, id_relative))
  62. {
  63. id_relative = -RT_EBUSY;
  64. }
  65. else
  66. {
  67. rt_bitmap_set_bit(mgr->bitset, id_relative);
  68. id_relative += min;
  69. }
  70. }
  71. else
  72. {
  73. id_relative = -1;
  74. }
  75. if (mgr->id_lock)
  76. {
  77. rt_mutex_release(mgr->id_lock);
  78. }
  79. return id_relative;
  80. }
  81. void rid_bitmap_put(rid_bitmap_t mgr, long no)
  82. {
  83. long id_relative;
  84. long overflow;
  85. long min;
  86. if (mgr->id_lock)
  87. {
  88. rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
  89. }
  90. min = mgr->min_id;
  91. id_relative = no - min;
  92. overflow = mgr->total_id_count;
  93. if (id_relative >= min && id_relative < overflow &&
  94. rt_bitmap_test_bit(mgr->bitset, id_relative))
  95. {
  96. rt_bitmap_clear_bit(mgr->bitset, id_relative);
  97. }
  98. if (mgr->id_lock)
  99. {
  100. rt_mutex_release(mgr->id_lock);
  101. }
  102. }