1313#include <rtdevice.h>
1414#include <rthw.h>
1515
16+ #define DATAQUEUE_MAGIC 0xbead0e0e
17+
1618struct rt_data_item
1719{
1820 const void * data_ptr ;
@@ -29,6 +31,7 @@ rt_data_queue_init(struct rt_data_queue *queue,
2931
3032 queue -> evt_notify = evt_notify ;
3133
34+ queue -> magic = DATAQUEUE_MAGIC ;
3235 queue -> size = size ;
3336 queue -> lwm = lwm ;
3437
@@ -57,6 +60,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
5760 rt_thread_t thread ;
5861 rt_err_t result ;
5962
63+ RT_ASSERT (queue -> magic == DATAQUEUE_MAGIC );
6064 RT_ASSERT (queue != RT_NULL );
6165
6266 result = RT_EOK ;
@@ -145,7 +149,8 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
145149 rt_ubase_t level ;
146150 rt_thread_t thread ;
147151 rt_err_t result ;
148-
152+
153+ RT_ASSERT (queue -> magic == DATAQUEUE_MAGIC );
149154 RT_ASSERT (queue != RT_NULL );
150155 RT_ASSERT (data_ptr != RT_NULL );
151156 RT_ASSERT (size != RT_NULL );
@@ -244,7 +249,8 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
244249 rt_size_t * size )
245250{
246251 rt_ubase_t level ;
247-
252+
253+ RT_ASSERT (queue -> magic == DATAQUEUE_MAGIC );
248254 RT_ASSERT (queue != RT_NULL );
249255
250256 level = rt_hw_interrupt_disable ();
@@ -269,7 +275,9 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
269275{
270276 struct rt_thread * thread ;
271277 register rt_ubase_t temp ;
272-
278+
279+ RT_ASSERT (queue -> magic == DATAQUEUE_MAGIC );
280+
273281 rt_enter_critical ();
274282 /* wakeup all suspend threads */
275283
@@ -325,3 +333,24 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
325333 rt_schedule ();
326334}
327335RTM_EXPORT (rt_data_queue_reset );
336+
337+ rt_err_t rt_data_queue_deinit (struct rt_data_queue * queue )
338+ {
339+ rt_ubase_t level ;
340+
341+ RT_ASSERT (queue -> magic == DATAQUEUE_MAGIC );
342+ RT_ASSERT (queue != RT_NULL );
343+
344+ level = rt_hw_interrupt_disable ();
345+
346+ /* wakeup all suspend threads */
347+ rt_data_queue_reset (queue );
348+
349+ queue -> magic = 0 ;
350+ rt_free (queue -> queue );
351+
352+ rt_hw_interrupt_enable (level );
353+
354+ return RT_EOK ;
355+ }
356+ RTM_EXPORT (rt_data_queue_deinit );
0 commit comments