diff options
Diffstat (limited to 'components/vbus/prio_queue.c')
| -rw-r--r-- | components/vbus/prio_queue.c | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/components/vbus/prio_queue.c b/components/vbus/prio_queue.c deleted file mode 100644 index 9c8dca5157..0000000000 --- a/components/vbus/prio_queue.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2013-11-04 Grissiom add comment - */ - -#include <rthw.h> -#include <rtthread.h> - -#include "prio_queue.h" - -struct rt_prio_queue_item { - struct rt_prio_queue_item *next; - /* data follows */ -}; - -static void _do_push(struct rt_prio_queue *que, - rt_uint8_t prio, - struct rt_prio_queue_item *item) -{ - if (que->head[prio] == RT_NULL) - { - que->head[prio] = item; - que->bitmap |= 1 << prio; - } - else - { - RT_ASSERT(que->tail[prio]); - que->tail[prio]->next = item; - } - que->tail[prio] = item; -} - -static struct rt_prio_queue_item* _do_pop(struct rt_prio_queue *que) -{ - int ffs; - struct rt_prio_queue_item *item; - - ffs = __rt_ffs(que->bitmap); - if (ffs == 0) - return RT_NULL; - ffs--; - - item = que->head[ffs]; - RT_ASSERT(item); - - que->head[ffs] = item->next; - if (que->head[ffs] == RT_NULL) - { - que->bitmap &= ~(1 << ffs); - } - - return item; -} - -rt_err_t rt_prio_queue_init(struct rt_prio_queue *que, - const char *name, - void *buf, - rt_size_t bufsz, - rt_size_t itemsz) -{ - RT_ASSERT(que); - - rt_memset(que, 0, sizeof(*que)); - - rt_list_init(&(que->suspended_pop_list)); - - rt_mp_init(&que->pool, name, buf, bufsz, - sizeof(struct rt_prio_queue_item) + itemsz); - - que->item_sz = itemsz; - - return RT_EOK; -} - -void rt_prio_queue_detach(struct rt_prio_queue *que) -{ - /* wake up all suspended pop threads, push thread is suspended on mempool. - */ - while (!rt_list_isempty(&(que->suspended_pop_list))) - { - rt_thread_t thread; - - /* disable interrupt */ - rt_base_t level = rt_hw_interrupt_disable(); - - /* get next suspend thread */ - thread = RT_THREAD_LIST_NODE_ENTRY(que->suspended_pop_list.next); - /* set error code to -RT_ERROR */ - thread->error = -RT_ERROR; - - rt_thread_resume(thread); - - /* enable interrupt */ - rt_hw_interrupt_enable(level); - } - rt_mp_detach(&que->pool); -} - -#ifdef RT_USING_HEAP -struct rt_prio_queue* rt_prio_queue_create(const char *name, - rt_size_t item_nr, - rt_size_t item_sz) -{ - struct rt_prio_queue *que; - rt_size_t bufsz; - - bufsz = item_nr * (sizeof(struct rt_prio_queue_item) - + item_sz - + sizeof(void*)); - - RT_ASSERT(item_nr); - - que = rt_malloc(sizeof(*que) + bufsz); - if (!que) - return RT_NULL; - - rt_prio_queue_init(que, name, que+1, bufsz, item_sz); - - return que; -} - -void rt_prio_queue_delete(struct rt_prio_queue *que) -{ - rt_prio_queue_detach(que); - rt_free(que); -} -#endif - -rt_err_t rt_prio_queue_push(struct rt_prio_queue *que, - rt_uint8_t prio, - void *data, - rt_int32_t timeout) -{ - rt_base_t level; - struct rt_prio_queue_item *item; - - RT_ASSERT(que); - - if (prio >= RT_PRIO_QUEUE_PRIO_MAX) - return -RT_ERROR; - - item = rt_mp_alloc(&que->pool, timeout); - if (item == RT_NULL) - return -RT_ENOMEM; - - rt_memcpy(item+1, data, que->item_sz); - item->next = RT_NULL; - - level = rt_hw_interrupt_disable(); - - _do_push(que, prio, item); - - if (!rt_list_isempty(&(que->suspended_pop_list))) - { - rt_thread_t thread; - - /* get thread entry */ - thread = RT_THREAD_LIST_NODE_ENTRY(que->suspended_pop_list.next); - /* resume it */ - rt_thread_resume(thread); - rt_hw_interrupt_enable(level); - - /* perform a schedule */ - rt_schedule(); - - return RT_EOK; - } - - rt_hw_interrupt_enable(level); - - return RT_EOK; -} - -rt_err_t rt_prio_queue_pop(struct rt_prio_queue *que, - void *data, - rt_int32_t timeout) -{ - rt_base_t level; - struct rt_prio_queue_item *item; - - RT_ASSERT(que); - RT_ASSERT(data); - - level = rt_hw_interrupt_disable(); - for (item = _do_pop(que); - item == RT_NULL; - item = _do_pop(que)) - { - rt_thread_t thread; - - if (timeout == 0) - { - rt_hw_interrupt_enable(level); - return -RT_ETIMEOUT; - } - - RT_DEBUG_NOT_IN_INTERRUPT; - - thread = rt_thread_self(); - thread->error = RT_EOK; - rt_thread_suspend(thread); - - rt_list_insert_before(&(que->suspended_pop_list), &RT_THREAD_LIST_NODE(thread)); - - if (timeout > 0) - { - rt_tick_t timeout_tick = timeout; - rt_timer_control(&(thread->thread_timer), - RT_TIMER_CTRL_SET_TIME, - &timeout_tick); - rt_timer_start(&(thread->thread_timer)); - } - - rt_hw_interrupt_enable(level); - - rt_schedule(); - - /* thread is waked up */ - if (thread->error != RT_EOK) - return thread->error; - level = rt_hw_interrupt_disable(); - } - - rt_hw_interrupt_enable(level); - - rt_memcpy(data, item+1, que->item_sz); - rt_mp_free(item); - - return RT_EOK; -} - -void rt_prio_queue_dump(struct rt_prio_queue *que) -{ - int level = 0; - - rt_kprintf("bitmap: %08x\n", que->bitmap); - for (level = 0; level < RT_PRIO_QUEUE_PRIO_MAX; level++) - { - struct rt_prio_queue_item *item; - - rt_kprintf("%2d: ", level); - for (item = que->head[level]; - item; - item = item->next) - { - rt_kprintf("%p, ", item); - } - rt_kprintf("\n"); - } -} - |
