summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-07-08 02:04:14 +0000
committer[email protected] <[email protected]>2011-07-08 02:04:14 +0000
commit7121ca6467f76d187f59e32a84e3b9dbbeabedf4 (patch)
tree029a59d79fa5a47b0d26973d53465beb0a065647 /components
parent79ff9b7399cb880f880e4d96c1e63ee78c3857d9 (diff)
fixd a critical issue in lwip. see issue#11
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1621 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components')
-rw-r--r--components/net/lwip-1.4.0/src/arch/include/arch/cc.h3
-rw-r--r--components/net/lwip-1.4.0/src/arch/sys_arch.c12
-rw-r--r--components/net/lwip/src/arch/include/arch/cc.h3
-rw-r--r--components/net/lwip/src/arch/sys_arch.c35
4 files changed, 33 insertions, 20 deletions
diff --git a/components/net/lwip-1.4.0/src/arch/include/arch/cc.h b/components/net/lwip-1.4.0/src/arch/include/arch/cc.h
index cad3411cc9..1f18a8dd50 100644
--- a/components/net/lwip-1.4.0/src/arch/include/arch/cc.h
+++ b/components/net/lwip-1.4.0/src/arch/include/arch/cc.h
@@ -92,9 +92,6 @@ void sys_arch_assert(const char* file, int line);
#define LWIP_PLATFORM_DIAG(x) do {rt_kprintf x;} while(0)
#define LWIP_PLATFORM_ASSERT(x) { rt_kprintf(x); sys_arch_assert(__FILE__, __LINE__); }
-#define SYS_ARCH_DECL_PROTECT(x)
-#define SYS_ARCH_PROTECT(x)
-#define SYS_ARCH_UNPROTECT(x)
#include "string.h"
diff --git a/components/net/lwip-1.4.0/src/arch/sys_arch.c b/components/net/lwip-1.4.0/src/arch/sys_arch.c
index a2a6336412..4c4c120670 100644
--- a/components/net/lwip-1.4.0/src/arch/sys_arch.c
+++ b/components/net/lwip-1.4.0/src/arch/sys_arch.c
@@ -491,12 +491,22 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
sys_prot_t sys_arch_protect(void)
{
+ rt_base_t level;
+
/* disable interrupt */
- return rt_hw_interrupt_disable();
+ level = rt_hw_interrupt_disable();
+
+ /* must also lock scheduler */
+ rt_enter_critical();
+
+ return level;
}
void sys_arch_unprotect(sys_prot_t pval)
{
+ /* unlock scheduler */
+ rt_exit_critical();
+
/* enable interrupt */
rt_hw_interrupt_enable(pval);
diff --git a/components/net/lwip/src/arch/include/arch/cc.h b/components/net/lwip/src/arch/include/arch/cc.h
index cad3411cc9..1f18a8dd50 100644
--- a/components/net/lwip/src/arch/include/arch/cc.h
+++ b/components/net/lwip/src/arch/include/arch/cc.h
@@ -92,9 +92,6 @@ void sys_arch_assert(const char* file, int line);
#define LWIP_PLATFORM_DIAG(x) do {rt_kprintf x;} while(0)
#define LWIP_PLATFORM_ASSERT(x) { rt_kprintf(x); sys_arch_assert(__FILE__, __LINE__); }
-#define SYS_ARCH_DECL_PROTECT(x)
-#define SYS_ARCH_PROTECT(x)
-#define SYS_ARCH_UNPROTECT(x)
#include "string.h"
diff --git a/components/net/lwip/src/arch/sys_arch.c b/components/net/lwip/src/arch/sys_arch.c
index e878a70e30..57ead3d755 100644
--- a/components/net/lwip/src/arch/sys_arch.c
+++ b/components/net/lwip/src/arch/sys_arch.c
@@ -224,20 +224,29 @@ sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, i
return t;
}
-sys_prot_t sys_arch_protect(void)
-{
- /* disable interrupt */
- return rt_hw_interrupt_disable();
+sys_prot_t sys_arch_protect(void)
+{
+ rt_base_t level;
+
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
+ /* must also lock scheduler */
+ rt_enter_critical();
+
+ return level;
+}
+
+void sys_arch_unprotect(sys_prot_t pval)
+{
+ /* unlock scheduler */
+ rt_exit_critical();
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(pval);
+
+ return;
}
-
-void sys_arch_unprotect(sys_prot_t pval)
-{
- /* enable interrupt */
- rt_hw_interrupt_enable(pval);
-
- return;
-}
-
void sys_arch_assert(const char* file, int line)
{
rt_kprintf("\nAssertion: %d in %s, thread %s\n", line, file,