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(type, name, write, CallbackType, null) \
49 type map_ ## name(Map *map, void *dat, Comparator cmp, CallbackType func) \
51 if (!get_lock(map, write)) \
54 type ret = tree_ ## name(&map->tre, dat, cmp, func); \
55 pthread_rwlock_unlock(&map->tlk); \
59 WRAP_TREE_FUNC(bool, add, true, Transformer, false)
60 WRAP_TREE_FUNC(void *, get, false, Transformer, NULL)
61 WRAP_TREE_FUNC(bool, del, true, Callback, false)
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);
69 pthread_rwlock_unlock(&map->tlk);