# HG changeset patch # User Timo Sirainen # Date 1239841239 14400 # Node ID 77fb2731830b7503c9d8cc0bdbbb9741ed22139f # Parent ec1ae90af21aa4924d3663ff6a66047594e33c88 mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting. diff -r ec1ae90af21a -r 77fb2731830b src/lib-storage/mail-search.c --- 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); } diff -r ec1ae90af21a -r 77fb2731830b src/lib-storage/mail-search.h --- 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; };