From 0cfb947a4bc43208d2b9e54bfaae96d52290f190 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 19 Mar 2024 22:14:21 +0200 Subject: [PATCH] fts: Avoid reference counting struct fts_user This is needed by the following changes. --- .../fts-flatcurve/fts-flatcurve-plugin.c | 1 - src/plugins/fts-solr/fts-solr-plugin.c | 1 - src/plugins/fts/fts-plugin.c | 1 + src/plugins/fts/fts-user.c | 36 +++++++++---------- src/plugins/fts/fts-user.h | 2 +- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/plugins/fts-flatcurve/fts-flatcurve-plugin.c b/src/plugins/fts-flatcurve/fts-flatcurve-plugin.c index 7256380333..f9078929bc 100644 --- a/src/plugins/fts-flatcurve/fts-flatcurve-plugin.c +++ b/src/plugins/fts-flatcurve/fts-flatcurve-plugin.c @@ -20,7 +20,6 @@ static void fts_flatcurve_mail_user_deinit(struct mail_user *user) struct fts_flatcurve_user *fuser = FTS_FLATCURVE_USER_CONTEXT_REQUIRE(user); - fts_mail_user_deinit(user); settings_free(fuser->set); fuser->module_ctx.super.deinit(user); } diff --git a/src/plugins/fts-solr/fts-solr-plugin.c b/src/plugins/fts-solr/fts-solr-plugin.c index e281ab5a14..01b7222124 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.c +++ b/src/plugins/fts-solr/fts-solr-plugin.c @@ -21,7 +21,6 @@ static void fts_solr_mail_user_deinit(struct mail_user *user) { struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT_REQUIRE(user); - fts_mail_user_deinit(user); settings_free(fuser->set); fuser->module_ctx.super.deinit(user); } diff --git a/src/plugins/fts/fts-plugin.c b/src/plugins/fts/fts-plugin.c index 1a1b97209a..593421b78c 100644 --- a/src/plugins/fts/fts-plugin.c +++ b/src/plugins/fts/fts-plugin.c @@ -13,6 +13,7 @@ const char *fts_plugin_version = DOVECOT_ABI_VERSION; static struct mail_storage_hooks fts_mail_storage_hooks = { + .mail_user_created = fts_mail_user_created, .mail_namespaces_added = fts_mail_namespaces_added, .mailbox_list_created = fts_mailbox_list_created, .mailbox_allocated = fts_mailbox_allocated, diff --git a/src/plugins/fts/fts-user.c b/src/plugins/fts/fts-user.c index 1f687d6e0b..c855b29afb 100644 --- a/src/plugins/fts/fts-user.c +++ b/src/plugins/fts/fts-user.c @@ -21,7 +21,6 @@ struct fts_user { union mail_user_module_context module_ctx; const struct fts_settings *set; - int refcount; }; static MODULE_CONTEXT_DEFINE_INIT(fts_user_module, @@ -44,11 +43,8 @@ int fts_mail_user_init(struct mail_user *user, bool initialize_libfts, { struct fts_user *fuser = FTS_USER_CONTEXT(user); - if (fuser != NULL) { - /* multiple fts plugins are loaded */ - fuser->refcount++; + if (fuser->set != NULL) return 0; - } const struct fts_settings *set; if (settings_get(user->event, &fts_setting_parser_info, 0, &set, error_r) < 0) @@ -59,23 +55,27 @@ int fts_mail_user_init(struct mail_user *user, bool initialize_libfts, return -1; } - fuser = p_new(user->pool, struct fts_user, 1); fuser->set = set; - fuser->refcount = 1; - - MODULE_CONTEXT_SET(user, fts_user_module, fuser); return 0; } -void fts_mail_user_deinit(struct mail_user *user) +static void fts_mail_user_deinit(struct mail_user *user) { - struct fts_user *fuser = FTS_USER_CONTEXT(user); + struct fts_user *fuser = FTS_USER_CONTEXT_REQUIRE(user); - if (fuser != NULL) { - i_assert(fuser->refcount > 0); - if (--fuser->refcount == 0) { - settings_free(fuser->set); - lang_user_deinit(user); - } - } + settings_free(fuser->set); + lang_user_deinit(user); + fuser->module_ctx.super.deinit(user); +} + +void fts_mail_user_created(struct mail_user *user) +{ + struct mail_user_vfuncs *v = user->vlast; + struct fts_user *fuser; + + fuser = p_new(user->pool, struct fts_user, 1); + fuser->module_ctx.super = *v; + user->vlast = &fuser->module_ctx.super; + v->deinit = fts_mail_user_deinit; + MODULE_CONTEXT_SET(user, fts_user_module, fuser); } diff --git a/src/plugins/fts/fts-user.h b/src/plugins/fts/fts-user.h index 2bede4369d..94681bca01 100644 --- a/src/plugins/fts/fts-user.h +++ b/src/plugins/fts/fts-user.h @@ -9,6 +9,6 @@ size_t fts_mail_user_message_max_size(struct mail_user *user); int fts_mail_user_init(struct mail_user *user, bool initialize_libfts, const char **error_r); -void fts_mail_user_deinit(struct mail_user *user); +void fts_mail_user_created(struct mail_user *user); #endif -- 2.47.3