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