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