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