242 lines
7.6 KiB
Diff
242 lines
7.6 KiB
Diff
From 3889e4dec938a8023b8120545d4b53083b209dab Mon Sep 17 00:00:00 2001
|
|
From: Ondrej Holy <oholy@redhat.com>
|
|
Date: Thu, 19 Jan 2023 12:12:52 +0100
|
|
Subject: [PATCH] trash: Run blocking methods on a thread pool
|
|
|
|
All jobs use `_try` methods currently. This is wrong as most of them can
|
|
block. This works quite ok except the case of stale NFS mounts that can
|
|
block the main loop forever. Let's run the jobs on a thread pool instead.
|
|
This reverts commit 01fe5a61 except for the `create_dir_monitor` and
|
|
`create_file_monitor` methods in order to avoid issues like
|
|
https://bugzilla.gnome.org/show_bug.cgi?id=723305.
|
|
---
|
|
daemon/gvfsbackendtrash.c | 68 ++++++++++++++-------------------------
|
|
1 file changed, 25 insertions(+), 43 deletions(-)
|
|
|
|
diff --git a/daemon/gvfsbackendtrash.c b/daemon/gvfsbackendtrash.c
|
|
index 76c9e006..b4d3d089 100644
|
|
--- a/daemon/gvfsbackendtrash.c
|
|
+++ b/daemon/gvfsbackendtrash.c
|
|
@@ -227,7 +227,7 @@ trash_backend_get_file (GVfsBackendTrash *backend,
|
|
}
|
|
|
|
/* ======================= method implementations ======================= */
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_open_for_read (GVfsBackend *vfs_backend,
|
|
GVfsJobOpenForRead *job,
|
|
const char *filename)
|
|
@@ -261,18 +261,16 @@ trash_backend_open_for_read (GVfsBackend *vfs_backend,
|
|
g_vfs_job_open_for_read_set_can_seek (job, TRUE);
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
}
|
|
}
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_read (GVfsBackend *backend,
|
|
GVfsJobRead *job,
|
|
GVfsBackendHandle handle,
|
|
@@ -290,16 +288,14 @@ trash_backend_read (GVfsBackend *backend,
|
|
g_vfs_job_read_set_size (job, bytes);
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_seek_on_read (GVfsBackend *backend,
|
|
GVfsJobSeekRead *job,
|
|
GVfsBackendHandle handle,
|
|
@@ -313,13 +309,11 @@ trash_backend_seek_on_read (GVfsBackend *backend,
|
|
g_vfs_job_seek_read_set_offset (job, g_seekable_tell (handle));
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
static void
|
|
@@ -349,7 +343,7 @@ trash_backend_query_info_on_read (GVfsBackend *backend,
|
|
}
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_close_read (GVfsBackend *backend,
|
|
GVfsJobCloseRead *job,
|
|
GVfsBackendHandle handle)
|
|
@@ -361,15 +355,13 @@ trash_backend_close_read (GVfsBackend *backend,
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
g_object_unref (handle);
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
|
|
g_object_unref (handle);
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
@@ -394,7 +386,7 @@ trash_backend_schedule_thaw (GVfsBackendTrash *backend)
|
|
backend);
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_delete (GVfsBackend *vfs_backend,
|
|
GVfsJobDelete *job,
|
|
const char *filename)
|
|
@@ -435,7 +427,7 @@ trash_backend_delete (GVfsBackend *vfs_backend,
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
trash_item_unref (item);
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
@@ -445,11 +437,9 @@ trash_backend_delete (GVfsBackend *vfs_backend,
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_pull (GVfsBackend *vfs_backend,
|
|
GVfsJobPull *job,
|
|
const gchar *source,
|
|
@@ -505,7 +495,7 @@ trash_backend_pull (GVfsBackend *vfs_backend,
|
|
trash_item_unref (item);
|
|
g_object_unref (real);
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
@@ -517,8 +507,6 @@ trash_backend_pull (GVfsBackend *vfs_backend,
|
|
|
|
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
|
|
g_error_free (error);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
static void
|
|
@@ -676,7 +664,7 @@ trash_backend_enumerate_non_root (GVfsBackendTrash *backend,
|
|
g_error_free (error);
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_enumerate (GVfsBackend *vfs_backend,
|
|
GVfsJobEnumerate *job,
|
|
const char *filename,
|
|
@@ -694,11 +682,9 @@ trash_backend_enumerate (GVfsBackend *vfs_backend,
|
|
attribute_matcher, flags);
|
|
else
|
|
trash_backend_enumerate_root (backend, job, attribute_matcher, flags);
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_mount (GVfsBackend *vfs_backend,
|
|
GVfsJobMount *job,
|
|
GMountSpec *mount_spec,
|
|
@@ -716,11 +702,9 @@ trash_backend_mount (GVfsBackend *vfs_backend,
|
|
backend->watcher = trash_watcher_new (backend->root);
|
|
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
+static void
|
|
trash_backend_query_info (GVfsBackend *vfs_backend,
|
|
GVfsJobQueryInfo *job,
|
|
const char *filename,
|
|
@@ -764,7 +748,7 @@ trash_backend_query_info (GVfsBackend *vfs_backend,
|
|
trash_item_unref (item);
|
|
g_object_unref (real_info);
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
|
|
trash_item_unref (item);
|
|
@@ -798,8 +782,6 @@ trash_backend_query_info (GVfsBackend *vfs_backend,
|
|
|
|
g_vfs_job_succeeded (G_VFS_JOB (job));
|
|
}
|
|
-
|
|
- return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
@@ -926,17 +908,17 @@ g_vfs_backend_trash_class_init (GVfsBackendTrashClass *class)
|
|
|
|
gobject_class->finalize = trash_backend_finalize;
|
|
|
|
- backend_class->try_mount = trash_backend_mount;
|
|
- backend_class->try_open_for_read = trash_backend_open_for_read;
|
|
- backend_class->try_read = trash_backend_read;
|
|
- backend_class->try_seek_on_read = trash_backend_seek_on_read;
|
|
+ backend_class->mount = trash_backend_mount;
|
|
+ backend_class->open_for_read = trash_backend_open_for_read;
|
|
+ backend_class->read = trash_backend_read;
|
|
+ backend_class->seek_on_read = trash_backend_seek_on_read;
|
|
backend_class->query_info_on_read = trash_backend_query_info_on_read;
|
|
- backend_class->try_close_read = trash_backend_close_read;
|
|
- backend_class->try_query_info = trash_backend_query_info;
|
|
+ backend_class->close_read = trash_backend_close_read;
|
|
+ backend_class->query_info = trash_backend_query_info;
|
|
backend_class->try_query_fs_info = trash_backend_query_fs_info;
|
|
- backend_class->try_enumerate = trash_backend_enumerate;
|
|
- backend_class->try_delete = trash_backend_delete;
|
|
- backend_class->try_pull = trash_backend_pull;
|
|
+ backend_class->enumerate = trash_backend_enumerate;
|
|
+ backend_class->delete = trash_backend_delete;
|
|
+ backend_class->pull = trash_backend_pull;
|
|
backend_class->try_create_dir_monitor = trash_backend_create_dir_monitor;
|
|
backend_class->try_create_file_monitor = trash_backend_create_file_monitor;
|
|
}
|
|
--
|
|
2.53.0
|
|
|