diff options
author | Matthias Clasen <mclasen@redhat.com> | 2012-05-17 00:11:15 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2012-05-17 00:11:15 -0400 |
commit | 01a3345c06e4c9dea4454e30f6751bdae3dd9a4e (patch) | |
tree | 56c90e831d4a5c682e9da0a5e0b8471a21f202e3 /modules | |
parent | 5eb286b74421178219221f3cbfc0bdb546adaecd (diff) | |
download | gtk+-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.c | 27 |
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; |