]> git.lizzy.rs Git - dragonstd.git/blob - map.c
899d25c3486511ebe312ce28382e3a880ea68f6b
[dragonstd.git] / map.c
1 #include "map.h"
2
3 static bool get_lock(Map *map, bool write)
4 {
5         bool success;
6
7         pthread_rwlock_rdlock(&map->clk);
8
9         if ((success = !map->cnl)) {
10                 if (write)
11                         pthread_rwlock_wrlock(&map->tlk);
12                 else
13                         pthread_rwlock_rdlock(&map->tlk);
14         }
15
16         pthread_rwlock_unlock(&map->clk);
17
18         return success;
19 }
20
21 void map_ini(Map *map)
22 {
23         tree_ini(&map->tre);
24         pthread_rwlock_init(&map->tlk, NULL);
25         map->cnl = false;
26         pthread_rwlock_init(&map->clk, NULL);
27 }
28
29 void map_dst(Map *map)
30 {
31         pthread_rwlock_destroy(&map->tlk);
32         pthread_rwlock_destroy(&map->clk);
33 }
34
35 void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
36 {
37         pthread_rwlock_wrlock(&map->clk);
38         map->cnl = true;
39
40         pthread_rwlock_wrlock(&map->tlk);
41         pthread_rwlock_unlock(&map->clk);
42
43         tree_clr(&map->tre, iter, arg, trans, order);
44
45         pthread_rwlock_unlock(&map->tlk);
46 }
47
48 bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans)
49 {
50         if (!get_lock(map, true))
51                 return false;
52
53         bool ret = tree_add(&map->tre, dat, cmp, trans);
54         pthread_rwlock_unlock(&map->tlk);
55         return ret;
56 }
57
58 void *map_get(Map *map, void *key, Comparator cmp, Transformer trans)
59 {
60         if (!get_lock(map, false))
61                 return NULL;
62
63         void *ret = tree_get(&map->tre, key, cmp, trans);
64         pthread_rwlock_unlock(&map->tlk);
65         return ret;
66 }
67
68 bool map_del(Map *map, void *key, Comparator cmp, Callback call, void *arg, Transformer trans)
69 {
70         if (!get_lock(map, true))
71                 return false;
72
73         bool ret = tree_del(&map->tre, key, cmp, call, arg, trans);
74         pthread_rwlock_unlock(&map->tlk);
75         return ret;
76 }
77
78 void map_trv(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
79 {
80         if (!get_lock(map, false))
81                 return;
82
83         tree_trv(&map->tre, iter, arg, trans, order);
84         pthread_rwlock_unlock(&map->tlk);
85 }