changeset 21413:91187182279c

lib-dict: Add assert to make sure all iterators are deinitialized.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 16 Jan 2017 17:12:41 +0200
parents 7ff9bc554381
children 355ebf12f384
files src/lib-dict/dict-private.h src/lib-dict/dict.c
diffstat 2 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-private.h	Mon Jan 16 16:57:21 2017 +0200
+++ b/src/lib-dict/dict-private.h	Mon Jan 16 17:12:41 2017 +0200
@@ -48,6 +48,7 @@
 	const char *name;
 
 	struct dict_vfuncs v;
+	unsigned int iter_count;
 };
 
 struct dict_iterate_context {
--- a/src/lib-dict/dict.c	Mon Jan 16 16:57:21 2017 +0200
+++ b/src/lib-dict/dict.c	Mon Jan 16 17:12:41 2017 +0200
@@ -161,17 +161,22 @@
 dict_iterate_init_multiple(struct dict *dict, const char *const *paths,
 			   enum dict_iterate_flags flags)
 {
+	struct dict_iterate_context *ctx;
 	unsigned int i;
 
 	i_assert(paths[0] != NULL);
 	for (i = 0; paths[i] != NULL; i++)
 		i_assert(dict_key_prefix_is_valid(paths[i]));
+
 	if (dict->v.iterate_init == NULL) {
 		/* not supported by backend */
 		i_error("%s: dict iteration not supported", dict->name);
-		return &dict_iter_unsupported;
+		ctx = &dict_iter_unsupported;
+	} else {
+		ctx = dict->v.iterate_init(dict, paths, flags);
 	}
-	return dict->v.iterate_init(dict, paths, flags);
+	dict->iter_count++;
+	return ctx;
 }
 
 bool dict_iterate(struct dict_iterate_context *ctx,
@@ -213,6 +218,9 @@
 {
 	struct dict_iterate_context *ctx = *_ctx;
 
+	i_assert(ctx->dict->iter_count > 0);
+	ctx->dict->iter_count--;
+
 	*_ctx = NULL;
 	return ctx == &dict_iter_unsupported ? -1 :
 		ctx->dict->v.iterate_deinit(ctx);