diff options
| author | Shell <[email protected]> | 2024-03-28 23:42:56 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-03-28 23:42:56 +0800 |
| commit | 83e95bdff4c48c661b50e1eec56d5fd293b28fbb (patch) | |
| tree | 9e0c2065950f0804e5009da71c8e0f590224cade /components/utilities | |
| parent | 40e26f4909fa61ada775ba86b44d8300aaf5d250 (diff) | |
sync smart & dfs (#8672)
Signed-off-by: xqyjlj <[email protected]>
Signed-off-by: Shell <[email protected]>
Co-authored-by: xqyjlj <[email protected]>
Diffstat (limited to 'components/utilities')
| -rwxr-xr-x | components/utilities/libadt/bitmap/bitmap.h | 2 | ||||
| -rw-r--r-- | components/utilities/resource/SConscript | 4 | ||||
| -rw-r--r-- | components/utilities/resource/rid_bitmap.c | 116 | ||||
| -rw-r--r-- | components/utilities/resource/rid_bitmap.h | 34 | ||||
| -rw-r--r-- | components/utilities/ulog/ulog.c | 2 |
5 files changed, 156 insertions, 2 deletions
diff --git a/components/utilities/libadt/bitmap/bitmap.h b/components/utilities/libadt/bitmap/bitmap.h index 72fe54333a..f1b689b72e 100755 --- a/components/utilities/libadt/bitmap/bitmap.h +++ b/components/utilities/libadt/bitmap/bitmap.h @@ -18,7 +18,7 @@ typedef rt_ubase_t rt_bitmap_t; #define RT_BITMAP_BITS_MIN (sizeof(rt_bitmap_t) * 8) #define RT_BITMAP_LEN(bits) (((bits) + (RT_BITMAP_BITS_MIN) - 1) / (RT_BITMAP_BITS_MIN)) #define RT_BITMAP_BIT_LEN(nr) (nr * RT_BITMAP_BITS_MIN) -#define RT_DECLARE_BITMAP(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)] +#define RT_BITMAP_DECLARE(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)] rt_inline void rt_bitmap_set_bit(rt_bitmap_t *bitmap, rt_uint32_t bit) { diff --git a/components/utilities/resource/SConscript b/components/utilities/resource/SConscript index 6d572130a8..4410eaf937 100644 --- a/components/utilities/resource/SConscript +++ b/components/utilities/resource/SConscript @@ -3,6 +3,10 @@ from building import * cwd = GetCurrentDir() src = Glob('*.c') CPPPATH = [cwd] + +if GetDepend('RT_USING_ADT_BITMAP') == False: + SrcRemove(src, ['rid_bitmap.c']) + group = DefineGroup('Utilities', src, depend = ['RT_USING_RESOURCE_ID'], CPPPATH = CPPPATH) Return('group') diff --git a/components/utilities/resource/rid_bitmap.c b/components/utilities/resource/rid_bitmap.c new file mode 100644 index 0000000000..ebadece2a4 --- /dev/null +++ b/components/utilities/resource/rid_bitmap.c @@ -0,0 +1,116 @@ +/* + * 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); + } +} diff --git a/components/utilities/resource/rid_bitmap.h b/components/utilities/resource/rid_bitmap.h new file mode 100644 index 0000000000..d1e4e1ccc4 --- /dev/null +++ b/components/utilities/resource/rid_bitmap.h @@ -0,0 +1,34 @@ +/* + * 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 + */ + +#ifndef __RID_BITMAP_H__ +#define __RID_BITMAP_H__ + +#include <rthw.h> +#include <rtthread.h> +#include <bitmap.h> + +#define RESOURCE_ID_INIT {0} + +typedef struct rid_bitmap +{ + struct rt_mutex *id_lock; + long min_id; + long total_id_count; + rt_bitmap_t *bitset; +} *rid_bitmap_t; + +void rid_bitmap_init(rid_bitmap_t mgr, int min_id, int total_id_count, + rt_bitmap_t *set, struct rt_mutex *id_lock); +long rid_bitmap_get(rid_bitmap_t mgr); +long rid_bitmap_get_named(rid_bitmap_t mgr, long no); +void rid_bitmap_put(rid_bitmap_t mgr, long no); + +#endif /* __RID_BITMAP_H__ */ diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index 4e091f9a2b..cb0790b9de 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -1272,7 +1272,7 @@ rt_err_t ulog_backend_register(ulog_backend_t backend, const char *name, rt_bool backend->support_color = support_color; backend->out_level = LOG_FILTER_LVL_ALL; - rt_strncpy(backend->name, name, RT_NAME_MAX); + rt_strncpy(backend->name, name, RT_NAME_MAX - 1); level = rt_spin_lock_irqsave(&_spinlock); rt_slist_append(&ulog.backend_list, &backend->list); |
