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  */
9 #ifndef DATAQUEUE_H__
10 #define DATAQUEUE_H__
11 
12 #include <rtdef.h>
13 #include <rtconfig.h>
14 
15 #define RT_DATAQUEUE_EVENT_UNKNOWN   0x00
16 #define RT_DATAQUEUE_EVENT_POP       0x01
17 #define RT_DATAQUEUE_EVENT_PUSH      0x02
18 #define RT_DATAQUEUE_EVENT_LWM       0x03
19 
20 struct rt_data_item;
21 
22 /* data queue implementation */
23 struct rt_data_queue
24 {
25     rt_uint32_t magic;
26 
27     rt_uint16_t size;
28     rt_uint16_t lwm;
29 
30     rt_uint16_t get_index : 15;
31     rt_uint16_t is_empty  : 1;
32     rt_uint16_t put_index : 15;
33     rt_uint16_t is_full   : 1;
34 
35     struct rt_data_item *queue;
36     struct rt_spinlock spinlock;
37 
38     rt_list_t suspended_push_list;
39     rt_list_t suspended_pop_list;
40 
41     /* event notify */
42     void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event);
43 };
44 
45 /**
46  * DataQueue for DeviceDriver
47  */
48 rt_err_t rt_data_queue_init(struct rt_data_queue *queue,
49                             rt_uint16_t           size,
50                             rt_uint16_t           lwm,
51                             void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event));
52 rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
53                             const void           *data_ptr,
54                             rt_size_t             data_size,
55                             rt_int32_t            timeout);
56 rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
57                            const void          **data_ptr,
58                            rt_size_t            *size,
59                            rt_int32_t            timeout);
60 rt_err_t rt_data_queue_peek(struct rt_data_queue *queue,
61                             const void          **data_ptr,
62                             rt_size_t            *size);
63 void rt_data_queue_reset(struct rt_data_queue *queue);
64 rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue);
65 rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue);
66 
67 #endif
68