Browse Source

move memcpy outside interrupt disable in mq.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@661 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong 15 years ago
parent
commit
a0c9b0e90e
1 changed files with 23 additions and 13 deletions
  1. 23 13
      src/ipc.c

+ 23 - 13
src/ipc.c

@@ -31,6 +31,7 @@
  * 2009-12-16     Bernard      fix the rt_ipc_object_suspend issue when IPC flag
  *                             is RT_IPC_FLAG_PRIO
  * 2010-01-20     mbbill       remove rt_ipc_object_decrease function.
+ * 2010-04-20     Bernard      move memcpy outside interrupt disable in mq
  */
 
 #include <rtthread.h>
@@ -1616,7 +1617,6 @@ rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size)
 
 	/* get a free list, there must be an empty item */
 	msg = (struct rt_mq_message*)mq->msg_queue_free;
-
 	/* message queue is full */
 	if (msg == RT_NULL)
 	{
@@ -1625,13 +1625,17 @@ rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size)
 
 		return -RT_EFULL;
 	}
-
 	/* move free list pointer */
 	mq->msg_queue_free = msg->next;
 
+	/* enable interrupt */
+	rt_hw_interrupt_enable(temp);
+
 	/* copy buffer */
 	rt_memcpy(msg + 1, buffer, size);
 
+	/* disable interrupt */
+	temp = rt_hw_interrupt_disable();
 	/* link msg to message queue */
 	if (mq->msg_queue_tail != RT_NULL)
 	{
@@ -1643,7 +1647,6 @@ rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size)
 
 	/* set new tail */
 	mq->msg_queue_tail = msg;
-
 	/* if the head is empty, set head */
 	if (mq->msg_queue_head == RT_NULL)mq->msg_queue_head = msg;
 
@@ -1696,7 +1699,6 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, void* buffer, rt_size_t size)
 
 	/* get a free list, there must be an empty item */
 	msg = (struct rt_mq_message*)mq->msg_queue_free;
-
 	/* message queue is full */
 	if (msg == RT_NULL)
 	{
@@ -1705,13 +1707,18 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, void* buffer, rt_size_t size)
 
 		return -RT_EFULL;
 	}
-
 	/* move free list pointer */
 	mq->msg_queue_free = msg->next;
 
+	/* enable interrupt */
+	rt_hw_interrupt_enable(temp);
+
 	/* copy buffer */
 	rt_memcpy(msg + 1, buffer, size);
 
+	/* disable interrupt */
+	temp = rt_hw_interrupt_disable();
+
 	/* link msg to the beginning of message queue */
 	msg->next = mq->msg_queue_head;
 	mq->msg_queue_head = msg;
@@ -1764,12 +1771,12 @@ rt_err_t rt_mq_recv (rt_mq_t mq, void* buffer, rt_size_t size, rt_int32_t timeou
 #endif
 
 	tick_delta = 0;
-	/* disable interrupt */
-	temp = rt_hw_interrupt_disable();
-
 	/* get current thread */
 	thread = rt_thread_self();
 
+	/* disable interrupt */
+	temp = rt_hw_interrupt_disable();
+
 	/* message queue is empty */
 	while (mq->entry == 0)
 	{
@@ -1833,21 +1840,24 @@ rt_err_t rt_mq_recv (rt_mq_t mq, void* buffer, rt_size_t size, rt_int32_t timeou
 
 	/* move message queue head */
 	mq->msg_queue_head = msg->next;
-
 	/* reach queue tail, set to NULL */
 	if (mq->msg_queue_tail == msg) mq->msg_queue_tail = RT_NULL;
 
+	/* decrease message entry */
+	mq->entry --;
+
+	/* enable interrupt */
+	rt_hw_interrupt_enable(temp);
+
 	/* copy message */
 	rt_memcpy(buffer, msg + 1,
 		size > mq->msg_size? mq->msg_size : size);
 
+	/* disable interrupt */
+	temp = rt_hw_interrupt_disable();
 	/* put message to free list */
 	msg->next = (struct rt_mq_message*)mq->msg_queue_free;
 	mq->msg_queue_free = msg;
-
-	/* decrease message entry */
-	mq->entry --;
-
 	/* enable interrupt */
 	rt_hw_interrupt_enable(temp);