Просмотр исходного кода

!125 futex链表由list改为使用avl
Merge pull request !125 from jesven/futex_list_to_avl

bernard 5 лет назад
Родитель
Сommit
c409535c5c
3 измененных файлов с 14 добавлено и 17 удалено
  1. 1 1
      components/lwp/lwp.h
  2. 12 15
      components/lwp/lwp_futex.c
  3. 1 1
      components/lwp/lwp_pid.c

+ 1 - 1
components/lwp/lwp.h

@@ -92,7 +92,7 @@ struct rt_lwp
 
     struct rt_wqueue wait_queue; /*for console */
 
-    rt_list_t futex_list;
+    struct lwp_avl_struct *futex_head;
 #ifdef RT_USING_GDBSERVER
     int debug;
     uint32_t bak_first_ins;

+ 12 - 15
components/lwp/lwp_futex.c

@@ -18,8 +18,8 @@
 struct rt_futex
 {
     int *uaddr;
-    rt_list_t list;
     rt_list_t waiting_thread;
+    struct lwp_avl_struct node;
 };
 
 static struct rt_mutex _futex_lock;
@@ -39,8 +39,8 @@ void futex_destory(void *data)
     if (futex)
     {
         level = rt_hw_interrupt_disable();
-        /* remove futex from list */
-        rt_list_remove(&(futex->list));
+        /* remove futex from futext avl */
+        lwp_avl_remove(&futex->node, (struct lwp_avl_struct **)futex->node.data);
         rt_hw_interrupt_enable(level);
 
         /* release object */
@@ -72,29 +72,26 @@ struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp)
     }
 
     futex->uaddr = uaddr;
-    rt_list_init(&(futex->list));
+    futex->node.avl_key = (avl_key_t)uaddr;
+    futex->node.data = &lwp->futex_head;
     rt_list_init(&(futex->waiting_thread));
 
-    /* insert into futex list */
-    rt_list_insert_before(&lwp->futex_list, &(futex->list));
+    /* insert into futex head */
+    lwp_avl_insert(&futex->node, &lwp->futex_head);
     return futex;
 }
 
 static struct rt_futex* futex_get(void *uaddr, struct rt_lwp *lwp)
 {
     struct rt_futex *futex = RT_NULL;
-    rt_list_t *node = RT_NULL;
+    struct lwp_avl_struct *node = RT_NULL;
 
-    rt_list_for_each(node, &lwp->futex_list)
+    node = lwp_avl_find((avl_key_t)uaddr, lwp->futex_head);
+    if (!node)
     {
-        futex = rt_list_entry(node, struct rt_futex, list);
-
-        if (futex->uaddr == uaddr) break;
+        return RT_NULL;
     }
-
-    /* no this futex in the list */
-    if (node == &lwp->futex_list) futex = RT_NULL;
-
+    futex = rt_container_of(node, struct rt_futex, node);
     return futex;
 }
 

+ 1 - 1
components/lwp/lwp_pid.c

@@ -111,7 +111,7 @@ struct rt_lwp* lwp_new(void)
     pid_struct.pidmap[i] = lwp;
     rt_list_init(&lwp->t_grp);
     rt_list_init(&lwp->object_list);
-    rt_list_init(&lwp->futex_list);
+    lwp->futex_head = RT_NULL;
     rt_wqueue_init(&lwp->wait_queue);
 
     lwp->ref = 1;