diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 5855e9286bde8ec01b6f62d99e4e00b2bbab5949..5901ee74dda6f88ca22c237b1ce976bb9318bb5d 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 97cd2ef152bbb5a91a0e0a9c65bf3426be98a3ec..f4704f42092e5dfcce41add7498647a84fa9f5d9 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 71cc8b5c4aa6b557b1d1b970b87634f0edb43335..dff3d3f590aead0742945463f6577b0b43266643 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;