summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2012-05-17 00:11:15 -0400
committerMatthias Clasen <mclasen@redhat.com>2012-05-17 00:11:15 -0400
commit01a3345c06e4c9dea4454e30f6751bdae3dd9a4e (patch)
tree56c90e831d4a5c682e9da0a5e0b8471a21f202e3 /modules
parent5eb286b74421178219221f3cbfc0bdb546adaecd (diff)
downloadgtk+-01a3345c06e4c9dea4454e30f6751bdae3dd9a4e.tar.gz
file printbackend: Protect a callback by GDK_THREADS_ENTER
https://bugzilla.gnome.org/show_bug.cgi?id=649569
Diffstat (limited to 'modules')
-rw-r--r--modules/printbackends/file/gtkprintbackendfile.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/modules/printbackends/file/gtkprintbackendfile.c b/modules/printbackends/file/gtkprintbackendfile.c
index 3041d70606..fdb36b6dbc 100644
--- a/modules/printbackends/file/gtkprintbackendfile.c
+++ b/modules/printbackends/file/gtkprintbackendfile.c
@@ -370,15 +370,14 @@ typedef struct {
GDestroyNotify dnotify;
} _PrintStreamData;
+/* expects GDK lock to be held */
static void
-file_print_cb (GtkPrintBackendFile *print_backend,
- GError *error,
- gpointer user_data)
+file_print_cb_locked (GtkPrintBackendFile *print_backend,
+ GError *error,
+ gpointer user_data)
{
_PrintStreamData *ps = (_PrintStreamData *) user_data;
- GDK_THREADS_ENTER ();
-
if (ps->target_io_stream != NULL)
g_output_stream_close (G_OUTPUT_STREAM (ps->target_io_stream), NULL, NULL);
@@ -393,8 +392,18 @@ file_print_cb (GtkPrintBackendFile *print_backend,
if (ps->job)
g_object_unref (ps->job);
-
+
g_free (ps);
+}
+
+static void
+file_print_cb (GtkPrintBackendFile *print_backend,
+ GError *error,
+ gpointer user_data)
+{
+ GDK_THREADS_ENTER ();
+
+ file_print_cb_locked (print_backend, error, user_data);
GDK_THREADS_LEAVE ();
}
@@ -412,7 +421,7 @@ file_write (GIOChannel *source,
error = NULL;
- read_status =
+ read_status =
g_io_channel_read_chars (source,
buf,
_STREAM_MAX_CHUNK_SIZE,
@@ -490,8 +499,8 @@ gtk_print_backend_file_print_stream (GtkPrintBackend *print_backend,
error:
if (internal_error != NULL)
{
- file_print_cb (GTK_PRINT_BACKEND_FILE (print_backend),
- internal_error, ps);
+ file_print_cb_locked (GTK_PRINT_BACKEND_FILE (print_backend),
+ internal_error, ps);
g_error_free (internal_error);
return;