From bb506e8493b3918a36b4854632e177b4b64f30fe Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Sun, 12 May 2019 21:44:28 +0800 Subject: [PATCH] [pthreads] Add spinlock declare and fix code issue. --- components/libc/pthreads/pthread.c | 8 +++++++- include/rthw.h | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/components/libc/pthreads/pthread.c b/components/libc/pthreads/pthread.c index 924fd6a6f9..64ef81d680 100644 --- a/components/libc/pthreads/pthread.c +++ b/components/libc/pthreads/pthread.c @@ -20,6 +20,7 @@ _pthread_data_t *pth_table[PTHREAD_NUM_MAX] = {NULL}; _pthread_data_t *_pthread_get_data(pthread_t thread) { + RT_DECLARE_SPINLOCK(pth_lock); _pthread_data_t *ptd; if (thread >= PTHREAD_NUM_MAX) return NULL; @@ -36,6 +37,7 @@ _pthread_data_t *_pthread_get_data(pthread_t thread) pthread_t _pthread_data_get_pth(_pthread_data_t *ptd) { int index; + RT_DECLARE_SPINLOCK(pth_lock); rt_hw_spin_lock(&pth_lock); for (index = 0; index < PTHREAD_NUM_MAX; index ++) @@ -51,11 +53,12 @@ pthread_t _pthread_data_create(void) { int index; _pthread_data_t *ptd = NULL; + RT_DECLARE_SPINLOCK(pth_lock); ptd = (_pthread_data_t*)rt_malloc(sizeof(_pthread_data_t)); if (!ptd) return PTHREAD_NUM_MAX; - memset(ptd, 0x0, sizeof(sizeof(_pthread_data_t))); + memset(ptd, 0x0, sizeof(_pthread_data_t)); ptd->canceled = 0; ptd->cancelstate = PTHREAD_CANCEL_DISABLE; ptd->canceltype = PTHREAD_CANCEL_DEFERRED; @@ -67,6 +70,7 @@ pthread_t _pthread_data_create(void) if (pth_table[index] == NULL) { pth_table[index] = ptd; + break; } } rt_hw_spin_unlock(&pth_lock); @@ -76,6 +80,8 @@ pthread_t _pthread_data_create(void) void _pthread_data_destroy(pthread_t pth) { + RT_DECLARE_SPINLOCK(pth_lock); + _pthread_data_t *ptd = _pthread_get_data(pth); if (ptd) { diff --git a/include/rthw.h b/include/rthw.h index fc9cb3cd16..ef3dc087ad 100644 --- a/include/rthw.h +++ b/include/rthw.h @@ -157,6 +157,7 @@ extern rt_hw_spinlock_t _rt_critical_lock; (rt_hw_spinlock_t) __RT_HW_SPIN_LOCK_INITIALIZER(lockname) #define RT_DEFINE_SPINLOCK(x) rt_hw_spinlock_t x = __RT_HW_SPIN_LOCK_UNLOCKED(x) +#define RT_DECLARE_SPINLOCK(x) /** * ipi function @@ -172,6 +173,13 @@ void rt_hw_secondary_cpu_up(void); * secondary cpu idle function */ void rt_hw_secondary_cpu_idle_exec(void); +#else + +#define RT_DEFINE_SPINLOCK(x) +#define RT_DECLARE_SPINLOCK(x) rt_ubase_t x + +#define rt_hw_spin_lock(lock) *(lock) = rt_hw_interrupt_disable() +#define rt_hw_spin_unlock(lock) rt_hw_interrupt_enable(*(lock)) #endif