From 111d02568c3f7808bb17dfd2b3e94a6ffc79950d Mon Sep 17 00:00:00 2001 From: "mbbill@gmail.com" Date: Sun, 29 May 2011 11:40:17 +0000 Subject: [PATCH] Add sys_mutex implementation. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1439 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- .../src/arch/include/arch/sys_arch.h | 2 + components/net/lwip-1.4.0/src/arch/sys_arch.c | 109 +++++++++++++++++- components/net/lwip-1.4.0/src/lwipopts.h | 2 - 3 files changed, 105 insertions(+), 8 deletions(-) diff --git a/components/net/lwip-1.4.0/src/arch/include/arch/sys_arch.h b/components/net/lwip-1.4.0/src/arch/include/arch/sys_arch.h index 6e29f0229..ad2e03b36 100644 --- a/components/net/lwip-1.4.0/src/arch/include/arch/sys_arch.h +++ b/components/net/lwip-1.4.0/src/arch/include/arch/sys_arch.h @@ -49,8 +49,10 @@ typedef u32_t sys_prot_t; #define SYS_LWIP_TIMER_NAME "timer" #define SYS_LWIP_MBOX_NAME "mbox" #define SYS_LWIP_SEM_NAME "sem" +#define SYS_LWIP_MUTEX_NAME "mu" typedef rt_sem_t sys_sem_t; +typedef rt_mutex_t sys_mutex_t; typedef rt_mailbox_t sys_mbox_t; typedef rt_thread_t sys_thread_t; 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 67b18b500..98e54ccef 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 @@ -130,9 +130,6 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) /** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */ int sys_sem_valid(sys_sem_t *sem) { - //////////////////// - // to be implemented. - //////////////////// return (int)(*sem); } #endif @@ -140,15 +137,115 @@ int sys_sem_valid(sys_sem_t *sem) /** Set a semaphore invalid so that sys_sem_valid returns 0 */ void sys_sem_set_invalid(sys_sem_t *sem) { - //////////////////// - // to be implemented. - //////////////////// *sem = RT_NULL; } #endif +/* ====================== Mutex ====================== */ + +/** Create a new mutex + * @param mutex pointer to the mutex to create + * @return a new mutex */ +err_t sys_mutex_new(sys_mutex_t *mutex) +{ + static unsigned short counter = 0; + char tname[RT_NAME_MAX]; + sys_mutex_t tmpmutex; + + rt_snprintf(tname, RT_NAME_MAX, "%s%d", SYS_LWIP_MUTEX_NAME, counter); + +#if SYS_DEBUG + { + struct rt_thread *thread; + + thread = rt_thread_self(); + LWIP_DEBUGF(SYS_DEBUG, ("%s, Create mutex: %s \n",thread->name, tname)); + } +#endif + + counter++; + + tmpmutex = rt_mutex_create(tname, RT_IPC_FLAG_FIFO); + if( tmpmutex == RT_NULL ) + return ERR_MEM; + else + { + *mutex = tmpmutex; + return ERR_OK; + } +} + +/** Lock a mutex + * @param mutex the mutex to lock */ +void sys_mutex_lock(sys_mutex_t *mutex) +{ + +#if SYS_DEBUG + { + struct rt_thread *thread; + thread = rt_thread_self(); + + LWIP_DEBUGF(SYS_DEBUG, ("%s, Wait mutex: %s , %d\n",thread->name, + (*mutex)->parent.parent.name, (*mutex)->value)); + } +#endif + + rt_mutex_take(*mutex, RT_WAITING_FOREVER); + + return; +} + + +/** Unlock a mutex + * @param mutex the mutex to unlock */ +void sys_mutex_unlock(sys_mutex_t *mutex) +{ +#if SYS_DEBUG + { + struct rt_thread *thread; + thread = rt_thread_self(); + + LWIP_DEBUGF(SYS_DEBUG, ("%s, Release signal: %s , %d\n",thread->name, + (*mutex)->parent.parent.name, (*mutex)->value)); + } +#endif + + rt_mutex_release(*mutex); +} + +/** Delete a semaphore + * @param mutex the mutex to delete */ +void sys_mutex_free(sys_mutex_t *mutex) +{ +#if SYS_DEBUG + { + struct rt_thread *thread; + thread = rt_thread_self(); + + LWIP_DEBUGF(SYS_DEBUG, ("%s, Delete sem: %s \n",thread->name, + (*mutex)->parent.parent.name)); + } +#endif + rt_mutex_delete(*mutex); +} + +#ifndef sys_mutex_valid +/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */ +int sys_mutex_valid(sys_mutex_t *mutex) +{ + return (int)(*mutex); +} +#endif + +#ifndef sys_mutex_set_invalid +/** Set a mutex invalid so that sys_mutex_valid returns 0 */ +void sys_mutex_set_invalid(sys_mutex_t *mutex) +{ + *mutex = RT_NULL; +} +#endif /* ====================== Mailbox ====================== */ diff --git a/components/net/lwip-1.4.0/src/lwipopts.h b/components/net/lwip-1.4.0/src/lwipopts.h index 87239449c..bea23d3a9 100644 --- a/components/net/lwip-1.4.0/src/lwipopts.h +++ b/components/net/lwip-1.4.0/src/lwipopts.h @@ -325,7 +325,5 @@ /* no read/write/close for socket */ #define LWIP_POSIX_SOCKETS_IO_NAMES 0 -/* this should be removed */ -#define LWIP_COMPAT_MUTEX 1 #endif /* __LWIPOPTS_H__ */ -- GitLab