]> 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>
Mon, 13 Jun 2016 14:35:44 +0000 (17:35 +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 8172b1ac760f5d35f3c38330b4cad25665babdf3..4d714ecefa33edaf2debb9449874f7e99090bbc6 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 83ba17b3d649f05d9177b14a3d428406db622723..2fd4deca69c63e78e0d35ca982bccbc857286050 100644 (file)
@@ -746,6 +746,20 @@ void fs_wait_async(struct fs *fs)
        } T_END;
 }
 
+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 c041364fb14cdb1ec6b48ed79a3260abf73e8df9..ddd5b92d6fe9bf4c355a3f2445b342a690e75718 100644 (file)
@@ -287,6 +287,10 @@ void fs_file_set_async_callback(struct fs_file *file,
 /* Wait until some file can be read/written to more before returning.
    It's an error to call this when there are no pending async operations. */
 void 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 4f0fdc389b58ea9ac3da64f30e6c4dbe985d5a8c..3b0ba32ea5f7e676dd7738a1aae4a367b5dc0f44 100644 (file)
@@ -322,6 +322,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 9071e1fa3158d31a249ee5ab95db774655b0d987..20e6134a8f5b0da8a12a2d3aac58a3ece8511c7b 100644 (file)
@@ -597,6 +597,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 b690c27b992ce338af2e9211ac7b0f917d02cb46..25f88c89b1c27545485bcce241ac8c817852cbb1 100644 (file)
@@ -869,6 +869,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 0182f408f9f78c9da7f59b7a3cfc572f87815288..e133bad3f8b5e899179ac248a0596cb65cfcf43c 100644 (file)
@@ -565,6 +565,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 37ae17268144c720ffac4a898802e605c75aa5fc..0032682ef81885226064fc9c5cf1dc60678d6b1a 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 682899b95dbb1796434c3168bae4098b8c870889..c3fe4618a70b2ad02a6cafba55675ca137ff80f4 100644 (file)
@@ -513,6 +513,7 @@ const struct fs fs_class_sis = {
                fs_sis_delete,
                fs_sis_iter_init,
                NULL,
+               NULL,
                NULL
        }
 };
index 66d46421b07b474220dd04bde59f4292777cb246..d35caf5366413efb7d2d6ed7be1d5510114eccb9 100644 (file)
@@ -416,6 +416,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 bf71746717365533a2dec8af49c68c84b82c6cb6..be146728ad1d000146364805974cbba6c11acf6b 100644 (file)
@@ -399,6 +399,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
        }
 };