1 /*
2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3 */
4
5 #include <stdio.h>
6 #include <time.h>
7
8 #include <k_api.h>
9 #include <aos/errno.h>
10 #include <aos/kernel.h>
11
12 #include "rhino_p.h"
13
14 #if (RHINO_CONFIG_KOBJ_DYN_ALLOC == 0)
15 #warning "RHINO_CONFIG_KOBJ_DYN_ALLOC is disabled!"
16 #endif
17
18 #if (RHINO_CONFIG_BUF_QUEUE > 0)
19
aos_queue_new(aos_queue_t * queue,void * buf,size_t size,size_t max_msg)20 aos_status_t aos_queue_new(aos_queue_t *queue, void *buf, size_t size, size_t max_msg)
21 {
22 kstat_t ret;
23 kbuf_queue_t *q;
24 size_t malloc_len;
25 void *real_buf;
26
27 if (queue == NULL || size == 0) {
28 return -EINVAL;
29 }
30
31 malloc_len = sizeof(kbuf_queue_t) + ((buf == NULL) ? size : 0);
32 q = (kbuf_queue_t *)aos_malloc(malloc_len);
33 if (q == NULL) {
34 return -ENOMEM;
35 }
36 real_buf = (buf == NULL) ? ((void *)q + sizeof(kbuf_queue_t)) : buf;
37
38 ret = krhino_buf_queue_create(q, "AOS", real_buf, size, max_msg);
39 if (ret != RHINO_SUCCESS) {
40 aos_free(q);
41 return rhino2stderrno(ret);
42 }
43
44 *queue = q;
45
46 return 0;
47 }
48
aos_queue_create(aos_queue_t * queue,size_t size,size_t max_msg,uint32_t options)49 aos_status_t aos_queue_create(aos_queue_t *queue, size_t size, size_t max_msg, uint32_t options)
50 {
51 kstat_t ret;
52 kbuf_queue_t *q;
53 size_t malloc_len;
54 void *real_buf;
55
56 (void)options;
57 if (queue == NULL || size == 0) {
58 return -EINVAL;
59 }
60
61 malloc_len = sizeof(kbuf_queue_t) + size;
62 q = (kbuf_queue_t *)aos_malloc(malloc_len);
63 if (q == NULL) {
64 return -ENOMEM;
65 }
66 real_buf = (void *)q + sizeof(kbuf_queue_t);
67
68 ret = krhino_buf_queue_create(q, "AOS", real_buf, size, max_msg);
69 if (ret != RHINO_SUCCESS) {
70 aos_free(q);
71 return rhino2stderrno(ret);
72 }
73
74 *queue = q;
75
76 return 0;
77 }
78
aos_queue_free(aos_queue_t * queue)79 void aos_queue_free(aos_queue_t *queue)
80 {
81 if (queue == NULL || *queue == NULL) {
82 return;
83 }
84
85 krhino_buf_queue_del((kbuf_queue_t *)*queue);
86
87 aos_free(*queue);
88
89 *queue = NULL;
90 }
91
aos_queue_send(aos_queue_t * queue,void * msg,size_t size)92 aos_status_t aos_queue_send(aos_queue_t *queue, void *msg, size_t size)
93 {
94 int ret;
95
96 CHECK_HANDLE(queue);
97
98 ret = krhino_buf_queue_send((kbuf_queue_t *)*queue, msg, size);
99 return rhino2stderrno(ret);
100 }
101
aos_queue_recv(aos_queue_t * queue,uint32_t ms,void * msg,size_t * size)102 aos_status_t aos_queue_recv(aos_queue_t *queue, uint32_t ms, void *msg,
103 size_t *size)
104 {
105 int ret;
106
107 CHECK_HANDLE(queue);
108 if (ms == AOS_WAIT_FOREVER) {
109 ret = krhino_buf_queue_recv((kbuf_queue_t *)*queue, RHINO_WAIT_FOREVER, msg, size);
110 } else {
111 ret = krhino_buf_queue_recv((kbuf_queue_t *)*queue, MS2TICK(ms), msg, size);
112 }
113 return rhino2stderrno(ret);
114 }
115
aos_queue_is_valid(aos_queue_t * queue)116 bool aos_queue_is_valid(aos_queue_t *queue)
117 {
118 kbuf_queue_t *k_queue;
119
120 if (queue == NULL) {
121 return false;
122 }
123
124 k_queue = (kbuf_queue_t *)*queue;
125
126 if (k_queue == NULL) {
127 return false;
128 }
129
130 if (k_queue->blk_obj.obj_type != RHINO_BUF_QUEUE_OBJ_TYPE) {
131 return false;
132 }
133
134 return true;
135 }
136
aos_queue_buf_ptr(aos_queue_t * queue)137 void *aos_queue_buf_ptr(aos_queue_t *queue)
138 {
139 if (!aos_queue_is_valid(queue)) {
140 return NULL;
141 }
142
143 return ((kbuf_queue_t *)*queue)->buf;
144 }
145
aos_queue_get_count(aos_queue_t * queue)146 aos_status_t aos_queue_get_count(aos_queue_t *queue)
147 {
148 kbuf_queue_info_t info;
149 CHECK_HANDLE(queue);
150 kstat_t ret = krhino_buf_queue_info_get((kbuf_queue_t *)*queue, &info);
151
152 return ret == RHINO_SUCCESS ? info.cur_num : -EPERM;
153 }
154 #endif
155
156
157
158