dovecot-2.0: Added reference counting to struct mail_keywords an...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Jun 23 00:58:33 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/094ad127d132
changeset: 9508:094ad127d132
user: Timo Sirainen <tss at iki.fi>
date: Mon Jun 22 17:45:56 2009 -0400
description:
Added reference counting to struct mail_keywords and related APIs.
diffstat:
26 files changed, 100 insertions(+), 50 deletions(-)
src/imap/cmd-append.c | 2 -
src/imap/cmd-copy.c | 3 +-
src/imap/cmd-store.c | 2 -
src/lib-index/mail-index-sync.c | 4 +--
src/lib-index/mail-index-transaction.c | 22 +++++++++++++---
src/lib-index/mail-index.h | 5 ++-
src/lib-lda/mail-deliver.c | 3 +-
src/lib-storage/index/cydir/cydir-storage.c | 3 +-
src/lib-storage/index/dbox/dbox-storage.c | 3 +-
src/lib-storage/index/dbox/dbox-sync-rebuild.c | 4 +--
src/lib-storage/index/index-storage.c | 11 ++++++--
src/lib-storage/index/index-storage.h | 3 +-
src/lib-storage/index/maildir/maildir-storage.c | 3 +-
src/lib-storage/index/maildir/maildir-sync-index.c | 8 +++---
src/lib-storage/index/mbox/mbox-storage.c | 3 +-
src/lib-storage/index/mbox/mbox-sync.c | 2 -
src/lib-storage/index/raw/raw-storage.c | 3 +-
src/lib-storage/mail-search.c | 6 ++--
src/lib-storage/mail-storage-private.h | 3 +-
src/lib-storage/mail-storage.c | 11 ++++++--
src/lib-storage/mail-storage.h | 5 ++-
src/lib-storage/test-mailbox.c | 26 ++++++++++++++------
src/plugins/convert/convert-storage.c | 3 +-
src/plugins/lazy-expunge/lazy-expunge-plugin.c | 3 +-
src/plugins/virtual/virtual-storage.c | 3 +-
src/plugins/virtual/virtual-sync.c | 6 ++--
diffs (truncated from 518 to 300 lines):
diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-append.c Mon Jun 22 17:45:56 2009 -0400
@@ -354,7 +354,7 @@ static bool cmd_append_continue_parsing(
ret = mailbox_save_begin(&ctx->save_ctx, ctx->input);
if (keywords != NULL)
- mailbox_keywords_free(ctx->box, &keywords);
+ mailbox_keywords_unref(ctx->box, &keywords);
if (ret < 0) {
/* save initialization failed */
diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-copy.c Mon Jun 22 17:45:56 2009 -0400
@@ -72,7 +72,8 @@ static int fetch_and_copy(struct client
if (mailbox_copy(&save_ctx, mail) < 0)
ret = mail->expunged ? 0 : -1;
- mailbox_keywords_free(destbox, &keywords);
+ if (keywords != NULL)
+ mailbox_keywords_unref(destbox, &keywords);
msgset_generator_next(&srcset_ctx, mail->uid);
}
diff -r d7e09c3eaace -r 094ad127d132 src/imap/cmd-store.c
--- a/src/imap/cmd-store.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/imap/cmd-store.c Mon Jun 22 17:45:56 2009 -0400
@@ -198,7 +198,7 @@ bool cmd_store(struct client_command_con
mail_free(&mail);
if (ctx.keywords != NULL)
- mailbox_keywords_free(client->mailbox, &ctx.keywords);
+ mailbox_keywords_unref(client->mailbox, &ctx.keywords);
ret = mailbox_search_deinit(&search_ctx);
if (ret < 0)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index-sync.c Mon Jun 22 17:45:56 2009 -0400
@@ -89,7 +89,7 @@ static void mail_index_sync_add_keyword_
}
}
- mail_index_keywords_free(&keywords);
+ mail_index_keywords_unref(&keywords);
}
static void mail_index_sync_add_keyword_reset(struct mail_index_sync_ctx *ctx)
@@ -106,7 +106,7 @@ static void mail_index_sync_add_keyword_
MODIFY_REPLACE, keywords);
}
}
- mail_index_keywords_free(&keywords);
+ mail_index_keywords_unref(&keywords);
}
static void mail_index_sync_add_append(struct mail_index_sync_ctx *ctx)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index-transaction.c Mon Jun 22 17:45:56 2009 -0400
@@ -1164,6 +1164,7 @@ mail_index_keywords_create(struct mail_i
if (count == 0) {
k = i_new(struct mail_keywords, 1);
k->index = index;
+ k->refcount = 1;
return k;
}
@@ -1171,6 +1172,7 @@ mail_index_keywords_create(struct mail_i
k = i_malloc(sizeof(struct mail_keywords) +
(sizeof(k->idx) * (count-1)));
k->index = index;
+ k->refcount = 1;
/* look up the keywords from index. they're never removed from there
so we can permanently store indexes to them. */
@@ -1202,6 +1204,7 @@ mail_index_keywords_create_from_indexes(
if (count == 0) {
k = i_new(struct mail_keywords, 1);
k->index = index;
+ k->refcount = 1;
return k;
}
@@ -1209,6 +1212,7 @@ mail_index_keywords_create_from_indexes(
k = i_malloc(sizeof(struct mail_keywords) +
(sizeof(k->idx) * (count-1)));
k->index = index;
+ k->refcount = 1;
/* copy but skip duplicates */
for (src = dest = 0; src < count; src++) {
@@ -1223,10 +1227,20 @@ mail_index_keywords_create_from_indexes(
return k;
}
-void mail_index_keywords_free(struct mail_keywords **keywords)
-{
- i_free(*keywords);
- *keywords = NULL;
+void mail_index_keywords_ref(struct mail_keywords *keywords)
+{
+ keywords->refcount++;
+}
+
+void mail_index_keywords_unref(struct mail_keywords **_keywords)
+{
+ struct mail_keywords *keywords = *_keywords;
+
+ i_assert(keywords->refcount > 0);
+
+ *_keywords = NULL;
+ if (--keywords->refcount == 0)
+ i_free(keywords);
}
static bool
diff -r d7e09c3eaace -r 094ad127d132 src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-index/mail-index.h Mon Jun 22 17:45:56 2009 -0400
@@ -102,6 +102,7 @@ struct mail_keywords {
struct mail_keywords {
struct mail_index *index;
unsigned int count;
+ int refcount;
/* variable sized list of keyword indexes */
unsigned int idx[1];
@@ -430,8 +431,8 @@ mail_index_keywords_create_from_indexes(
mail_index_keywords_create_from_indexes(struct mail_index *index,
const ARRAY_TYPE(keyword_indexes)
*keyword_indexes);
-/* Free the keywords. */
-void mail_index_keywords_free(struct mail_keywords **keywords);
+void mail_index_keywords_ref(struct mail_keywords *keywords);
+void mail_index_keywords_unref(struct mail_keywords **keywords);
/* Update keywords for given message. */
void mail_index_update_keywords(struct mail_index_transaction *t, uint32_t seq,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-lda/mail-deliver.c
--- a/src/lib-lda/mail-deliver.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-lda/mail-deliver.c Mon Jun 22 17:45:56 2009 -0400
@@ -183,7 +183,8 @@ int mail_deliver_save(struct mail_delive
mailbox_save_set_flags(save_ctx, flags, kw);
if (mailbox_copy(&save_ctx, ctx->src_mail) < 0)
ret = -1;
- mailbox_keywords_free(box, &kw);
+ if (kw != NULL)
+ mailbox_keywords_unref(box, &kw);
if (ret < 0)
mailbox_transaction_rollback(&t);
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c Mon Jun 22 17:45:56 2009 -0400
@@ -375,7 +375,8 @@ struct mailbox cydir_mailbox = {
index_transaction_set_max_modseq,
index_keywords_create,
index_keywords_create_from_indexes,
- index_keywords_free,
+ index_keywords_ref,
+ index_keywords_unref,
index_keyword_is_valid,
index_storage_get_seq_range,
index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.c Mon Jun 22 17:45:56 2009 -0400
@@ -878,7 +878,8 @@ struct mailbox dbox_mailbox = {
index_transaction_set_max_modseq,
index_keywords_create,
index_keywords_create_from_indexes,
- index_keywords_free,
+ index_keywords_ref,
+ index_keywords_unref,
index_keyword_is_valid,
index_storage_get_seq_range,
index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/dbox/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c Mon Jun 22 17:45:56 2009 -0400
@@ -104,7 +104,7 @@ dbox_sync_index_copy_from_old(struct dbo
mail_index_lookup_keywords(view, old_seq, &old_keywords);
kw = mail_index_keywords_create_from_indexes(index, &old_keywords);
mail_index_update_keywords(ctx->trans, new_seq, MODIFY_REPLACE, kw);
- mail_index_keywords_free(&kw);
+ mail_index_keywords_unref(&kw);
dbox_sync_index_copy_cache(ctx, view, old_seq, new_seq);
}
@@ -125,7 +125,7 @@ dbox_sync_index_copy_from_maildir(struct
keywords = mail_index_keywords_create_from_indexes(ctx->mbox->ibox.index,
&keyword_indexes);
mail_index_update_keywords(ctx->trans, seq, MODIFY_REPLACE, keywords);
- mail_index_keywords_free(&keywords);
+ mail_index_keywords_unref(&keywords);
}
void dbox_sync_rebuild_index_metadata(struct dbox_sync_rebuild_context *ctx,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/index-storage.c Mon Jun 22 17:45:56 2009 -0400
@@ -644,9 +644,14 @@ index_keywords_create_from_indexes(struc
return mail_index_keywords_create_from_indexes(ibox->index, idx);
}
-void index_keywords_free(struct mail_keywords *keywords)
-{
- mail_index_keywords_free(&keywords);
+void index_keywords_ref(struct mail_keywords *keywords)
+{
+ mail_index_keywords_ref(keywords);
+}
+
+void index_keywords_unref(struct mail_keywords *keywords)
+{
+ mail_index_keywords_unref(&keywords);
}
void index_save_context_free(struct mail_save_context *ctx)
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/index-storage.h Mon Jun 22 17:45:56 2009 -0400
@@ -107,7 +107,8 @@ struct mail_keywords *
struct mail_keywords *
index_keywords_create_from_indexes(struct mailbox *box,
const ARRAY_TYPE(keyword_indexes) *idx);
-void index_keywords_free(struct mail_keywords *keywords);
+void index_keywords_ref(struct mail_keywords *keywords);
+void index_keywords_unref(struct mail_keywords *keywords);
bool index_keyword_is_valid(struct mailbox *box, const char *keyword,
const char **error_r);
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-storage.c Mon Jun 22 17:45:56 2009 -0400
@@ -1056,7 +1056,8 @@ struct mailbox maildir_mailbox = {
index_transaction_set_max_modseq,
index_keywords_create,
index_keywords_create_from_indexes,
- index_keywords_free,
+ index_keywords_ref,
+ index_keywords_unref,
index_keyword_is_valid,
index_storage_get_seq_range,
index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/maildir/maildir-sync-index.c
--- a/src/lib-storage/index/maildir/maildir-sync-index.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c Mon Jun 22 17:45:56 2009 -0400
@@ -326,7 +326,7 @@ maildir_sync_mail_keywords(struct maildi
kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
&ctx->keywords);
mail_index_update_keywords(ctx->trans, seq, MODIFY_REPLACE, kw);
- mail_index_keywords_free(&kw);
+ mail_index_keywords_unref(&kw);
return;
}
@@ -357,14 +357,14 @@ maildir_sync_mail_keywords(struct maildi
kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
&ctx->idx_keywords);
mail_index_update_keywords(ctx->trans, seq, MODIFY_REMOVE, kw);
- mail_index_keywords_free(&kw);
+ mail_index_keywords_unref(&kw);
}
if (array_count(&ctx->keywords) > 0) {
kw = mail_index_keywords_create_from_indexes(mbox->ibox.index,
&ctx->keywords);
mail_index_update_keywords(ctx->trans, seq, MODIFY_ADD, kw);
- mail_index_keywords_free(&kw);
+ mail_index_keywords_unref(&kw);
}
}
@@ -464,7 +464,7 @@ int maildir_sync_index(struct maildir_in
mbox->ibox.index, &ctx->keywords);
mail_index_update_keywords(trans, seq,
MODIFY_REPLACE, kw);
- mail_index_keywords_free(&kw);
+ mail_index_keywords_unref(&kw);
}
continue;
}
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c Mon Jun 22 01:44:42 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-storage.c Mon Jun 22 17:45:56 2009 -0400
@@ -872,7 +872,8 @@ struct mailbox mbox_mailbox = {
index_transaction_set_max_modseq,
index_keywords_create,
index_keywords_create_from_indexes,
- index_keywords_free,
+ index_keywords_ref,
+ index_keywords_unref,
index_keyword_is_valid,
index_storage_get_seq_range,
index_storage_get_uid_range,
diff -r d7e09c3eaace -r 094ad127d132 src/lib-storage/index/mbox/mbox-sync.c
--- a/src/lib-storage/index/mbox/mbox-sync.c Mon Jun 22 01:44:42 2009 -0400
More information about the dovecot-cvs
mailing list