From: Timo Sirainen Date: Fri, 2 Dec 2011 12:49:08 +0000 (+0200) Subject: lib-storage: Added pool to struct mailbox_list_iterate_context. X-Git-Tag: 2.1.rc2~108 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7ff6268cc35102675d73d44d680bed13d0709f7b;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added pool to struct mailbox_list_iterate_context. --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 70514879a2..6d14808b29 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -360,6 +360,7 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns, struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list; struct mailbox_list_iterate_context *_ctx; struct imapc_mailbox_list_iterate_context *ctx; + pool_t pool; const char *ns_root_name; char sep; int ret = 0; @@ -382,12 +383,13 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns, sep = mailbox_list_get_hierarchy_sep(_list); - ctx = i_new(struct imapc_mailbox_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list imapc iter", 1024); + ctx = p_new(pool, struct imapc_mailbox_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = _list; ctx->ctx.flags = flags; - ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, - FALSE, sep); - array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5); + ctx->ctx.glob = imap_match_init_multiple(pool, patterns, FALSE, sep); + array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); ctx->info.ns = _list->ns; @@ -451,9 +453,7 @@ static int imapc_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) mailbox_tree_iterate_deinit(&ctx->iter); mailbox_tree_deinit(&ctx->tree); - imap_match_deinit(&_ctx->glob); - array_free(&_ctx->module_contexts); - i_free(ctx); + pool_unref(&_ctx->pool); return ret; } diff --git a/src/lib-storage/index/shared/shared-list.c b/src/lib-storage/index/shared/shared-list.c index d973cfa775..72704c09e0 100644 --- a/src/lib-storage/index/shared/shared-list.c +++ b/src/lib-storage/index/shared/shared-list.c @@ -177,14 +177,16 @@ shared_list_iter_init(struct mailbox_list *list, const char *const *patterns, enum mailbox_list_iter_flags flags) { struct mailbox_list_iterate_context *ctx; + pool_t pool; char sep = mail_namespace_get_sep(list->ns); - ctx = i_new(struct mailbox_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list shared iter", 1024); + ctx = p_new(pool, struct mailbox_list_iterate_context, 1); + ctx->pool = pool; ctx->list = list; ctx->flags = flags; - ctx->glob = imap_match_init_multiple(default_pool, patterns, - FALSE, sep); - array_create(&ctx->module_contexts, default_pool, sizeof(void *), 5); + ctx->glob = imap_match_init_multiple(pool, patterns, FALSE, sep); + array_create(&ctx->module_contexts, pool, sizeof(void *), 5); if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0 && (list->ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) T_BEGIN { @@ -201,9 +203,7 @@ shared_list_iter_next(struct mailbox_list_iterate_context *ctx ATTR_UNUSED) static int shared_list_iter_deinit(struct mailbox_list_iterate_context *ctx) { - imap_match_deinit(&ctx->glob); - array_free(&ctx->module_contexts); - i_free(ctx); + pool_unref(&ctx->pool); return 0; } diff --git a/src/lib-storage/list/mailbox-list-fs-iter.c b/src/lib-storage/list/mailbox-list-fs-iter.c index 9c8f2b341d..06552efca4 100644 --- a/src/lib-storage/list/mailbox-list-fs-iter.c +++ b/src/lib-storage/list/mailbox-list-fs-iter.c @@ -36,7 +36,7 @@ struct list_dir_context { struct fs_list_iterate_context { struct mailbox_list_iterate_context ctx; - ARRAY_DEFINE(valid_patterns, char *); + ARRAY_DEFINE(valid_patterns, const char *); char sep; enum mailbox_info_flags inbox_flags; @@ -128,7 +128,7 @@ pattern_has_wildcard_at(struct fs_list_iterate_context *ctx, static int list_opendir(struct fs_list_iterate_context *ctx, const char *path, const char *list_path, DIR **dirp) { - char *const *patterns; + const char *const *patterns; unsigned int i; /* if no patterns have wildcards at this point of the path, we don't @@ -209,7 +209,8 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, { struct fs_list_iterate_context *ctx; const char *path, *vpath, *rootdir, *test_pattern, *real_pattern; - char *pattern; + pool_t pool; + const char *pattern; DIR *dirp; unsigned int prefix_len; int ret; @@ -221,10 +222,12 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, flags); } - ctx = i_new(struct fs_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list fs iter", 1024); + ctx = p_new(pool, struct fs_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = _list; ctx->ctx.flags = flags; - array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5); + array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); ctx->info_pool = pool_alloconly_create("fs list", 1024); ctx->next = fs_list_next; @@ -232,7 +235,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, ctx->info.ns = _list->ns; prefix_len = strlen(_list->ns->prefix); - i_array_init(&ctx->valid_patterns, 8); + p_array_init(&ctx->valid_patterns, pool, 8); for (; *patterns != NULL; patterns++) { /* check that we're not trying to do any "../../" lists */ test_pattern = *patterns; @@ -251,7 +254,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, ctx->inbox_match = TRUE; continue; } - pattern = i_strdup(*patterns); + pattern = p_strdup(pool, *patterns); array_append(&ctx->valid_patterns, &pattern, 1); } } @@ -262,7 +265,7 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, return &ctx->ctx; } patterns = (const void *)array_idx(&ctx->valid_patterns, 0); - ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, TRUE, + ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ctx->sep); vpath = _list->ns->prefix; @@ -300,18 +303,11 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) { struct fs_list_iterate_context *ctx = (struct fs_list_iterate_context *)_ctx; - char **patterns; - unsigned int i, count; int ret = _ctx->failed ? -1 : 0; if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) return mailbox_list_subscriptions_iter_deinit(_ctx); - patterns = array_get_modifiable(&ctx->valid_patterns, &count); - for (i = 0; i < count; i++) - i_free(patterns[i]); - array_free(&ctx->valid_patterns); - while (ctx->dir != NULL) { struct list_dir_context *dir = ctx->dir; @@ -321,11 +317,7 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) if (ctx->info_pool != NULL) pool_unref(&ctx->info_pool); - if (_ctx->glob != NULL) - imap_match_deinit(&_ctx->glob); - array_free(&_ctx->module_contexts); - i_free(ctx); - + pool_unref(&_ctx->pool); return ret; } @@ -639,7 +631,7 @@ fs_list_dir_next(struct fs_list_iterate_context *ctx) { struct list_dir_context *dir = ctx->dir; struct dirent *d; - char *const *patterns; + const char *const *patterns; const char *fname, *path, *p; unsigned int pos; struct stat st; diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index 8a13dd57ab..678c5e89f8 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -14,14 +14,16 @@ mailbox_list_index_iter_init(struct mailbox_list *list, { struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); struct mailbox_list_index_iterate_context *ctx; + pool_t pool; char ns_sep = mail_namespace_get_sep(list->ns); - ctx = i_new(struct mailbox_list_index_iterate_context, 1); + pool = pool_alloconly_create("mailbox list index iter", 1024); + ctx = p_new(pool, struct mailbox_list_index_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = list; ctx->ctx.flags = flags; - ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, - TRUE, ns_sep); - array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5); + ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep); + array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); ctx->sep = ns_sep; if (mailbox_list_index_refresh(ctx->ctx.list) < 0) { @@ -31,7 +33,7 @@ mailbox_list_index_iter_init(struct mailbox_list *list, } else { /* listing mailboxes from index */ ctx->info.ns = list->ns; - ctx->path = str_new(default_pool, 128); + ctx->path = str_new(pool, 128); ctx->next_node = ilist->mailbox_tree; ilist->iter_refcount++; } @@ -162,11 +164,8 @@ int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx) else { i_assert(ilist->iter_refcount > 0); ilist->iter_refcount--; - str_free(&ctx->path); } - imap_match_deinit(&ctx->ctx.glob); - array_free(&ctx->ctx.module_contexts); - i_free(ctx); + pool_unref(&_ctx->pool); return ret; } diff --git a/src/lib-storage/list/mailbox-list-maildir-iter.c b/src/lib-storage/list/mailbox-list-maildir-iter.c index 51009ec52c..229ddc4bbd 100644 --- a/src/lib-storage/list/mailbox-list-maildir-iter.c +++ b/src/lib-storage/list/mailbox-list-maildir-iter.c @@ -19,7 +19,6 @@ struct maildir_list_iterate_context { struct mailbox_list_iterate_context ctx; - pool_t pool; const char *dir; char prefix_char; @@ -419,14 +418,14 @@ maildir_list_iter_init(struct mailbox_list *_list, const char *const *patterns, char ns_sep = mail_namespace_get_sep(_list->ns); int ret; - pool = pool_alloconly_create("maildir_list", 1024); + pool = pool_alloconly_create("mailbox list maildir iter", 1024); ctx = p_new(pool, struct maildir_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = _list; ctx->ctx.flags = flags; ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep); array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); - ctx->pool = pool; ctx->tree_ctx = mailbox_tree_init(ns_sep); ctx->info.ns = _list->ns; ctx->prefix_char = strcmp(_list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0 ? @@ -470,7 +469,7 @@ int maildir_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) if (ctx->tree_iter != NULL) mailbox_tree_iterate_deinit(&ctx->tree_iter); mailbox_tree_deinit(&ctx->tree_ctx); - pool_unref(&ctx->pool); + pool_unref(&ctx->ctx.pool); return ret; } diff --git a/src/lib-storage/list/mailbox-list-none.c b/src/lib-storage/list/mailbox-list-none.c index b1adeb4fff..bfe3573744 100644 --- a/src/lib-storage/list/mailbox-list-none.c +++ b/src/lib-storage/list/mailbox-list-none.c @@ -133,13 +133,16 @@ none_list_iter_init(struct mailbox_list *list, enum mailbox_list_iter_flags flags) { struct noop_list_iterate_context *ctx; + pool_t pool; - ctx = i_new(struct noop_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list none iter", 1024); + ctx = p_new(pool, struct noop_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = list; ctx->ctx.flags = flags; - ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, TRUE, + ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, mail_namespace_get_sep(list->ns)); - array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5); + array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); if ((list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 && imap_match(ctx->ctx.glob, "INBOX") == IMAP_MATCH_YES) { ctx->list_inbox = TRUE; @@ -152,9 +155,7 @@ none_list_iter_init(struct mailbox_list *list, static int none_list_iter_deinit(struct mailbox_list_iterate_context *ctx) { - array_free(&ctx->module_contexts); - imap_match_deinit(&ctx->glob); - i_free(ctx); + pool_unref(&ctx->pool); return 0; } diff --git a/src/lib-storage/list/mailbox-list-subscriptions.c b/src/lib-storage/list/mailbox-list-subscriptions.c index 08733d6a01..d0a3a1eeed 100644 --- a/src/lib-storage/list/mailbox-list-subscriptions.c +++ b/src/lib-storage/list/mailbox-list-subscriptions.c @@ -211,14 +211,16 @@ mailbox_list_subscriptions_iter_init(struct mailbox_list *list, enum mailbox_list_iter_flags flags) { struct subscriptions_mailbox_list_iterate_context *ctx; + pool_t pool; char sep = mail_namespace_get_sep(list->ns); - ctx = i_new(struct subscriptions_mailbox_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list subscriptions iter", 1024); + ctx = p_new(pool, struct subscriptions_mailbox_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = list; ctx->ctx.flags = flags; - ctx->ctx.glob = imap_match_init_multiple(default_pool, patterns, - TRUE, sep); - array_create(&ctx->ctx.module_contexts, default_pool, sizeof(void *), 5); + ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, sep); + array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); ctx->tree = mailbox_tree_init(sep); mailbox_list_subscriptions_fill(&ctx->ctx, ctx->tree); @@ -292,9 +294,6 @@ int mailbox_list_subscriptions_iter_deinit(struct mailbox_list_iterate_context * mailbox_tree_iterate_deinit(&ctx->iter); mailbox_tree_deinit(&ctx->tree); - if (_ctx->glob != NULL) - imap_match_deinit(&_ctx->glob); - array_free(&_ctx->module_contexts); - i_free(ctx); + pool_unref(&_ctx->pool); return ret; } diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index 78ca61f712..2a8853dd53 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -141,6 +141,7 @@ union mailbox_list_iterate_module_context { struct mailbox_list_iterate_context { struct mailbox_list *list; + pool_t pool; enum mailbox_list_iter_flags flags; bool failed; diff --git a/src/plugins/acl/acl-mailbox-list.c b/src/plugins/acl/acl-mailbox-list.c index f920b1ba06..76d72d45f0 100644 --- a/src/plugins/acl/acl-mailbox-list.c +++ b/src/plugins/acl/acl-mailbox-list.c @@ -162,17 +162,20 @@ acl_mailbox_list_iter_init(struct mailbox_list *list, { struct acl_mailbox_list *alist = ACL_LIST_CONTEXT(list); struct acl_mailbox_list_iterate_context *ctx; + pool_t pool; const char *p; unsigned int i; bool inboxcase; - ctx = i_new(struct acl_mailbox_list_iterate_context, 1); + pool = pool_alloconly_create("mailbox list acl iter", 1024); + ctx = p_new(pool, struct acl_mailbox_list_iterate_context, 1); + ctx->ctx.pool = pool; ctx->ctx.list = list; ctx->ctx.flags = flags; inboxcase = (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0; ctx->sep = mail_namespace_get_sep(list->ns); - ctx->glob = imap_match_init_multiple(default_pool, patterns, + ctx->glob = imap_match_init_multiple(pool, patterns, inboxcase, ctx->sep); /* see if all patterns have only a single '*' and it's at the end. we can use it to do some optimizations. */ @@ -410,9 +413,7 @@ acl_mailbox_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) ret = -1; if (ctx->lookup_boxes != NULL) mailbox_tree_deinit(&ctx->lookup_boxes); - if (ctx->glob != NULL) - imap_match_deinit(&ctx->glob); - i_free(ctx); + pool_unref(&_ctx->pool); return ret; }