init_list(&ctx->old_data);
}
-void update_free_zone(zone_contents_t **contents)
+void update_free_zone(zone_contents_t *contents)
{
- if (contents == NULL || *contents == NULL) {
+ if (contents == NULL) {
return;
}
- (void)zone_tree_apply((*contents)->nodes, free_additional, NULL);
- zone_tree_deep_free(&(*contents)->nodes);
- zone_tree_deep_free(&(*contents)->nsec3_nodes);
+ (void)zone_tree_apply(contents->nodes, free_additional, NULL);
+ zone_tree_deep_free(&contents->nodes);
+ zone_tree_deep_free(&contents->nsec3_nodes);
- dnssec_nsec3_params_free(&(*contents)->nsec3_params);
+ dnssec_nsec3_params_free(&contents->nsec3_params);
- free(*contents);
- *contents = NULL;
+ free(contents);
}
zone_contents_deep_free(update->new_cont);
} else {
update_rollback(update->a_ctx);
- update_free_zone(&update->new_cont);
+ update_free_zone(update->new_cont);
}
changeset_clear(&update->change);
} else if (update->flags & UPDATE_FULL) {
struct rcu_head rcuhead;
void (*callback)(void *);
void *ctx;
- bool call_ctx_addr;
+ bool free_ctx;
} callrcu_wrapper_t;
static void callrcu_wrapper_cb(struct rcu_head *param)
{
callrcu_wrapper_t *wrap = (callrcu_wrapper_t *)param;
- if (wrap->call_ctx_addr) {
- // Paradigm free_fun(type_t **t) freeing the pointer completely.
- wrap->callback(&wrap->ctx);
- } else {
- // Paradigm clear_fun(type_t *t) just clearing the contents of type_t.
- wrap->callback(wrap->ctx);
+ wrap->callback(wrap->ctx);
+ if (wrap->free_ctx) {
free(wrap->ctx);
}
free(wrap);
}
/* NOTE: Does nothing if not enough memory. */
-static void callrcu_wrapper(void *ctx, void (*callback)(void *), bool call_ctx_addr)
+static void callrcu_wrapper(void *ctx, void *callback, bool free_ctx)
{
callrcu_wrapper_t *wrap = calloc(1, sizeof(callrcu_wrapper_t));
if (wrap != NULL) {
wrap->callback = callback;
wrap->ctx = ctx;
- wrap->call_ctx_addr = call_ctx_addr;
+ wrap->free_ctx = free_ctx;
call_rcu((struct rcu_head *)wrap, callrcu_wrapper_cb);
}
}
/* Sync RCU. */
if (update->flags & UPDATE_FULL) {
assert(update->new_cont_deep_copy);
- callrcu_wrapper(old_contents, (void (*)(void *))zone_contents_deep_free, true);
+ callrcu_wrapper(old_contents, zone_contents_deep_free, false);
} else if (update->flags & UPDATE_INCREMENTAL) {
if (update->new_cont_deep_copy) {
- callrcu_wrapper(old_contents, (void (*)(void *))zone_contents_deep_free, true);
+ callrcu_wrapper(old_contents, zone_contents_deep_free, false);
} else {
- callrcu_wrapper(old_contents, (void (*)(void *))update_free_zone, true);
+ callrcu_wrapper(old_contents, update_free_zone, false);
}
changeset_clear(&update->change);
}
- callrcu_wrapper(update->a_ctx, (void (*)(void *))update_cleanup, false);
+ callrcu_wrapper(update->a_ctx, update_cleanup, true);
update->a_ctx = NULL;
update->new_cont = NULL;