From fd982597feaf5d70c9a20de89f414c9621accf1b Mon Sep 17 00:00:00 2001 From: goldsimon Date: Wed, 16 May 2007 11:02:07 +0000 Subject: [PATCH] Removed semaphores from memp, changed sys_sem_wait calls into sys_arch_sem_wait calls to prevent timers from running while waiting for the heap. This fixes bug #19167. --- CHANGELOG | 5 +++++ src/core/mem.c | 8 ++++---- src/core/memp.c | 28 ---------------------------- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e61fe49e..392101e6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -158,6 +158,11 @@ HISTORY ++ Bug fixes: + 2007-05-16 Simon Goldschmidt + * mem.c, memp.c: Removed semaphores from memp, changed sys_sem_wait calls + into sys_arch_sem_wait calls to prevent timers from running while waiting + for the heap. This fixes bug #19167. + 2007-05-13 Simon Goldschmidt * tcp.h, sockets.h, sockets.c: Fixed bug from patch #5865 by moving the defines for socket options (lwip_set/-getsockopt) used with level IPPROTO_TCP from diff --git a/src/core/mem.c b/src/core/mem.c index 75d7815c..7b34f02f 100644 --- a/src/core/mem.c +++ b/src/core/mem.c @@ -171,7 +171,7 @@ mem_free(void *rmem) LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); /* protect the heap from concurrent access */ - sys_sem_wait(mem_sem); + sys_arch_sem_wait(mem_sem, 0); LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && (u8_t *)rmem < (u8_t *)ram_end); @@ -253,7 +253,7 @@ mem_realloc(void *rmem, mem_size_t newsize) } /* protect the heap from concurrent access */ - sys_sem_wait(mem_sem); + sys_arch_sem_wait(mem_sem, 0); #if MEM_STATS lwip_stats.mem.used -= (size - newsize); @@ -319,7 +319,7 @@ mem_malloc(mem_size_t size) return NULL; } - sys_sem_wait(mem_sem); + sys_arch_sem_wait(mem_sem, 0); for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED; ptr = ((struct mem *)&ram[ptr])->next) { mem = (struct mem *)&ram[ptr]; @@ -402,7 +402,7 @@ mem_malloc(mem_size_t size) } /* protect the heap from concurrent access */ - sys_sem_wait(mem_sem); + sys_arch_sem_wait(mem_sem, 0); /* Scan through the heap searching for a free block that is big enough, * beginning with the lowest free block. diff --git a/src/core/memp.c b/src/core/memp.c index 88afaf44..4bf88990 100644 --- a/src/core/memp.c +++ b/src/core/memp.c @@ -111,10 +111,6 @@ static u8_t memp_memory[MEM_ALIGNMENT - 1 + PBUF_POOL_SIZE * MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) + MEMP_TYPE_SIZE(MEMP_NUM_SYS_TIMEOUT, struct sys_timeo)]; -#if !SYS_LIGHTWEIGHT_PROT -static sys_sem_t mutex; -#endif - #if MEMP_SANITY_CHECK static int memp_sanity(void) @@ -159,27 +155,17 @@ memp_init(void) memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]); } } - -#if !SYS_LIGHTWEIGHT_PROT - mutex = sys_sem_new(1); -#endif } void * memp_malloc(memp_t type) { struct memp *memp; -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_DECL_PROTECT(old_level); -#endif LWIP_ASSERT("memp_malloc: type < MEMP_MAX", type < MEMP_MAX); -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_PROTECT(old_level); -#else /* SYS_LIGHTWEIGHT_PROT */ - sys_sem_wait(mutex); -#endif /* SYS_LIGHTWEIGHT_PROT */ memp = memp_tab[type]; @@ -201,11 +187,7 @@ memp_malloc(memp_t type) #endif /* MEMP_STATS */ } -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_UNPROTECT(old_level); -#else /* SYS_LIGHTWEIGHT_PROT */ - sys_sem_signal(mutex); -#endif /* SYS_LIGHTWEIGHT_PROT */ return (void*)memp; } @@ -214,9 +196,7 @@ void memp_free(memp_t type, void *mem) { struct memp *memp; -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_DECL_PROTECT(old_level); -#endif /* SYS_LIGHTWEIGHT_PROT */ if (mem == NULL) { return; @@ -226,11 +206,7 @@ memp_free(memp_t type, void *mem) memp = (struct memp *)mem; -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_PROTECT(old_level); -#else /* SYS_LIGHTWEIGHT_PROT */ - sys_sem_wait(mutex); -#endif /* SYS_LIGHTWEIGHT_PROT */ #if MEMP_STATS lwip_stats.memp[type].used--; @@ -243,9 +219,5 @@ memp_free(memp_t type, void *mem) LWIP_ASSERT("memp sanity", memp_sanity()); #endif -#if SYS_LIGHTWEIGHT_PROT SYS_ARCH_UNPROTECT(old_level); -#else /* SYS_LIGHTWEIGHT_PROT */ - sys_sem_signal(mutex); -#endif /* SYS_LIGHTWEIGHT_PROT */ }