[nautilus/gnome-3-20] file-operations: replace io_scheduler in helper functions
- From: Carlos Soriano Sánchez <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/gnome-3-20] file-operations: replace io_scheduler in helper functions
- Date: Wed, 2 Mar 2016 19:01:11 +0000 (UTC)
commit 23f4c5603982709c66faf322f6869173048419a6
Author: Razvan Chitu <razvan ch95 gmail com>
Date: Mon Feb 8 18:23:12 2016 +0200
file-operations: replace io_scheduler in helper functions
Nautilus file operations are implemented as asynchronous jobs scheduled using
g_io_scheduler. Since g_io_scheduler has been deprecated, these operations
should be using the simpler GTask API. In order to make this change possible, a
first step would be to replace the scheduler in the helper functions called
during the jobs.
Replace g_io_scheduler_send_to_mainloop with g_main_context_invoke in helper
functions. Since g_main_context_invoke is not blocking, add a mutex and a
condition so the current thread is blocked until the operation is completed in
the main loop.
https://bugzilla.gnome.org/show_bug.cgi?id=761549
libnautilus-private/nautilus-file-operations.c | 70 +++++++++++++++++++++---
1 files changed, 61 insertions(+), 9 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 9a93d8a..87c185d 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -1061,8 +1061,13 @@ typedef struct {
const char *details_text;
const char **button_titles;
gboolean show_all;
-
int result;
+ /* Dialogs are ran from operation threads, which need to be blocked until
+ * the user gives a valid response
+ */
+ gboolean completed;
+ GMutex mutex;
+ GCond cond;
} RunSimpleDialogData;
static gboolean
@@ -1074,6 +1079,8 @@ do_run_simple_dialog (gpointer _data)
int result;
int response_id;
+ g_mutex_lock (&data->mutex);
+
/* Create the dialog. */
dialog = gtk_message_dialog_new (*data->parent_window,
0,
@@ -1113,6 +1120,10 @@ do_run_simple_dialog (gpointer _data)
gtk_widget_destroy (dialog);
data->result = result;
+ data->completed = TRUE;
+
+ g_cond_signal (&data->cond);
+ g_mutex_unlock (&data->mutex);
return FALSE;
}
@@ -1145,6 +1156,9 @@ run_simple_dialog_va (CommonJob *job,
data->secondary_text = secondary_text;
data->details_text = details_text;
data->show_all = show_all;
+ data->completed = FALSE;
+ g_mutex_init (&data->mutex);
+ g_cond_init (&data->cond);
ptr_array = g_ptr_array_new ();
while ((button_title = va_arg (varargs, const char *)) != NULL) {
@@ -1154,13 +1168,24 @@ run_simple_dialog_va (CommonJob *job,
data->button_titles = (const char **)g_ptr_array_free (ptr_array, FALSE);
nautilus_progress_info_pause (job->progress);
- g_io_scheduler_job_send_to_mainloop (job->io_job,
- do_run_simple_dialog,
- data,
- NULL);
+
+ g_mutex_lock (&data->mutex);
+
+ g_main_context_invoke (NULL,
+ do_run_simple_dialog,
+ data);
+
+ while (!data->completed) {
+ g_cond_wait (&data->cond, &data->mutex);
+ }
+
nautilus_progress_info_resume (job->progress);
res = data->result;
+ g_mutex_unlock (&data->mutex);
+ g_mutex_clear (&data->mutex);
+ g_cond_clear (&data->cond);
+
g_free (data->button_titles);
g_free (data);
@@ -4374,6 +4399,12 @@ typedef struct {
GFile *dest_dir;
GtkWindow *parent;
ConflictResponseData *resp_data;
+ /* Dialogs are ran from operation threads, which need to be blocked until
+ * the user gives a valid response
+ */
+ gboolean completed;
+ GMutex mutex;
+ GCond cond;
} ConflictDialogData;
static gboolean
@@ -4383,6 +4414,8 @@ do_run_conflict_dialog (gpointer _data)
GtkWidget *dialog;
int response;
+ g_mutex_lock (&data->mutex);
+
dialog = nautilus_file_conflict_dialog_new (data->parent,
data->src,
data->dest,
@@ -4400,9 +4433,13 @@ do_run_conflict_dialog (gpointer _data)
}
data->resp_data->id = response;
+ data->completed = TRUE;
gtk_widget_destroy (dialog);
+ g_cond_signal (&data->cond);
+ g_mutex_unlock (&data->mutex);
+
return FALSE;
}
@@ -4427,13 +4464,28 @@ run_conflict_dialog (CommonJob *job,
resp_data->new_name = NULL;
data->resp_data = resp_data;
+ data->completed = FALSE;
+ g_mutex_init (&data->mutex);
+ g_cond_init (&data->cond);
+
nautilus_progress_info_pause (job->progress);
- g_io_scheduler_job_send_to_mainloop (job->io_job,
- do_run_conflict_dialog,
- data,
- NULL);
+
+ g_mutex_lock (&data->mutex);
+
+ g_main_context_invoke (NULL,
+ do_run_conflict_dialog,
+ data);
+
+ while (!data->completed) {
+ g_cond_wait (&data->cond, &data->mutex);
+ }
+
nautilus_progress_info_resume (job->progress);
+ g_mutex_unlock (&data->mutex);
+ g_mutex_clear (&data->mutex);
+ g_cond_clear (&data->cond);
+
g_slice_free (ConflictDialogData, data);
g_timer_continue (job->time);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]