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, Iterator func, void *arg, 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, func, arg, order);
45 pthread_rwlock_unlock(&map->tlk);
48 #define WRAP_TREE_FUNC(name, write) \
49 void *map_ ## name(Map *map, void *dat, Comparator cmp, Transformer func) \
51 if (! get_lock(map, write)) \
54 dat = tree_ ## name(&map->tre, dat, cmp, func); \
55 pthread_rwlock_unlock(&map->tlk); \
59 WRAP_TREE_FUNC(add, true)
60 WRAP_TREE_FUNC(get, false)
61 WRAP_TREE_FUNC(del, true)