]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Added fs_switch_ioloop()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 13 Jun 2016 14:11:28 +0000 (17:11 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 14 Jun 2016 09:33:46 +0000 (12:33 +0300)
src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c
src/lib-fs/fs-api.h
src/lib-fs/fs-dict.c
src/lib-fs/fs-metawrap.c
src/lib-fs/fs-posix.c
src/lib-fs/fs-randomfail.c
src/lib-fs/fs-sis-queue.c
src/lib-fs/fs-sis.c
src/lib-fs/fs-test.c
src/plugins/fs-compress/fs-compress.c

index 4b480adb3617cd30fcfa5399f1b84e7c8ae82812..fa5168b575a452fdf014de5cdd870cecc977d0e5 100644 (file)
@@ -66,6 +66,8 @@ struct fs_vfuncs {
                                     enum fs_iter_flags flags);
        const char *(*iter_next)(struct fs_iter *iter);
        int (*iter_deinit)(struct fs_iter *iter);
+
+       bool (*switch_ioloop)(struct fs *fs);
 };
 
 struct fs {
index 024cec4ad62ca15bf0bccb560e6779447c8a471c..dc892d2014f577dfadfadf1325db4638633a908a 100644 (file)
@@ -737,6 +737,20 @@ int fs_wait_async(struct fs *fs)
        return ret;
 }
 
+bool fs_switch_ioloop(struct fs *fs)
+{
+       bool ret = FALSE;
+
+       if (fs->v.switch_ioloop != NULL) {
+               T_BEGIN {
+                       ret = fs->v.switch_ioloop(fs);
+               } T_END;
+       } else if (fs->parent != NULL) {
+               ret = fs_switch_ioloop(fs->parent);
+       }
+       return ret;
+}
+
 int fs_lock(struct fs_file *file, unsigned int secs, struct fs_lock **lock_r)
 {
        int ret;
index d5702533f876a87f334f93f3b94b06fc65eb6622..2f8da389cc84c8818d69503ef7fa765055e2061c 100644 (file)
@@ -288,6 +288,10 @@ void fs_file_set_async_callback(struct fs_file *file,
    It's an error to call this when there are no pending async operations.
    Returns 0 if ok, -1 if timed out. */
 int fs_wait_async(struct fs *fs);
+/* Switch the fs to the current ioloop. This can be used to do fs_wait_async()
+   among other IO work. Returns TRUE if there is actually some work that can
+   be waited on. */
+bool fs_switch_ioloop(struct fs *fs) ATTR_NOWARN_UNUSED_RESULT;
 
 /* Returns 1 if file exists, 0 if not, -1 if error occurred. */
 int fs_exists(struct fs_file *file);
index 270495029889039298edb6f99c9568de97459044..5efd33abb65af68a39253744a6699a45e4d959c7 100644 (file)
@@ -318,6 +318,7 @@ const struct fs fs_class_dict = {
                fs_dict_delete,
                fs_dict_iter_init,
                fs_dict_iter_next,
-               fs_dict_iter_deinit
+               fs_dict_iter_deinit,
+               NULL
        }
 };
index c4887d75c256ef59611fc4ac52085dd68ca16ca6..85b2f059a0357c54e00f2bd36705295ce0619bf0 100644 (file)
@@ -613,6 +613,7 @@ const struct fs fs_class_metawrap = {
                fs_metawrap_delete,
                fs_metawrap_iter_init,
                fs_metawrap_iter_next,
-               fs_metawrap_iter_deinit
+               fs_metawrap_iter_deinit,
+               NULL
        }
 };
index ddd9ccb6871195f0771a98a912380b7f4f27f986..de9f43ead75121a945de270421100ee93272337f 100644 (file)
@@ -873,6 +873,7 @@ const struct fs fs_class_posix = {
                fs_posix_delete,
                fs_posix_iter_init,
                fs_posix_iter_next,
-               fs_posix_iter_deinit
+               fs_posix_iter_deinit,
+               NULL
        }
 };
index 3a397dec996929f8031bcbfbe69c3b150474f997..ff4e80f76ee10a9d416610c3fd5cb90534a9dd2d 100644 (file)
@@ -567,6 +567,7 @@ const struct fs fs_class_randomfail = {
                fs_randomfail_delete,
                fs_randomfail_iter_init,
                fs_randomfail_iter_next,
-               fs_randomfail_iter_deinit
+               fs_randomfail_iter_deinit,
+               NULL
        }
 };
index fe970d847044e2ba68b59d61d49a436a1bfefdc2..eaefb50e0babe92ca77992dc95d39c2357a87323 100644 (file)
@@ -376,6 +376,7 @@ const struct fs fs_class_sis_queue = {
                fs_sis_queue_delete,
                fs_sis_queue_iter_init,
                NULL,
+               NULL,
                NULL
        }
 };
index 8c705f171cfbb64fbe52e3a3452ae8a51875b061..98ccf96b16b1a82578251ff0d564f304e9227189 100644 (file)
@@ -513,6 +513,7 @@ const struct fs fs_class_sis = {
                fs_sis_delete,
                fs_sis_iter_init,
                NULL,
+               NULL,
                NULL
        }
 };
index e0627797df91d9fb855939d42f6bcc2127070293..b3c53a65f950c3b12b213e44a326331ec15903d0 100644 (file)
@@ -417,6 +417,7 @@ const struct fs fs_class_test = {
                fs_test_delete,
                fs_test_iter_init,
                fs_test_iter_next,
-               fs_test_iter_deinit
+               fs_test_iter_deinit,
+               NULL
        }
 };
index 4088c58db7fd2ae4a684cb2a24a43d092407fd1b..81dfb8c66f8a95ed4a17f04ce941c894931ee0dd 100644 (file)
@@ -413,6 +413,7 @@ const struct fs fs_class_compress = {
                fs_compress_delete,
                fs_compress_iter_init,
                fs_compress_iter_next,
-               fs_compress_iter_deinit
+               fs_compress_iter_deinit,
+               NULL
        }
 };