3 static bool get_lock(Map *map, bool write)
7 pthread_rwlock_rdlock(&map->clk);
9 if ((success = !map->cnl)) {
11 pthread_rwlock_wrlock(&map->tlk);
13 pthread_rwlock_rdlock(&map->tlk);
16 pthread_rwlock_unlock(&map->clk);
21 void map_ini(Map *map)
24 pthread_rwlock_init(&map->tlk, NULL);
26 pthread_rwlock_init(&map->clk, NULL);
29 void map_dst(Map *map)
31 pthread_rwlock_destroy(&map->tlk);
32 pthread_rwlock_destroy(&map->clk);
35 void map_cnl(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
37 pthread_rwlock_wrlock(&map->clk);
40 pthread_rwlock_wrlock(&map->tlk);
41 pthread_rwlock_unlock(&map->clk);
43 tree_clr(&map->tre, iter, arg, trans, order);
45 pthread_rwlock_unlock(&map->tlk);
48 bool map_add(Map *map, void *dat, Comparator cmp, Transformer trans)
50 if (!get_lock(map, true))
53 bool ret = tree_add(&map->tre, dat, cmp, trans);
54 pthread_rwlock_unlock(&map->tlk);
58 void *map_get(Map *map, void *key, Comparator cmp, Transformer trans)
60 if (!get_lock(map, false))
63 void *ret = tree_get(&map->tre, key, cmp, trans);
64 pthread_rwlock_unlock(&map->tlk);
68 bool map_del(Map *map, void *key, Comparator cmp, Callback call, void *arg, Transformer trans)
70 if (!get_lock(map, true))
73 bool ret = tree_del(&map->tre, key, cmp, call, arg, trans);
74 pthread_rwlock_unlock(&map->tlk);
78 void map_trv(Map *map, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
80 if (!get_lock(map, false))
83 tree_trv(&map->tre, iter, arg, trans, order);
84 pthread_rwlock_unlock(&map->tlk);