summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gvfsbackend.c86
-rw-r--r--daemon/gvfsbackend.h112
-rw-r--r--daemon/gvfsbackendsmb.c214
-rw-r--r--daemon/gvfsbackendtest.c50
-rw-r--r--daemon/gvfsdaemon.c102
-rw-r--r--daemon/gvfsjob.c13
-rw-r--r--daemon/gvfsjob.h6
-rw-r--r--daemon/gvfsjobcloseread.c31
-rw-r--r--daemon/gvfsjobenumerate.c38
-rw-r--r--daemon/gvfsjobgetinfo.c38
-rw-r--r--daemon/gvfsjobopenforread.c30
-rw-r--r--daemon/gvfsjobread.c38
-rw-r--r--daemon/gvfsjobseekread.c37
13 files changed, 290 insertions, 505 deletions
diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c
index f2263368..a76e292b 100644
--- a/daemon/gvfsbackend.c
+++ b/daemon/gvfsbackend.c
@@ -183,92 +183,6 @@ g_vfs_backend_constructor (GType type,
return object;
}
-gboolean
-g_vfs_backend_open_for_read (GVfsBackend *backend,
- GVfsJobOpenForRead *job,
- char *filename)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->open_for_read (backend, job, filename);
-}
-
-gboolean
-g_vfs_backend_close_read (GVfsBackend *backend,
- GVfsJobCloseRead *job,
- GVfsBackendHandle handle)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->close_read (backend, job, handle);
-}
-
-gboolean
-g_vfs_backend_read (GVfsBackend *backend,
- GVfsJobRead *job,
- GVfsBackendHandle handle,
- char *buffer,
- gsize bytes_requested)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->read (backend, job, handle,
- buffer, bytes_requested);
-}
-
-gboolean
-g_vfs_backend_seek_on_read (GVfsBackend *backend,
- GVfsJobSeekRead *job,
- GVfsBackendHandle handle,
- goffset offset,
- GSeekType type)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->seek_on_read (backend, job, handle,
- offset, type);
-}
-
-gboolean
-g_vfs_backend_get_info (GVfsBackend *backend,
- GVfsJobGetInfo *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->get_info (backend, job, filename, requested,
- attributes, follow_symlinks);
-}
-
-gboolean
-g_vfs_backend_enumerate (GVfsBackend *backend,
- GVfsJobEnumerate *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks)
-{
- GVfsBackendClass *class;
-
- class = G_VFS_BACKEND_GET_CLASS (backend);
-
- return class->enumerate (backend, job, filename, requested,
- attributes, follow_symlinks);
-}
-
static DBusHandlerResult
backend_dbus_handler (DBusConnection *connection,
DBusMessage *message,
diff --git a/daemon/gvfsbackend.h b/daemon/gvfsbackend.h
index 6631e91b..768598be 100644
--- a/daemon/gvfsbackend.h
+++ b/daemon/gvfsbackend.h
@@ -49,66 +49,66 @@ struct _GVfsBackendClass
* A NULL here means operation not supported
*/
- gboolean (*open_for_read) (GVfsBackend *backend,
- GVfsJobOpenForRead *job,
- char *filename);
- gboolean (*close_read) (GVfsBackend *backend,
- GVfsJobCloseRead *job,
- GVfsBackendHandle handle);
- gboolean (*read) (GVfsBackend *backend,
- GVfsJobRead *job,
- GVfsBackendHandle handle,
- char *buffer,
- gsize bytes_requested);
- gboolean (*seek_on_read) (GVfsBackend *backend,
- GVfsJobSeekRead *job,
- GVfsBackendHandle handle,
- goffset offset,
- GSeekType type);
- gboolean (*get_info) (GVfsBackend *backend,
- GVfsJobGetInfo *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks);
- gboolean (*enumerate) (GVfsBackend *backend,
- GVfsJobEnumerate *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks);
+ void (*open_for_read) (GVfsBackend *backend,
+ GVfsJobOpenForRead *job,
+ char *filename);
+ gboolean (*try_open_for_read) (GVfsBackend *backend,
+ GVfsJobOpenForRead *job,
+ char *filename);
+ void (*close_read) (GVfsBackend *backend,
+ GVfsJobCloseRead *job,
+ GVfsBackendHandle handle);
+ gboolean (*try_close_read) (GVfsBackend *backend,
+ GVfsJobCloseRead *job,
+ GVfsBackendHandle handle);
+ void (*read) (GVfsBackend *backend,
+ GVfsJobRead *job,
+ GVfsBackendHandle handle,
+ char *buffer,
+ gsize bytes_requested);
+ gboolean (*try_read) (GVfsBackend *backend,
+ GVfsJobRead *job,
+ GVfsBackendHandle handle,
+ char *buffer,
+ gsize bytes_requested);
+ void (*seek_on_read) (GVfsBackend *backend,
+ GVfsJobSeekRead *job,
+ GVfsBackendHandle handle,
+ goffset offset,
+ GSeekType type);
+ gboolean (*try_seek_on_read) (GVfsBackend *backend,
+ GVfsJobSeekRead *job,
+ GVfsBackendHandle handle,
+ goffset offset,
+ GSeekType type);
+ void (*get_info) (GVfsBackend *backend,
+ GVfsJobGetInfo *job,
+ char *filename,
+ GFileInfoRequestFlags requested,
+ const char *attributes,
+ gboolean follow_symlinks);
+ gboolean (*try_get_info) (GVfsBackend *backend,
+ GVfsJobGetInfo *job,
+ char *filename,
+ GFileInfoRequestFlags requested,
+ const char *attributes,
+ gboolean follow_symlinks);
+ void (*enumerate) (GVfsBackend *backend,
+ GVfsJobEnumerate *job,
+ char *filename,
+ GFileInfoRequestFlags requested,
+ const char *attributes,
+ gboolean follow_symlinks);
+ gboolean (*try_enumerate) (GVfsBackend *backend,
+ GVfsJobEnumerate *job,
+ char *filename,
+ GFileInfoRequestFlags requested,
+ const char *attributes,
+ gboolean follow_symlinks);
};
GType g_vfs_backend_get_type (void) G_GNUC_CONST;
-gboolean g_vfs_backend_open_for_read (GVfsBackend *backend,
- GVfsJobOpenForRead *job,
- char *filename);
-gboolean g_vfs_backend_close_read (GVfsBackend *backend,
- GVfsJobCloseRead *job,
- GVfsBackendHandle handle);
-gboolean g_vfs_backend_read (GVfsBackend *backend,
- GVfsJobRead *job,
- GVfsBackendHandle handle,
- char *buffer,
- gsize bytes_requested);
-gboolean g_vfs_backend_seek_on_read (GVfsBackend *backend,
- GVfsJobSeekRead *job,
- GVfsBackendHandle handle,
- goffset offset,
- GSeekType type);
-gboolean g_vfs_backend_get_info (GVfsBackend *backend,
- GVfsJobGetInfo *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks);
-gboolean g_vfs_backend_enumerate (GVfsBackend *backend,
- GVfsJobEnumerate *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks);
void g_vfs_backend_register_with_daemon (GVfsBackend *backend,
GVfsDaemon *daemon);
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
index d284b8b7..475da2de 100644
--- a/daemon/gvfsbackendsmb.c
+++ b/daemon/gvfsbackendsmb.c
@@ -297,195 +297,39 @@ g_vfs_backend_smb_new (const char *server,
return backend;
}
-static gboolean
-open_idle_cb (gpointer data)
-{
- GVfsJobOpenForRead *job = data;
- int fd;
-
- if (g_vfs_job_is_cancelled (G_VFS_JOB (job)))
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_VFS_ERROR,
- G_VFS_ERROR_CANCELLED,
- _("Operation was cancelled"));
- return FALSE;
- }
-
- fd = g_open (job->filename, O_RDONLY);
- if (fd == -1)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "Error opening file %s: %s",
- job->filename, g_strerror (errno));
- }
- else
- {
- g_vfs_job_open_for_read_set_can_seek (job, TRUE);
- g_vfs_job_open_for_read_set_handle (job, GINT_TO_POINTER (fd));
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- return FALSE;
-}
-
-static void
-open_read_cancelled_cb (GVfsJob *job, gpointer data)
-{
- guint tag = GPOINTER_TO_INT (data);
-
- g_print ("open_read_cancelled_cb\n");
-
- if (g_source_remove (tag))
- g_vfs_job_failed (job, G_VFS_ERROR,
- G_VFS_ERROR_CANCELLED,
- _("Operation was cancelled"));
-}
-
-static gboolean
+static void
do_open_for_read (GVfsBackend *backend,
GVfsJobOpenForRead *job,
char *filename)
{
- GError *error;
-
- g_print ("open_for_read (%s)\n", filename);
-
- if (strcmp (filename, "/fail") == 0)
- {
- error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_IO, "Smb error");
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- return TRUE;
- }
- else
- {
- guint tag = g_timeout_add (0, open_idle_cb, job);
- g_signal_connect (job, "cancelled", (GCallback)open_read_cancelled_cb, GINT_TO_POINTER (tag));
- return TRUE;
- }
-}
-
-static gboolean
-read_idle_cb (gpointer data)
-{
- GVfsJobRead *job = data;
- int fd;
- ssize_t res;
-
- fd = GPOINTER_TO_INT (job->handle);
-
- res = read (fd, job->buffer, job->bytes_requested);
-
- if (res == -1)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "Error reading from file: %s",
- g_strerror (errno));
- }
- else
- {
- g_vfs_job_read_set_size (job, res);
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
-
- return FALSE;
}
static void
-read_cancelled_cb (GVfsJob *job, gpointer data)
-{
- guint tag = GPOINTER_TO_INT (job->backend_data);
-
- g_source_remove (tag);
- g_vfs_job_failed (job, G_VFS_ERROR,
- G_VFS_ERROR_CANCELLED,
- _("Operation was cancelled"));
-}
-
-static gboolean
do_read (GVfsBackend *backend,
GVfsJobRead *job,
GVfsBackendHandle handle,
char *buffer,
gsize bytes_requested)
{
- guint tag;
-
- g_print ("read (%d)\n", bytes_requested);
-
- tag = g_timeout_add (0, read_idle_cb, job);
- G_VFS_JOB (job)->backend_data = GINT_TO_POINTER (tag);
- g_signal_connect (job, "cancelled", (GCallback)read_cancelled_cb, NULL);
-
- return TRUE;
}
-static gboolean
+static void
do_seek_on_read (GVfsBackend *backend,
GVfsJobSeekRead *job,
GVfsBackendHandle handle,
goffset offset,
GSeekType type)
{
- int whence;
- int fd;
- off_t final_offset;
-
- g_print ("seek_on_read (%d, %d)\n", (int)offset, type);
-
- switch (type)
- {
- default:
- case G_SEEK_SET:
- whence = SEEK_SET;
- break;
- case G_SEEK_CUR:
- whence = SEEK_CUR;
- break;
- case G_SEEK_END:
- whence = SEEK_END;
- break;
- }
-
-
- fd = GPOINTER_TO_INT (handle);
-
- final_offset = lseek (fd, offset, whence);
-
- if (final_offset == (off_t)-1)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "Error seeking in file: %s",
- g_strerror (errno));
- }
- else
- {
- g_vfs_job_seek_read_set_offset (job, offset);
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
-
- return TRUE;
}
-static gboolean
+static void
do_close_read (GVfsBackend *backend,
GVfsJobCloseRead *job,
GVfsBackendHandle handle)
{
- int fd;
-
- g_print ("close ()\n");
-
- fd = GPOINTER_TO_INT (handle);
- close(fd);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
}
-static gboolean
+static void
do_get_info (GVfsBackend *backend,
GVfsJobGetInfo *job,
char *filename,
@@ -493,31 +337,9 @@ do_get_info (GVfsBackend *backend,
const char *attributes,
gboolean follow_symlinks)
{
- GFile *file;
- GFileInfo *info;
- GError *error;
-
- file = g_file_local_new (filename);
-
- error = NULL;
- info = g_file_get_info (file, requested, attributes, follow_symlinks,
- NULL, &error);
-
- if (info)
- {
- g_vfs_job_get_info_set_info (job, requested, info);
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- else
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
-
- g_object_unref (info);
- g_object_unref (file);
-
- return TRUE;
}
-static gboolean
+static void
do_enumerate (GVfsBackend *backend,
GVfsJobEnumerate *job,
char *filename,
@@ -525,32 +347,6 @@ do_enumerate (GVfsBackend *backend,
const char *attributes,
gboolean follow_symlinks)
{
- GFileInfo *info1, *info2;;
- GList *l;
-
- g_vfs_job_enumerate_set_result (job, requested);
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- info1 = g_file_info_new ();
- info2 = g_file_info_new ();
- g_file_info_set_name (info1, "file1");
- g_file_info_set_file_type (info1, G_FILE_TYPE_REGULAR);
- g_file_info_set_name (info2, "file2");
- g_file_info_set_file_type (info2, G_FILE_TYPE_REGULAR);
-
- l = NULL;
- l = g_list_append (l, info1);
- l = g_list_append (l, info2);
-
- g_vfs_job_enumerate_add_info (job, l);
-
- g_list_free (l);
- g_object_unref (info1);
- g_object_unref (info2);
-
- g_vfs_job_enumerate_done (job);
-
- return TRUE;
}
static void
diff --git a/daemon/gvfsbackendtest.c b/daemon/gvfsbackendtest.c
index b95d2096..74094009 100644
--- a/daemon/gvfsbackendtest.c
+++ b/daemon/gvfsbackendtest.c
@@ -95,9 +95,9 @@ open_read_cancelled_cb (GVfsJob *job, gpointer data)
}
static gboolean
-do_open_for_read (GVfsBackend *backend,
- GVfsJobOpenForRead *job,
- char *filename)
+try_open_for_read (GVfsBackend *backend,
+ GVfsJobOpenForRead *job,
+ char *filename)
{
GError *error;
@@ -107,14 +107,14 @@ do_open_for_read (GVfsBackend *backend,
{
error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_IO, "Test error");
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- return TRUE;
}
else
{
guint tag = g_timeout_add (0, open_idle_cb, job);
g_signal_connect (job, "cancelled", (GCallback)open_read_cancelled_cb, GINT_TO_POINTER (tag));
- return TRUE;
}
+
+ return TRUE;
}
static gboolean
@@ -156,11 +156,11 @@ read_cancelled_cb (GVfsJob *job, gpointer data)
}
static gboolean
-do_read (GVfsBackend *backend,
- GVfsJobRead *job,
- GVfsBackendHandle handle,
- char *buffer,
- gsize bytes_requested)
+try_read (GVfsBackend *backend,
+ GVfsJobRead *job,
+ GVfsBackendHandle handle,
+ char *buffer,
+ gsize bytes_requested)
{
guint tag;
@@ -173,7 +173,7 @@ do_read (GVfsBackend *backend,
return TRUE;
}
-static gboolean
+static void
do_seek_on_read (GVfsBackend *backend,
GVfsJobSeekRead *job,
GVfsBackendHandle handle,
@@ -217,11 +217,9 @@ do_seek_on_read (GVfsBackend *backend,
g_vfs_job_seek_read_set_offset (job, offset);
g_vfs_job_succeeded (G_VFS_JOB (job));
}
-
- return TRUE;
}
-static gboolean
+static void
do_close_read (GVfsBackend *backend,
GVfsJobCloseRead *job,
GVfsBackendHandle handle)
@@ -234,11 +232,9 @@ do_close_read (GVfsBackend *backend,
close(fd);
g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
}
-static gboolean
+static void
do_get_info (GVfsBackend *backend,
GVfsJobGetInfo *job,
char *filename,
@@ -266,17 +262,15 @@ do_get_info (GVfsBackend *backend,
g_object_unref (info);
g_object_unref (file);
-
- return TRUE;
}
static gboolean
-do_enumerate (GVfsBackend *backend,
- GVfsJobEnumerate *job,
- char *filename,
- GFileInfoRequestFlags requested,
- const char *attributes,
- gboolean follow_symlinks)
+try_enumerate (GVfsBackend *backend,
+ GVfsJobEnumerate *job,
+ char *filename,
+ GFileInfoRequestFlags requested,
+ const char *attributes,
+ gboolean follow_symlinks)
{
GFileInfo *info1, *info2;;
GList *l;
@@ -314,10 +308,10 @@ g_vfs_backend_test_class_init (GVfsBackendTestClass *klass)
gobject_class->finalize = g_vfs_backend_test_finalize;
- backend_class->open_for_read = do_open_for_read;
- backend_class->read = do_read;
+ backend_class->try_open_for_read = try_open_for_read;
+ backend_class->try_read = try_read;
backend_class->seek_on_read = do_seek_on_read;
backend_class->close_read = do_close_read;
backend_class->get_info = do_get_info;
- backend_class->enumerate = do_enumerate;
+ backend_class->try_enumerate = try_enumerate;
}
diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c
index f3ab7853..a80431a0 100644
--- a/daemon/gvfsdaemon.c
+++ b/daemon/gvfsdaemon.c
@@ -32,12 +32,10 @@ struct _GVfsDaemonPrivate
GMutex *lock;
gboolean main_daemon;
+ GThreadPool *thread_pool;
DBusConnection *session_bus;
GHashTable *registered_paths;
- GQueue *new_pending_jobs;
- GQueue *pending_jobs; /* Only accessed from main thread */
- GQueue *jobs;
- guint queued_job_start;
+ GList *jobs;
GList *job_sources;
};
@@ -82,11 +80,7 @@ g_vfs_daemon_finalize (GObject *object)
daemon = G_VFS_DAEMON (object);
- g_assert (daemon->priv->jobs->head == NULL);
- g_assert (daemon->priv->pending_jobs->head == NULL);
- g_queue_free (daemon->priv->jobs);
- g_queue_free (daemon->priv->pending_jobs);
- g_queue_free (daemon->priv->new_pending_jobs);
+ g_assert (daemon->priv->jobs == NULL);
g_hash_table_destroy (daemon->priv->registered_paths);
g_mutex_free (daemon->priv->lock);
@@ -108,16 +102,32 @@ g_vfs_daemon_class_init (GVfsDaemonClass *klass)
}
static void
+job_handler_callback (gpointer data,
+ gpointer user_data)
+{
+ GVfsJob *job = G_VFS_JOB (data);
+
+ g_vfs_job_run (job);
+}
+
+static void
g_vfs_daemon_init (GVfsDaemon *daemon)
{
+ gint max_threads = 1; /* TODO: handle max threads */
+
daemon->priv = G_TYPE_INSTANCE_GET_PRIVATE (daemon,
G_TYPE_VFS_DAEMON,
GVfsDaemonPrivate);
daemon->priv->lock = g_mutex_new ();
daemon->priv->session_bus = dbus_bus_get (DBUS_BUS_SESSION, NULL);
- daemon->priv->jobs = g_queue_new ();
- daemon->priv->pending_jobs = g_queue_new ();
- daemon->priv->new_pending_jobs = g_queue_new ();
+ daemon->priv->thread_pool = g_thread_pool_new (job_handler_callback,
+ daemon,
+ max_threads,
+ FALSE, NULL);
+ /* TODO: verify thread_pool != NULL in a nicer way */
+ g_assert (daemon->priv->thread_pool != NULL);
+
+ daemon->priv->jobs = NULL;
daemon->priv->registered_paths =
g_hash_table_new_full (g_str_hash,
g_str_equal,
@@ -297,53 +307,6 @@ g_vfs_daemon_register_path (GVfsDaemon *daemon,
return TRUE;
}
-static void
-g_queue_move_items (GQueue *to, GQueue *from)
-{
- GList *ignore;
- if (from->head != NULL)
- {
- if (to->head == NULL)
- to->head = from->head;
- else
- ignore = g_list_concat (to->tail, from->head);
- to->tail = from->tail;
- to->length += from->length;
-
- from->head = NULL;
- from->tail = NULL;
- from->length = 0;
- }
-}
-
-static gboolean
-start_jobs_at_idle (gpointer data)
-{
- GVfsDaemon *daemon = data;
- GList *l, *next;
- GVfsJob *job;
-
- g_mutex_lock (daemon->priv->lock);
- daemon->priv->queued_job_start = 0;
- g_queue_move_items (daemon->priv->pending_jobs,
- daemon->priv->new_pending_jobs);
- g_mutex_unlock (daemon->priv->lock);
-
- l = daemon->priv->pending_jobs->head;
- while (l != NULL)
- {
- job = l->data;
- next = l->next;
-
- if (g_vfs_job_start (job))
- g_queue_delete_link (daemon->priv->pending_jobs, l);
-
- l = next;
- }
-
- return FALSE;
-}
-
/* NOTE: Might be emitted on a thread */
static void
job_new_source_callback (GVfsJob *job,
@@ -367,12 +330,7 @@ job_finished_callback (GVfsJob *job,
daemon);
g_mutex_lock (daemon->priv->lock);
-
- g_queue_remove (daemon->priv->jobs, job);
-
- if (daemon->priv->queued_job_start == 0)
- daemon->priv->queued_job_start = g_idle_add (start_jobs_at_idle, daemon);
-
+ daemon->priv->jobs = g_list_remove (daemon->priv->jobs, job);
g_mutex_unlock (daemon->priv->lock);
g_object_unref (job);
@@ -389,16 +347,14 @@ g_vfs_daemon_queue_job (GVfsDaemon *daemon,
g_signal_connect (job, "new_source", (GCallback)job_new_source_callback, daemon);
g_mutex_lock (daemon->priv->lock);
- g_queue_push_tail (daemon->priv->jobs, job);
+ daemon->priv->jobs = g_list_prepend (daemon->priv->jobs, job);
g_mutex_unlock (daemon->priv->lock);
- /* Can we start the job immediately */
- if (!g_vfs_job_start (job))
+ /* Can we start the job immediately / async */
+ if (!g_vfs_job_try (job))
{
- /* Didn't start, queue as pending */
- g_mutex_lock (daemon->priv->lock);
- g_queue_push_tail (daemon->priv->new_pending_jobs, job);
- g_mutex_unlock (daemon->priv->lock);
+ /* Couldn't finish / run async, queue worker thread */
+ g_thread_pool_push (daemon->priv->thread_pool, job, NULL); /* TODO: Check error */
}
}
@@ -822,7 +778,7 @@ daemon_message_func (DBusConnection *conn,
DBUS_TYPE_INVALID))
{
g_mutex_lock (daemon->priv->lock);
- for (l = daemon->priv->jobs->head; l != NULL; l = l->next)
+ for (l = daemon->priv->jobs; l != NULL; l = l->next)
{
GVfsJob *job = l->data;
diff --git a/daemon/gvfsjob.c b/daemon/gvfsjob.c
index cbc1c0a9..a505f748 100644
--- a/daemon/gvfsjob.c
+++ b/daemon/gvfsjob.c
@@ -138,13 +138,22 @@ g_vfs_job_get_property (GObject *object,
}
}
+void
+g_vfs_job_run (GVfsJob *job)
+{
+ GVfsJobClass *class;
+
+ class = G_VFS_JOB_GET_CLASS (job);
+ class->run (job);
+}
+
gboolean
-g_vfs_job_start (GVfsJob *job)
+g_vfs_job_try (GVfsJob *job)
{
GVfsJobClass *class;
class = G_VFS_JOB_GET_CLASS (job);
- return class->start (job);
+ return class->try (job);
}
void
diff --git a/daemon/gvfsjob.h b/daemon/gvfsjob.h
index 6eb1fbfc..1862523c 100644
--- a/daemon/gvfsjob.h
+++ b/daemon/gvfsjob.h
@@ -47,7 +47,8 @@ struct _GVfsJobClass
/* vtable */
- gboolean (*start) (GVfsJob *job);
+ void (*run) (GVfsJob *job);
+ gboolean (*try) (GVfsJob *job);
};
GType g_vfs_job_get_type (void) G_GNUC_CONST;
@@ -55,7 +56,8 @@ GType g_vfs_job_get_type (void) G_GNUC_CONST;
gboolean g_vfs_job_is_finished (GVfsJob *job);
gboolean g_vfs_job_is_cancelled (GVfsJob *job);
void g_vfs_job_cancel (GVfsJob *job);
-gboolean g_vfs_job_start (GVfsJob *job);
+void g_vfs_job_run (GVfsJob *job);
+gboolean g_vfs_job_try (GVfsJob *job);
void g_vfs_job_emit_finished (GVfsJob *job);
void g_vfs_job_failed (GVfsJob *job,
GQuark domain,
diff --git a/daemon/gvfsjobcloseread.c b/daemon/gvfsjobcloseread.c
index 4ea7904a..e39846ae 100644
--- a/daemon/gvfsjobcloseread.c
+++ b/daemon/gvfsjobcloseread.c
@@ -13,7 +13,8 @@
G_DEFINE_TYPE (GVfsJobCloseRead, g_vfs_job_close_read, G_TYPE_VFS_JOB);
-static gboolean start (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
static void send_reply (GVfsJob *job);
static void
@@ -36,7 +37,8 @@ g_vfs_job_close_read_class_init (GVfsJobCloseReadClass *klass)
gobject_class->finalize = g_vfs_job_close_read_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_class->send_reply = send_reply;
}
@@ -76,12 +78,27 @@ send_reply (GVfsJob *job)
g_vfs_read_channel_send_closed (op_job->channel);
}
-static gboolean
-start (GVfsJob *job)
+static void
+run (GVfsJob *job)
{
GVfsJobCloseRead *op_job = G_VFS_JOB_CLOSE_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->close_read (op_job->backend,
+ op_job,
+ op_job->handle);
+}
- return g_vfs_backend_close_read (op_job->backend,
- op_job,
- op_job->handle);
+static gboolean
+try (GVfsJob *job)
+{
+ GVfsJobCloseRead *op_job = G_VFS_JOB_CLOSE_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ if (class->try_close_read == NULL)
+ return FALSE;
+
+ return class->try_close_read (op_job->backend,
+ op_job,
+ op_job->handle);
}
diff --git a/daemon/gvfsjobenumerate.c b/daemon/gvfsjobenumerate.c
index 453920b9..327971e7 100644
--- a/daemon/gvfsjobenumerate.c
+++ b/daemon/gvfsjobenumerate.c
@@ -14,7 +14,8 @@
G_DEFINE_TYPE (GVfsJobEnumerate, g_vfs_job_enumerate, G_TYPE_VFS_JOB_DBUS);
-static gboolean start (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
static void send_reply (GVfsJob *job);
static DBusMessage *create_reply (GVfsJob *job,
DBusConnection *connection,
@@ -43,7 +44,8 @@ g_vfs_job_enumerate_class_init (GVfsJobEnumerateClass *klass)
GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass);
gobject_class->finalize = g_vfs_job_enumerate_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_class->send_reply = send_reply;
job_dbus_class->create_reply = create_reply;
}
@@ -175,17 +177,35 @@ g_vfs_job_enumerate_done (GVfsJobEnumerate *job)
g_vfs_job_emit_finished (G_VFS_JOB (job));
}
+static void
+run (GVfsJob *job)
+{
+ GVfsJobEnumerate *op_job = G_VFS_JOB_ENUMERATE (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->enumerate (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->requested,
+ op_job->attributes,
+ op_job->follow_symlinks);
+}
+
static gboolean
-start (GVfsJob *job)
+try (GVfsJob *job)
{
GVfsJobEnumerate *op_job = G_VFS_JOB_ENUMERATE (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ if (class->try_enumerate == NULL)
+ return FALSE;
- return g_vfs_backend_enumerate (op_job->backend,
- op_job,
- op_job->filename,
- op_job->requested,
- op_job->attributes,
- op_job->follow_symlinks);
+ return class->try_enumerate (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->requested,
+ op_job->attributes,
+ op_job->follow_symlinks);
}
static void
diff --git a/daemon/gvfsjobgetinfo.c b/daemon/gvfsjobgetinfo.c
index 1c609522..582a88b0 100644
--- a/daemon/gvfsjobgetinfo.c
+++ b/daemon/gvfsjobgetinfo.c
@@ -14,7 +14,8 @@
G_DEFINE_TYPE (GVfsJobGetInfo, g_vfs_job_get_info, G_TYPE_VFS_JOB_DBUS);
-static gboolean start (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
static DBusMessage *create_reply (GVfsJob *job,
DBusConnection *connection,
DBusMessage *message);
@@ -44,7 +45,8 @@ g_vfs_job_get_info_class_init (GVfsJobGetInfoClass *klass)
GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass);
gobject_class->finalize = g_vfs_job_get_info_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_dbus_class->create_reply = create_reply;
}
@@ -99,17 +101,35 @@ g_vfs_job_get_info_new (DBusConnection *connection,
return G_VFS_JOB (job);
}
+static void
+run (GVfsJob *job)
+{
+ GVfsJobGetInfo *op_job = G_VFS_JOB_GET_INFO (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->get_info (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->requested,
+ op_job->attributes,
+ op_job->follow_symlinks);
+}
+
static gboolean
-start (GVfsJob *job)
+try (GVfsJob *job)
{
GVfsJobGetInfo *op_job = G_VFS_JOB_GET_INFO (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ if (class->try_get_info == NULL)
+ return FALSE;
- return g_vfs_backend_get_info (op_job->backend,
- op_job,
- op_job->filename,
- op_job->requested,
- op_job->attributes,
- op_job->follow_symlinks);
+ return class->try_get_info (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->requested,
+ op_job->attributes,
+ op_job->follow_symlinks);
}
void
diff --git a/daemon/gvfsjobopenforread.c b/daemon/gvfsjobopenforread.c
index b6de7fcb..c36b965c 100644
--- a/daemon/gvfsjobopenforread.c
+++ b/daemon/gvfsjobopenforread.c
@@ -14,7 +14,8 @@
G_DEFINE_TYPE (GVfsJobOpenForRead, g_vfs_job_open_for_read, G_TYPE_VFS_JOB_DBUS);
-static gboolean start (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
static void finished (GVfsJob *job);
static DBusMessage *create_reply (GVfsJob *job,
DBusConnection *connection,
@@ -46,7 +47,8 @@ g_vfs_job_open_for_read_class_init (GVfsJobOpenForReadClass *klass)
GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass);
gobject_class->finalize = g_vfs_job_open_for_read_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_class->finished = finished;
job_dbus_class->create_reply = create_reply;
}
@@ -93,16 +95,32 @@ g_vfs_job_open_for_read_new (DBusConnection *connection,
return G_VFS_JOB (job);
}
+static void
+run (GVfsJob *job)
+{
+ GVfsJobOpenForRead *op_job = G_VFS_JOB_OPEN_FOR_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->open_for_read (op_job->backend,
+ op_job,
+ op_job->filename);
+}
+
static gboolean
-start (GVfsJob *job)
+try (GVfsJob *job)
{
GVfsJobOpenForRead *op_job = G_VFS_JOB_OPEN_FOR_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
- return g_vfs_backend_open_for_read (op_job->backend,
- op_job,
- op_job->filename);
+ if (class->try_open_for_read == NULL)
+ return FALSE;
+
+ return class->try_open_for_read (op_job->backend,
+ op_job,
+ op_job->filename);
}
+
void
g_vfs_job_open_for_read_set_handle (GVfsJobOpenForRead *job,
GVfsBackendHandle handle)
diff --git a/daemon/gvfsjobread.c b/daemon/gvfsjobread.c
index e8f45df6..1cdb920b 100644
--- a/daemon/gvfsjobread.c
+++ b/daemon/gvfsjobread.c
@@ -13,8 +13,9 @@
G_DEFINE_TYPE (GVfsJobRead, g_vfs_job_read, G_TYPE_VFS_JOB);
-static gboolean start (GVfsJob *job);
-static void send_reply (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
+static void send_reply (GVfsJob *job);
static void
g_vfs_job_read_finalize (GObject *object)
@@ -38,7 +39,8 @@ g_vfs_job_read_class_init (GVfsJobReadClass *klass)
gobject_class->finalize = g_vfs_job_read_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_class->send_reply = send_reply;
}
@@ -84,18 +86,36 @@ send_reply (GVfsJob *job)
}
}
+static void
+run (GVfsJob *job)
+{
+ GVfsJobRead *op_job = G_VFS_JOB_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->read (op_job->backend,
+ op_job,
+ op_job->handle,
+ op_job->buffer,
+ op_job->bytes_requested);
+}
+
static gboolean
-start (GVfsJob *job)
+try (GVfsJob *job)
{
GVfsJobRead *op_job = G_VFS_JOB_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
- return g_vfs_backend_read (op_job->backend,
- op_job,
- op_job->handle,
- op_job->buffer,
- op_job->bytes_requested);
+ if (class->try_read == NULL)
+ return FALSE;
+
+ return class->try_read (op_job->backend,
+ op_job,
+ op_job->handle,
+ op_job->buffer,
+ op_job->bytes_requested);
}
+
/* Takes ownership */
void
g_vfs_job_read_set_size (GVfsJobRead *job,
diff --git a/daemon/gvfsjobseekread.c b/daemon/gvfsjobseekread.c
index 0e898cf1..2314e264 100644
--- a/daemon/gvfsjobseekread.c
+++ b/daemon/gvfsjobseekread.c
@@ -13,8 +13,9 @@
G_DEFINE_TYPE (GVfsJobSeekRead, g_vfs_job_seek_read, G_TYPE_VFS_JOB);
-static gboolean start (GVfsJob *job);
-static void send_reply (GVfsJob *job);
+static void run (GVfsJob *job);
+static gboolean try (GVfsJob *job);
+static void send_reply (GVfsJob *job);
static void
g_vfs_job_seek_read_finalize (GObject *object)
@@ -36,7 +37,8 @@ g_vfs_job_seek_read_class_init (GVfsJobSeekReadClass *klass)
gobject_class->finalize = g_vfs_job_seek_read_finalize;
- job_class->start = start;
+ job_class->run = run;
+ job_class->try = try;
job_class->send_reply = send_reply;
}
@@ -83,16 +85,33 @@ send_reply (GVfsJob *job)
}
}
+static void
+run (GVfsJob *job)
+{
+ GVfsJobSeekRead *op_job = G_VFS_JOB_SEEK_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
+
+ class->seek_on_read (op_job->backend,
+ op_job,
+ op_job->handle,
+ op_job->requested_offset,
+ op_job->seek_type);
+}
+
static gboolean
-start (GVfsJob *job)
+try (GVfsJob *job)
{
GVfsJobSeekRead *op_job = G_VFS_JOB_SEEK_READ (job);
+ GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
- return g_vfs_backend_seek_on_read (op_job->backend,
- op_job,
- op_job->handle,
- op_job->requested_offset,
- op_job->seek_type);
+ if (class->try_seek_on_read == NULL)
+ return FALSE;
+
+ return class->try_seek_on_read (op_job->backend,
+ op_job,
+ op_job->handle,
+ op_job->requested_offset,
+ op_job->seek_type);
}
void