1 #include "bits/callback.h" // for Transformer
4 static bool get_lock(Map *map, bool write)
8 pthread_rwlock_rdlock(&map->clk);
10 if ((success = !map->cnl)) {
12 pthread_rwlock_wrlock(&map->tlk);
14 pthread_rwlock_rdlock(&map->tlk);
17 pthread_rwlock_unlock(&map->clk);
22 void map_ini(Map *map)
25 pthread_rwlock_init(&map->tlk, NULL);
27 pthread_rwlock_init(&map->clk, NULL);
30 void map_dst(Map *map)
32 pthread_rwlock_destroy(&map->tlk);
33 pthread_rwlock_destroy(&map->clk);
36 void map_cnl(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order)
38 pthread_rwlock_wrlock(&map->clk);
41 pthread_rwlock_wrlock(&map->tlk);
42 pthread_rwlock_unlock(&map->clk);
44 tree_clr(&map->tre, iter, arg, trans, order);
46 pthread_rwlock_unlock(&map->tlk);
49 bool map_add(Map *map, void *key, void *dat, void *cmp, void *trans)
51 if (!get_lock(map, true))
54 bool ret = tree_add(&map->tre, key, dat, cmp, trans);
55 pthread_rwlock_unlock(&map->tlk);
59 void *map_get(Map *map, void *key, void *cmp, void *trans)
61 if (!get_lock(map, false))
64 void *ret = tree_get(&map->tre, key, cmp, trans);
65 pthread_rwlock_unlock(&map->tlk);
69 bool map_del(Map *map, void *key, void *cmp, void *call, void *arg, void *trans)
71 if (!get_lock(map, true))
74 bool ret = tree_del(&map->tre, key, cmp, call, arg, trans);
75 pthread_rwlock_unlock(&map->tlk);
79 void map_trv(Map *map, void *iter, void *arg, void *trans, TreeTraversionOrder order)
81 if (!get_lock(map, false))
84 tree_trv(&map->tre, iter, arg, trans, order);
85 pthread_rwlock_unlock(&map->tlk);