From 4a570c9419a1e9c04b687f40ab1a755abd042e86 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 3 Jan 2023 15:16:52 +1030 Subject: [PATCH] gossmap: ensure htables are always tal objects. We want to change the htable allocator to use tal, which will need this. Signed-off-by: Rusty Russell --- common/gossmap.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/common/gossmap.c b/common/gossmap.c index 9ae3738e3..92bbaf59d 100644 --- a/common/gossmap.c +++ b/common/gossmap.c @@ -59,10 +59,10 @@ struct gossmap { size_t map_end, map_size; /* Map of node id -> node */ - struct nodeidx_htable nodes; + struct nodeidx_htable *nodes; /* Map of short_channel_id id -> channel */ - struct chanidx_htable channels; + struct chanidx_htable *channels; /* Array of nodes, so we can use simple index. */ struct gossmap_node *node_arr; @@ -235,7 +235,7 @@ static struct node_id nodeidx_id(const ptrint_t *pidx) struct gossmap_node *gossmap_find_node(const struct gossmap *map, const struct node_id *id) { - ptrint_t *pi = nodeidx_htable_get(&map->nodes, *id); + ptrint_t *pi = nodeidx_htable_get(map->nodes, *id); if (pi) return ptrint2node(pi); return NULL; @@ -244,7 +244,7 @@ struct gossmap_node *gossmap_find_node(const struct gossmap *map, struct gossmap_chan *gossmap_find_chan(const struct gossmap *map, const struct short_channel_id *scid) { - ptrint_t *pi = chanidx_htable_get(&map->channels, *scid); + ptrint_t *pi = chanidx_htable_get(map->channels, *scid); if (pi) return ptrint2chan(pi); return NULL; @@ -295,7 +295,7 @@ static u32 new_node(struct gossmap *map) static void remove_node(struct gossmap *map, struct gossmap_node *node) { u32 nodeidx = gossmap_node_idx(map, node); - if (!nodeidx_htable_del(&map->nodes, node2ptrint(node))) + if (!nodeidx_htable_del(map->nodes, node2ptrint(node))) abort(); node->nann_off = map->freed_nodes; free(node->chan_idxs); @@ -359,7 +359,7 @@ static struct gossmap_chan *new_channel(struct gossmap *map, chan->half[1].nodeidx = n2idx; node_add_channel(map->node_arr + n1idx, gossmap_chan_idx(map, chan)); node_add_channel(map->node_arr + n2idx, gossmap_chan_idx(map, chan)); - chanidx_htable_add(&map->channels, chan2ptrint(chan)); + chanidx_htable_add(map->channels, chan2ptrint(chan)); return chan; } @@ -386,7 +386,7 @@ static void remove_chan_from_node(struct gossmap *map, void gossmap_remove_chan(struct gossmap *map, struct gossmap_chan *chan) { u32 chanidx = gossmap_chan_idx(map, chan); - if (!chanidx_htable_del(&map->channels, chan2ptrint(chan))) + if (!chanidx_htable_del(map->channels, chan2ptrint(chan))) abort(); remove_chan_from_node(map, gossmap_nth_node(map, chan, 0), chanidx); remove_chan_from_node(map, gossmap_nth_node(map, chan, 1), chanidx); @@ -460,10 +460,10 @@ static struct gossmap_chan *add_channel(struct gossmap *map, /* Now we have a channel, we can add nodes to htable */ if (!n[0]) - nodeidx_htable_add(&map->nodes, + nodeidx_htable_add(map->nodes, node2ptrint(map->node_arr + nidx[0])); if (!n[1]) - nodeidx_htable_add(&map->nodes, + nodeidx_htable_add(map->nodes, node2ptrint(map->node_arr + nidx[1])); return chan; @@ -678,8 +678,10 @@ static bool load_gossip_store(struct gossmap *map, size_t *num_rejected) * and 10000 nodes, let's assume each channel gets about 750 bytes. * * We halve this, since often some records are deleted. */ - chanidx_htable_init_sized(&map->channels, map->map_size / 750 / 2); - nodeidx_htable_init_sized(&map->nodes, map->map_size / 2500 / 2); + map->channels = tal(map, struct chanidx_htable); + chanidx_htable_init_sized(map->channels, map->map_size / 750 / 2); + map->nodes = tal(map, struct nodeidx_htable); + nodeidx_htable_init_sized(map->nodes, map->map_size / 2500 / 2); map->num_chan_arr = map->map_size / 750 / 2 + 1; map->chan_arr = tal_arr(map, struct gossmap_chan, map->num_chan_arr); @@ -697,8 +699,8 @@ static void destroy_map(struct gossmap *map) { if (map->mmap) munmap(map->mmap, map->map_size); - chanidx_htable_clear(&map->channels); - nodeidx_htable_clear(&map->nodes); + chanidx_htable_clear(map->channels); + nodeidx_htable_clear(map->nodes); for (size_t i = 0; i < tal_count(map->node_arr); i++) free(map->node_arr[i].chan_idxs); @@ -1059,7 +1061,7 @@ struct gossmap_node *gossmap_nth_node(const struct gossmap *map, size_t gossmap_num_nodes(const struct gossmap *map) { - return nodeidx_htable_count(&map->nodes); + return nodeidx_htable_count(map->nodes); } static struct gossmap_node *node_iter(const struct gossmap *map, size_t start) @@ -1084,7 +1086,7 @@ struct gossmap_node *gossmap_next_node(const struct gossmap *map, size_t gossmap_num_chans(const struct gossmap *map) { - return chanidx_htable_count(&map->channels); + return chanidx_htable_count(map->channels); } static struct gossmap_chan *chan_iter(const struct gossmap *map, size_t start)