changeset 8951:77fb2731830b HEAD

mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
author Timo Sirainen <tss@iki.fi>
date Wed, 15 Apr 2009 20:20:39 -0400
parents ec1ae90af21a
children d1c0ff11981d
files src/lib-storage/mail-search.c src/lib-storage/mail-search.h
diffstat 2 files changed, 11 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-search.c	Wed Apr 15 19:48:55 2009 -0400
+++ b/src/lib-storage/mail-search.c	Wed Apr 15 20:20:39 2009 -0400
@@ -122,11 +122,10 @@
 			   struct mailbox *box, bool change_uidsets,
 			   const ARRAY_TYPE(seq_range) *search_saved_uidset)
 {
-	if (args->initialized) {
+	if (args->init_refcount++ > 0) {
 		i_assert(args->box == box);
 		return;
 	}
-	args->initialized = TRUE;
 
 	args->box = box;
 	if (!args->simplified)
@@ -168,11 +167,11 @@
 
 void mail_search_args_deinit(struct mail_search_args *args)
 {
-	if (!args->initialized)
+	i_assert(args->init_refcount > 0);
+	if (--args->init_refcount > 0)
 		return;
 
 	mail_search_args_deinit_sub(args, args->args);
-	args->initialized = FALSE;
 	args->box = NULL;
 }
 
@@ -230,10 +229,13 @@
 	i_assert(args->refcount > 0);
 
 	*_args = NULL;
-	if (--args->refcount > 0)
+	if (--args->refcount > 0) {
+		i_assert(args->init_refcount <= args->refcount);
 		return;
-
-	mail_search_args_deinit(args);
+	}
+	i_assert(args->init_refcount <= 1);
+	if (args->init_refcount == 1)
+		mail_search_args_deinit(args);
 	pool_unref(&args->pool);
 }
 
--- a/src/lib-storage/mail-search.h	Wed Apr 15 19:48:55 2009 -0400
+++ b/src/lib-storage/mail-search.h	Wed Apr 15 20:20:39 2009 -0400
@@ -93,13 +93,13 @@
 };
 
 struct mail_search_args {
-	int refcount;
+	int refcount, init_refcount;
+
 	pool_t pool;
 	struct mailbox *box;
 	struct mail_search_arg *args;
 	const char *charset;
 
-	unsigned int initialized:1;
 	unsigned int simplified:1;
 	unsigned int have_inthreads:1;
 };