Lines Matching refs:queue
43 rt_data_queue_init(struct rt_data_queue *queue, in rt_data_queue_init() argument
46 void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event)) in rt_data_queue_init() argument
48 RT_ASSERT(queue != RT_NULL); in rt_data_queue_init()
51 queue->evt_notify = evt_notify; in rt_data_queue_init()
53 queue->magic = DATAQUEUE_MAGIC; in rt_data_queue_init()
54 queue->size = size; in rt_data_queue_init()
55 queue->lwm = lwm; in rt_data_queue_init()
57 queue->get_index = 0; in rt_data_queue_init()
58 queue->put_index = 0; in rt_data_queue_init()
59 queue->is_empty = 1; in rt_data_queue_init()
60 queue->is_full = 0; in rt_data_queue_init()
62 rt_spin_lock_init(&(queue->spinlock)); in rt_data_queue_init()
64 rt_list_init(&(queue->suspended_push_list)); in rt_data_queue_init()
65 rt_list_init(&(queue->suspended_pop_list)); in rt_data_queue_init()
67 queue->queue = (struct rt_data_item *)rt_malloc(sizeof(struct rt_data_item) * size); in rt_data_queue_init()
68 if (queue->queue == RT_NULL) in rt_data_queue_init()
92 rt_err_t rt_data_queue_push(struct rt_data_queue *queue, in rt_data_queue_push() argument
101 RT_ASSERT(queue != RT_NULL); in rt_data_queue_push()
102 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_push()
110 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_push()
111 while (queue->is_full) in rt_data_queue_push()
125 result = rt_thread_suspend_to_list(thread, &queue->suspended_push_list, in rt_data_queue_push()
140 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_push()
146 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_push()
154 queue->queue[queue->put_index].data_ptr = data_ptr; in rt_data_queue_push()
155 queue->queue[queue->put_index].data_size = data_size; in rt_data_queue_push()
156 queue->put_index += 1; in rt_data_queue_push()
157 if (queue->put_index == queue->size) in rt_data_queue_push()
159 queue->put_index = 0; in rt_data_queue_push()
161 queue->is_empty = 0; in rt_data_queue_push()
162 if (queue->put_index == queue->get_index) in rt_data_queue_push()
164 queue->is_full = 1; in rt_data_queue_push()
168 if (rt_susp_list_dequeue(&queue->suspended_pop_list, in rt_data_queue_push()
172 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_push()
181 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_push()
182 if ((result == RT_EOK) && queue->evt_notify != RT_NULL) in rt_data_queue_push()
184 queue->evt_notify(queue, RT_DATAQUEUE_EVENT_PUSH); in rt_data_queue_push()
209 rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, in rt_data_queue_pop() argument
218 RT_ASSERT(queue != RT_NULL); in rt_data_queue_pop()
219 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_pop()
229 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_pop()
230 while (queue->is_empty) in rt_data_queue_pop()
243 result = rt_thread_suspend_to_list(thread, &queue->suspended_pop_list, in rt_data_queue_pop()
258 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_pop()
264 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_pop()
271 *data_ptr = queue->queue[queue->get_index].data_ptr; in rt_data_queue_pop()
272 *size = queue->queue[queue->get_index].data_size; in rt_data_queue_pop()
273 queue->get_index += 1; in rt_data_queue_pop()
274 if (queue->get_index == queue->size) in rt_data_queue_pop()
276 queue->get_index = 0; in rt_data_queue_pop()
278 queue->is_full = 0; in rt_data_queue_pop()
279 if (queue->put_index == queue->get_index) in rt_data_queue_pop()
281 queue->is_empty = 1; in rt_data_queue_pop()
284 if (rt_data_queue_len(queue) <= queue->lwm) in rt_data_queue_pop()
287 if (rt_susp_list_dequeue(&queue->suspended_push_list, in rt_data_queue_pop()
291 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_pop()
298 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_pop()
301 if (queue->evt_notify != RT_NULL) in rt_data_queue_pop()
302 queue->evt_notify(queue, RT_DATAQUEUE_EVENT_LWM); in rt_data_queue_pop()
308 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_pop()
309 if ((result == RT_EOK) && (queue->evt_notify != RT_NULL)) in rt_data_queue_pop()
311 queue->evt_notify(queue, RT_DATAQUEUE_EVENT_POP); in rt_data_queue_pop()
330 rt_err_t rt_data_queue_peek(struct rt_data_queue *queue, in rt_data_queue_peek() argument
336 RT_ASSERT(queue != RT_NULL); in rt_data_queue_peek()
337 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_peek()
339 if (queue->is_empty) in rt_data_queue_peek()
344 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_peek()
346 *data_ptr = queue->queue[queue->get_index].data_ptr; in rt_data_queue_peek()
347 *size = queue->queue[queue->get_index].data_size; in rt_data_queue_peek()
349 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_peek()
363 void rt_data_queue_reset(struct rt_data_queue *queue) in rt_data_queue_reset() argument
367 RT_ASSERT(queue != RT_NULL); in rt_data_queue_reset()
368 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_reset()
370 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_reset()
372 queue->get_index = 0; in rt_data_queue_reset()
373 queue->put_index = 0; in rt_data_queue_reset()
374 queue->is_empty = 1; in rt_data_queue_reset()
375 queue->is_full = 0; in rt_data_queue_reset()
377 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_reset()
383 rt_susp_list_resume_all_irq(&queue->suspended_pop_list, RT_ERROR, in rt_data_queue_reset()
384 &(queue->spinlock)); in rt_data_queue_reset()
387 rt_susp_list_resume_all_irq(&queue->suspended_push_list, RT_ERROR, in rt_data_queue_reset()
388 &(queue->spinlock)); in rt_data_queue_reset()
403 rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue) in rt_data_queue_deinit() argument
407 RT_ASSERT(queue != RT_NULL); in rt_data_queue_deinit()
408 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_deinit()
411 rt_data_queue_reset(queue); in rt_data_queue_deinit()
413 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_deinit()
414 queue->magic = 0; in rt_data_queue_deinit()
415 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_deinit()
417 rt_free(queue->queue); in rt_data_queue_deinit()
430 rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue) in rt_data_queue_len() argument
435 RT_ASSERT(queue != RT_NULL); in rt_data_queue_len()
436 RT_ASSERT(queue->magic == DATAQUEUE_MAGIC); in rt_data_queue_len()
438 if (queue->is_empty) in rt_data_queue_len()
443 level = rt_spin_lock_irqsave(&(queue->spinlock)); in rt_data_queue_len()
445 if (queue->put_index > queue->get_index) in rt_data_queue_len()
447 len = queue->put_index - queue->get_index; in rt_data_queue_len()
451 len = queue->size + queue->put_index - queue->get_index; in rt_data_queue_len()
454 rt_spin_unlock_irqrestore(&(queue->spinlock), level); in rt_data_queue_len()