123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2023-12-07 Shell First version
- */
- #include "rid_bitmap.h"
- #include <bitmap.h>
- #include <rtdef.h>
- void rid_bitmap_init(rid_bitmap_t mgr, int min_id, int total_id_count,
- rt_bitmap_t *set, struct rt_mutex *id_lock)
- {
- mgr->min_id = min_id;
- mgr->total_id_count = total_id_count;
- mgr->bitset = set;
- mgr->id_lock = id_lock;
- return;
- }
- long rid_bitmap_get(rid_bitmap_t mgr)
- {
- long id;
- long overflow;
- if (mgr->id_lock)
- {
- rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
- }
- overflow = mgr->total_id_count;
- id = rt_bitmap_next_clear_bit(mgr->bitset, 0, overflow);
- if (id == overflow)
- {
- id = -1;
- }
- else
- {
- rt_bitmap_set_bit(mgr->bitset, id);
- id += mgr->min_id;
- }
- if (mgr->id_lock)
- {
- rt_mutex_release(mgr->id_lock);
- }
- return id;
- }
- long rid_bitmap_get_named(rid_bitmap_t mgr, long no)
- {
- long id_relative;
- long overflow;
- long min;
- if (mgr->id_lock)
- {
- rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
- }
- min = mgr->min_id;
- id_relative = no - min;
- overflow = mgr->total_id_count;
- if (id_relative >= min && id_relative < overflow)
- {
- if (rt_bitmap_test_bit(mgr->bitset, id_relative))
- {
- id_relative = -RT_EBUSY;
- }
- else
- {
- rt_bitmap_set_bit(mgr->bitset, id_relative);
- id_relative += min;
- }
- }
- else
- {
- id_relative = -1;
- }
- if (mgr->id_lock)
- {
- rt_mutex_release(mgr->id_lock);
- }
- return id_relative;
- }
- void rid_bitmap_put(rid_bitmap_t mgr, long no)
- {
- long id_relative;
- long overflow;
- long min;
- if (mgr->id_lock)
- {
- rt_mutex_take(mgr->id_lock, RT_WAITING_FOREVER);
- }
- min = mgr->min_id;
- id_relative = no - min;
- overflow = mgr->total_id_count;
- if (id_relative >= min && id_relative < overflow &&
- rt_bitmap_test_bit(mgr->bitset, id_relative))
- {
- rt_bitmap_clear_bit(mgr->bitset, id_relative);
- }
- if (mgr->id_lock)
- {
- rt_mutex_release(mgr->id_lock);
- }
- }
|