From: Timo Sirainen Date: Tue, 19 Mar 2024 20:14:21 +0000 (+0200) Subject: fts: Avoid reference counting struct fts_user X-Git-Tag: 2.4.1~903 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cfb947a4bc43208d2b9e54bfaae96d52290f190;p=thirdparty%2Fdovecot%2Fcore.git fts: Avoid reference counting struct fts_user This is needed by the following changes. --- 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