Skip to content

Commit dfcd38b

Browse files
committed
[components][dataqueue]add rt_data_queue_deinit
1 parent 0f57faa commit dfcd38b

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

components/drivers/include/ipc/dataqueue.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ struct rt_data_queue
2525
rt_uint16_t size;
2626
rt_uint16_t lwm;
2727
rt_bool_t waiting_lwm;
28+
rt_bool_t is_init;
2829

2930
rt_uint16_t get_index;
3031
rt_uint16_t put_index;
@@ -57,5 +58,6 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
5758
const void **data_ptr,
5859
rt_size_t *size);
5960
void rt_data_queue_reset(struct rt_data_queue *queue);
61+
rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue);
6062

6163
#endif

components/drivers/src/dataqueue.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ rt_data_queue_init(struct rt_data_queue *queue,
3131

3232
queue->size = size;
3333
queue->lwm = lwm;
34+
queue->is_init = RT_TRUE;
3435

3536
queue->get_index = 0;
3637
queue->put_index = 0;
@@ -57,6 +58,11 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
5758
rt_thread_t thread;
5859
rt_err_t result;
5960

61+
if(queue->is_init != RT_TRUE)
62+
{
63+
return RT_ERROR;
64+
}
65+
6066
RT_ASSERT(queue != RT_NULL);
6167

6268
result = RT_EOK;
@@ -145,6 +151,11 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
145151
rt_ubase_t level;
146152
rt_thread_t thread;
147153
rt_err_t result;
154+
155+
if(queue->is_init != RT_TRUE)
156+
{
157+
return RT_ERROR;
158+
}
148159

149160
RT_ASSERT(queue != RT_NULL);
150161
RT_ASSERT(data_ptr != RT_NULL);
@@ -244,6 +255,11 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
244255
rt_size_t *size)
245256
{
246257
rt_ubase_t level;
258+
259+
if(queue->is_init != RT_TRUE)
260+
{
261+
return RT_ERROR;
262+
}
247263

248264
RT_ASSERT(queue != RT_NULL);
249265

@@ -269,6 +285,11 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
269285
{
270286
struct rt_thread *thread;
271287
register rt_ubase_t temp;
288+
289+
if(queue->is_init != RT_TRUE)
290+
{
291+
return;
292+
}
272293

273294
rt_enter_critical();
274295
/* wakeup all suspend threads */
@@ -325,3 +346,28 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
325346
rt_schedule();
326347
}
327348
RTM_EXPORT(rt_data_queue_reset);
349+
350+
rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue)
351+
{
352+
rt_ubase_t level;
353+
354+
if(queue->is_init != RT_TRUE)
355+
{
356+
return RT_ERROR;
357+
}
358+
359+
RT_ASSERT(queue != RT_NULL);
360+
361+
level = rt_hw_interrupt_disable();
362+
363+
/* wakeup all suspend threads */
364+
rt_data_queue_reset(queue);
365+
366+
queue->is_init = RT_FALSE;
367+
rt_free(queue->queue);
368+
369+
rt_hw_interrupt_enable(level);
370+
371+
return RT_EOK;
372+
}
373+
RTM_EXPORT(rt_data_queue_deinit);

0 commit comments

Comments
 (0)