From bb01e208ba007f3a116cc4a8b4ac2760ca5a75b7 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Mon, 25 Jan 2021 09:07:37 +0800 Subject: [PATCH] =?UTF-8?q?futex=20list=20=E6=94=B9=E4=B8=BA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8avl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp.h | 2 +- components/lwp/lwp_futex.c | 27 ++++++++++++--------------- components/lwp/lwp_pid.c | 2 +- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 5855e9286b..5901ee74dd 100644 --- a/components/lwp/lwp.h +++ b/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; diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c index 97cd2ef152..f4704f4209 100644 --- a/components/lwp/lwp_futex.c +++ b/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; } diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 71cc8b5c4a..dff3d3f590 100644 --- a/components/lwp/lwp_pid.c +++ b/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; -- Gitee