# HG changeset patch # User Timo Sirainen # Date 1239841477 14400 # Node ID 8b831d260dca67c61592fdbfa51fe9ad87930e8c # Parent 093c15fed377622c4391b382096da6a19ce7ae38 mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting. diff -r 093c15fed377 -r 8b831d260dca 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:24:37 2009 -0400 @@ -122,7 +122,7 @@ 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; } @@ -167,11 +167,10 @@ void mail_search_args_deinit(struct mail_search_args *args) { - if (args->refcount > 1 || !args->initialized) + if (--args->init_refcount > 0) return; mail_search_args_deinit_sub(args, args->args); - args->initialized = FALSE; args->box = NULL; } @@ -229,10 +228,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 093c15fed377 -r 8b831d260dca 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:24:37 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; };