]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: add a mail user pre-deinit vfunc
authorJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Fri, 12 May 2017 09:44:27 +0000 (12:44 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Thu, 18 May 2017 06:53:59 +0000 (09:53 +0300)
This allows plugins to perform checks right before the deinit call.

src/lib-storage/mail-user.c
src/lib-storage/mail-user.h

index 51d3cab82862d8d8859eba8e02ba191c79bd31ef..0c7bdfd904d9ef133fdd07f89c888b39e9970ad8 100644 (file)
@@ -40,6 +40,10 @@ static void mail_user_deinit_base(struct mail_user *user)
                mail_storage_service_user_unref(&user->_service_user);
 }
 
+static void mail_user_deinit_pre_base(struct mail_user *user ATTR_UNUSED)
+{
+}
+
 static void mail_user_stats_fill_base(struct mail_user *user ATTR_UNUSED,
                                      struct stats *stats ATTR_UNUSED)
 {
@@ -73,6 +77,7 @@ mail_user_alloc_int(const char *username,
                i_panic("Settings check unexpectedly failed: %s", error);
 
        user->v.deinit = mail_user_deinit_base;
+       user->v.deinit_pre = mail_user_deinit_pre_base;
        user->v.stats_fill = mail_user_stats_fill_base;
        p_array_init(&user->module_contexts, user->pool, 5);
        return user;
@@ -191,8 +196,9 @@ void mail_user_unref(struct mail_user **_user)
 
        user->deinitializing = TRUE;
 
-       /* call deinit() with refcount=1, otherwise we may assert-crash in
-          mail_user_ref() that is called by some deinit() handler. */
+       /* call deinit() and deinit_pre() with refcount=1, otherwise we may
+          assert-crash in mail_user_ref() that is called by some handlers. */
+       user->v.deinit_pre(user);
        user->v.deinit(user);
        i_assert(user->refcount == 1);
        pool_unref(&user->pool);
index 81b31c78b8f0eebf0c66fdf1f6cd98a9aaf38665..08738ffb47f3690bfa55486996b4ba6f4ae48021 100644 (file)
@@ -12,6 +12,7 @@ struct mail_user;
 
 struct mail_user_vfuncs {
        void (*deinit)(struct mail_user *user);
+       void (*deinit_pre)(struct mail_user *user);
        void (*stats_fill)(struct mail_user *user, struct stats *stats);
 };