[gnome-documents/gnome-3-8] pdf-loader: Terminate the unoconv process when loading is cancelled
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-documents/gnome-3-8] pdf-loader: Terminate the unoconv process when loading is cancelled
- Date: Thu, 30 May 2013 09:06:25 +0000 (UTC)
commit 0dbab90e5196c3193383e971ecf7cba76c5bcf34
Author: Debarshi Ray <debarshir gnome org>
Date: Wed May 29 13:36:35 2013 +0200
pdf-loader: Terminate the unoconv process when loading is cancelled
https://bugzilla.gnome.org/show_bug.cgi?id=701139
src/lib/gd-pdf-loader.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
---
diff --git a/src/lib/gd-pdf-loader.c b/src/lib/gd-pdf-loader.c
index 2573f9d..6b1aed2 100644
--- a/src/lib/gd-pdf-loader.c
+++ b/src/lib/gd-pdf-loader.c
@@ -34,6 +34,7 @@
typedef struct {
GSimpleAsyncResult *result;
GCancellable *cancellable;
+ gulong cancelled_id;
EvDocument *document;
gchar *uri;
@@ -118,6 +119,11 @@ content_type_is_native (const gchar *content_type)
static void
pdf_load_job_free (PdfLoadJob *job)
{
+ if (job->cancellable != NULL) {
+ g_cancellable_disconnect (job->cancellable, job->cancelled_id);
+ job->cancelled_id = 0;
+ }
+
g_clear_object (&job->document);
g_clear_object (&job->result);
g_clear_object (&job->cancellable);
@@ -627,12 +633,28 @@ pdf_load_job_from_zpj_cache (PdfLoadJob *job)
}
static void
+unoconv_cancelled_cb (GCancellable *cancellable,
+ gpointer user_data)
+{
+ PdfLoadJob *job = user_data;
+
+ /* job->unoconv_pid will be reset by unoconv_child_watch_cb */
+ if (job->unoconv_pid != -1)
+ kill (job->unoconv_pid, SIGKILL);
+}
+
+static void
unoconv_child_watch_cb (GPid pid,
gint status,
gpointer user_data)
{
PdfLoadJob *job = user_data;
+ if (job->cancellable != NULL) {
+ g_cancellable_disconnect (job->cancellable, job->cancelled_id);
+ job->cancelled_id = 0;
+ }
+
g_spawn_close_pid (pid);
job->unoconv_pid = -1;
@@ -774,6 +796,9 @@ pdf_load_job_openoffice_refresh_cache (PdfLoadJob *job)
/* now watch when the unoconv child process dies */
g_child_watch_add (pid, unoconv_child_watch_cb, job);
job->unoconv_pid = pid;
+
+ if (job->cancellable != NULL)
+ job->cancelled_id = g_cancellable_connect (job->cancellable, G_CALLBACK (unoconv_cancelled_cb), job,
NULL);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]