1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-11-01     Shell        Init ver.
9  */
10 
11 #include "lwp_futex_internal.h"
12 
13 static struct shared_futex_entry *_futex_hash_head;
14 
futex_global_table_add(struct shared_futex_key * key,rt_futex_t futex)15 rt_err_t futex_global_table_add(struct shared_futex_key *key, rt_futex_t futex)
16 {
17     rt_err_t rc = 0;
18     struct shared_futex_entry *entry = &futex->entry;
19     futex->entry.key.mobj = key->mobj;
20     futex->entry.key.offset = key->offset;
21 
22     RT_UTHASH_ADD(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
23     return rc;
24 }
25 
futex_global_table_find(struct shared_futex_key * key,rt_futex_t * futex)26 rt_err_t futex_global_table_find(struct shared_futex_key *key, rt_futex_t *futex)
27 {
28     rt_err_t rc;
29     rt_futex_t found_futex;
30     struct shared_futex_entry *entry;
31 
32     RT_UTHASH_FIND(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
33     if (entry)
34     {
35         rc = RT_EOK;
36         found_futex = rt_container_of(entry, struct rt_futex, entry);
37     }
38     else
39     {
40         rc = -RT_ENOENT;
41         found_futex = RT_NULL;
42     }
43 
44     *futex = found_futex;
45     return rc;
46 }
47 
futex_global_table_delete(struct shared_futex_key * key)48 rt_err_t futex_global_table_delete(struct shared_futex_key *key)
49 {
50     rt_err_t rc;
51     struct shared_futex_entry *entry;
52 
53     RT_UTHASH_FIND(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
54     if (entry)
55     {
56         RT_UTHASH_DELETE(_futex_hash_head, entry);
57         rc = RT_EOK;
58     }
59     else
60     {
61         rc = -RT_ENOENT;
62     }
63 
64     return rc;
65 }
66