From 1f9e26e221a41542563834222c4ec8399be1908f Mon Sep 17 00:00:00 2001 From: Xadhoom <> Date: Sun, 7 Mar 2021 14:03:07 +0000 Subject: [PATCH] Use reentrant mutex for core thread --- ports/unix/port/sys_arch.c | 12 ++++++++++-- ports/win32/sys_arch.c | 6 +++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ports/unix/port/sys_arch.c b/ports/unix/port/sys_arch.c index 3336539..99d2ccf 100644 --- a/ports/unix/port/sys_arch.c +++ b/ports/unix/port/sys_arch.c @@ -204,15 +204,19 @@ sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksi #if LWIP_TCPIP_CORE_LOCKING static pthread_t lwip_core_lock_holder_thread_id; +static int lwip_core_lock_holder_reclevel = 0; void sys_lock_tcpip_core(void) { sys_mutex_lock(&lock_tcpip_core); lwip_core_lock_holder_thread_id = pthread_self(); + lwip_core_lock_holder_reclevel += 1; } void sys_unlock_tcpip_core(void) { - lwip_core_lock_holder_thread_id = 0; + lwip_core_lock_holder_reclevel -= 1; + if(!lwip_core_lock_holder_reclevel) + lwip_core_lock_holder_thread_id = 0; sys_mutex_unlock(&lock_tcpip_core); } #endif /* LWIP_TCPIP_CORE_LOCKING */ @@ -591,10 +595,14 @@ err_t sys_mutex_new(struct sys_mutex **mutex) { struct sys_mutex *mtx; + pthread_mutexattr_t attr; mtx = (struct sys_mutex *)malloc(sizeof(struct sys_mutex)); + if (mtx != NULL) { - pthread_mutex_init(&(mtx->mutex), NULL); + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&(mtx->mutex), &attr); *mutex = mtx; return ERR_OK; } diff --git a/ports/win32/sys_arch.c b/ports/win32/sys_arch.c index 1a37f14..cbdfd33 100644 --- a/ports/win32/sys_arch.c +++ b/ports/win32/sys_arch.c @@ -471,18 +471,22 @@ sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksi #if LWIP_TCPIP_CORE_LOCKING static DWORD lwip_core_lock_holder_thread_id; +static int lwip_core_lock_holder_reclevel = 0; void sys_lock_tcpip_core(void) { sys_mutex_lock(&lock_tcpip_core); lwip_core_lock_holder_thread_id = GetCurrentThreadId(); + lwip_core_lock_holder_reclevel += 1; } void sys_unlock_tcpip_core(void) { - lwip_core_lock_holder_thread_id = 0; + lwip_core_lock_holder_reclevel -= 1; + if(!lwip_core_lock_holder_reclevel) + lwip_core_lock_holder_thread_id = 0; sys_mutex_unlock(&lock_tcpip_core); } #endif /* LWIP_TCPIP_CORE_LOCKING */