Преглед на файлове

[pthreads] Add spinlock declare and fix code issue.

Bernard Xiong преди 6 години
родител
ревизия
bb506e8493
променени са 2 файла, в които са добавени 15 реда и са изтрити 1 реда
  1. 7 1
      components/libc/pthreads/pthread.c
  2. 8 0
      include/rthw.h

+ 7 - 1
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)
     {

+ 8 - 0
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