[gnome-photos] base-item: Clean up the leftovers when _base_item_load_async fails
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos] base-item: Clean up the leftovers when _base_item_load_async fails
- Date: Tue, 28 Feb 2017 08:56:28 +0000 (UTC)
commit 71131b453c9283812728fbdc7821b8a9d740ca90
Author: Debarshi Ray <debarshir gnome org>
Date: Sun Feb 26 13:05:30 2017 +0100
base-item: Clean up the leftovers when _base_item_load_async fails
This prevents the BaseItem from being left in an inconsistent state.
For example, if the photos_base_item_load_async failure was due to a
cancellation, then subsequent attempts to load the BaseItem might
encounter a valid Pipeline and conclude that it is already loaded.
When, in fact, the buffer source might not have a GeglBuffer due to
the cancellation.
https://bugzilla.gnome.org/show_bug.cgi?id=777867
src/photos-base-item.c | 25 +++++++++++++++++++++----
1 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/src/photos-base-item.c b/src/photos-base-item.c
index 408d026..f6fbaef 100644
--- a/src/photos-base-item.c
+++ b/src/photos-base-item.c
@@ -418,6 +418,22 @@ photos_base_item_check_effects_and_update_info (PhotosBaseItem *self)
static void
+photos_base_item_clear_pixels (PhotosBaseItem *self)
+{
+ PhotosBaseItemPrivate *priv;
+
+ priv = photos_base_item_get_instance_private (self);
+
+ priv->buffer_source = NULL;
+
+ g_clear_object (&priv->edit_graph);
+ g_clear_object (&priv->pipeline);
+ g_clear_object (&priv->preview_source_buffer);
+ g_clear_object (&priv->processor);
+}
+
+
+static void
photos_base_item_set_original_icon (PhotosBaseItem *self, GdkPixbuf *icon)
{
PhotosBaseItemPrivate *priv;
@@ -1453,6 +1469,7 @@ photos_base_item_load_process (GObject *source_object, GAsyncResult *res, gpoint
photos_base_item_process_finish (self, res, &error);
if (error != NULL)
{
+ photos_base_item_clear_pixels (self);
g_task_return_error (task, error);
goto out;
}
@@ -1486,6 +1503,7 @@ photos_base_item_load_load_buffer (GObject *source_object, GAsyncResult *res, gp
buffer = photos_base_item_load_buffer_finish (self, res, &error);
if (error != NULL)
{
+ photos_base_item_clear_pixels (self);
g_task_return_error (task, error);
goto out;
}
@@ -1523,6 +1541,7 @@ photos_base_item_load_pipeline (GObject *source_object, GAsyncResult *res, gpoin
priv->pipeline = photos_pipeline_new_finish (res, &error);
if (error != NULL)
{
+ photos_base_item_clear_pixels (self);
g_task_return_error (task, error);
goto out;
}
@@ -2490,14 +2509,12 @@ photos_base_item_dispose (GObject *object)
g_clear_object (&priv->cancellable);
}
+ photos_base_item_clear_pixels (self);
+
g_clear_pointer (&priv->surface, (GDestroyNotify) cairo_surface_destroy);
g_clear_object (&priv->default_app);
- g_clear_object (&priv->preview_source_buffer);
- g_clear_object (&priv->edit_graph);
- g_clear_object (&priv->processor);
g_clear_object (&priv->original_icon);
g_clear_object (&priv->watcher);
- g_clear_object (&priv->pipeline);
g_clear_object (&priv->sel_cntrlr);
g_clear_object (&priv->cursor);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]