]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Avoid reference counting struct fts_user
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 19 Mar 2024 20:14:21 +0000 (22:14 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
This is needed by the following changes.

src/plugins/fts-flatcurve/fts-flatcurve-plugin.c
src/plugins/fts-solr/fts-solr-plugin.c
src/plugins/fts/fts-plugin.c
src/plugins/fts/fts-user.c
src/plugins/fts/fts-user.h

index 72563803338bd66634240cabe61c97cfa6d64877..f9078929bc1849d5b0e910e51c5ceaa04f0987c9 100644 (file)
@@ -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);
 }
index e281ab5a1424a9b91d6be1dbb69b24e1973deee9..01b722212417b737934a4cac86f4d5630860ddf9 100644 (file)
@@ -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);
 }
index 1a1b97209a602a9be73dc5212b60b361263b156e..593421b78c354fa416643e13a0d0305cf8e87886 100644 (file)
@@ -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,
index 1f687d6e0b95b6e3eeafde33b39d0665c8892e29..c855b29afb131e4444a101e38e6358831f0a346a 100644 (file)
@@ -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);
 }
index 2bede4369dc951b65cc639d0a3aff861c6d6c0c2..94681bca01b3d6f621c781892c31d65596d8ba09 100644 (file)
@@ -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