[gegl] gegl/buffer: use more explicit code for cleanup



commit 36e5cb473d46cb1fe1dfa11f3fbc80d36f622b47
Author: Øyvind Kolås <pippin gimp org>
Date:   Sun Jan 7 22:22:45 2018 +0100

    gegl/buffer: use more explicit code for cleanup
    
    This is a revert of the parts of this commit
    66dad2179c1ec9e8b32900ef6ef8f93244d51209, that touched gegl/buffer, some part
    of seen performance regression might be the function call overhead of g_free
    which will be skipped when conditions for NULL fails.

 gegl/buffer/gegl-buffer-load.c             |    3 ++-
 gegl/buffer/gegl-buffer-save.c             |    3 ++-
 gegl/buffer/gegl-buffer.c                  |   15 +++++++++++----
 gegl/buffer/gegl-sampler-cubic.c           |    3 ++-
 gegl/buffer/gegl-sampler.c                 |    9 +++++++--
 gegl/buffer/gegl-tile-backend-file-async.c |   10 +++++++---
 gegl/buffer/gegl-tile-handler.c            |   17 +++++++++++++++--
 7 files changed, 46 insertions(+), 14 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-load.c b/gegl/buffer/gegl-buffer-load.c
index a35393f..5a6523f 100644
--- a/gegl/buffer/gegl-buffer-load.c
+++ b/gegl/buffer/gegl-buffer-load.c
@@ -63,7 +63,8 @@ load_info_destroy (LoadInfo *info)
 {
   if (!info)
     return;
-  g_free (info->path);
+  if (info->path)
+    g_free (info->path);
   if (info->i != -1)
     close (info->i);
   if (info->tiles != NULL)
diff --git a/gegl/buffer/gegl-buffer-save.c b/gegl/buffer/gegl-buffer-save.c
index feb673e..ce0cbdd 100644
--- a/gegl/buffer/gegl-buffer-save.c
+++ b/gegl/buffer/gegl-buffer-save.c
@@ -106,7 +106,8 @@ save_info_destroy (SaveInfo *info)
 {
   if (!info)
     return;
-  g_free (info->path);
+  if (info->path)
+    g_free (info->path);
   if (info->o != -1)
     close (info->o);
   if (info->tiles != NULL)
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index e01203e..c8f621e 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -211,7 +211,8 @@ gegl_buffer_set_property (GObject      *gobject,
         break;
 
       case PROP_PATH:
-        g_free (buffer->path);
+        if (buffer->path)
+          g_free (buffer->path);
         buffer->path = g_value_dup_string (value);
         break;
 
@@ -263,7 +264,8 @@ gegl_buffer_set_property (GObject      *gobject,
         break;
 
       case PROP_BACKEND:
-        g_clear_object (&buffer->backend);
+        if (buffer->backend)
+          g_object_unref (buffer->backend);
         buffer->backend = g_value_dup_object (value);
         break;
 
@@ -394,7 +396,11 @@ gegl_buffer_dispose (GObject *object)
 
   _gegl_buffer_drop_hot_tile (buffer);
 
-  g_clear_object (&buffer->backend);
+  if (buffer->backend)
+    {
+      g_object_unref (buffer->backend);
+      buffer->backend = NULL;
+    }
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -514,7 +520,8 @@ gegl_buffer_constructor (GType                  type,
           buffer->tile_width = gegl_tile_backend_get_tile_width (backend);
           buffer->tile_height = gegl_tile_backend_get_tile_height (backend);
 
-          g_free (buffer->path);
+          if (buffer->path)
+            g_free (buffer->path);
 
           if (GEGL_IS_TILE_BACKEND_FILE (backend))
             g_object_get (backend, "path", &buffer->path, NULL);
diff --git a/gegl/buffer/gegl-sampler-cubic.c b/gegl/buffer/gegl-sampler-cubic.c
index 4fd7231..e7848a7 100644
--- a/gegl/buffer/gegl-sampler-cubic.c
+++ b/gegl/buffer/gegl-sampler-cubic.c
@@ -311,7 +311,8 @@ set_property (GObject      *object,
         break;
 
       case PROP_TYPE:
-        g_free (self->type);
+        if (self->type)
+          g_free (self->type);
         self->type = g_value_dup_string (value);
         break;
 
diff --git a/gegl/buffer/gegl-sampler.c b/gegl/buffer/gegl-sampler.c
index 6c7062c..3428906 100644
--- a/gegl/buffer/gegl-sampler.c
+++ b/gegl/buffer/gegl-sampler.c
@@ -509,7 +509,8 @@ gegl_buffer_sample_at_level (GeglBuffer       *buffer,
 
       if (buffer->sampler)
       {
-        g_clear_object (&buffer->sampler);
+        g_object_unref (buffer->sampler);
+        buffer->sampler = NULL;
         buffer->sampler_type = 0;
       }
 
@@ -558,7 +559,11 @@ gegl_buffer_sample_cleanup (GeglBuffer *buffer)
   if (threaded)
     g_mutex_lock (&gegl_buffer_sampler_mutex);
 
-  g_clear_object (&buffer->sampler);
+  if (buffer->sampler)
+    {
+      g_object_unref (buffer->sampler);
+      buffer->sampler = NULL;
+    }
 
   if (threaded)
     g_mutex_unlock (&gegl_buffer_sampler_mutex);
diff --git a/gegl/buffer/gegl-tile-backend-file-async.c b/gegl/buffer/gegl-tile-backend-file-async.c
index c78bf83..1885a04 100644
--- a/gegl/buffer/gegl-tile-backend-file-async.c
+++ b/gegl/buffer/gegl-tile-backend-file-async.c
@@ -879,7 +879,8 @@ gegl_tile_backend_file_set_property (GObject      *object,
   switch (property_id)
     {
       case PROP_PATH:
-        g_free (self->path);
+        if (self->path)
+          g_free (self->path);
         self->path = g_value_dup_string (value);
         break;
 
@@ -970,8 +971,11 @@ gegl_tile_backend_file_finalize (GObject *object)
       g_free (self->path);
     }
 
-  g_clear_object (&self->monitor);
-  g_clear_object (&self->file);
+  if (self->monitor)
+    g_object_unref (self->monitor);
+
+  if (self->file)
+    g_object_unref (self->file);
 
   g_cond_clear (&self->cond);
 
diff --git a/gegl/buffer/gegl-tile-handler.c b/gegl/buffer/gegl-tile-handler.c
index 74cf511..72f610e 100644
--- a/gegl/buffer/gegl-tile-handler.c
+++ b/gegl/buffer/gegl-tile-handler.c
@@ -49,7 +49,11 @@ gegl_tile_handler_dispose (GObject *object)
 {
   GeglTileHandler *handler = GEGL_TILE_HANDLER (object);
 
-  g_clear_object (&handler->source);
+  if (handler->source)
+    {
+      g_object_unref (handler->source);
+      handler->source = NULL;
+    }
 
   G_OBJECT_CLASS (gegl_tile_handler_parent_class)->dispose (object);
 }
@@ -141,7 +145,16 @@ void
 gegl_tile_handler_set_source (GeglTileHandler *handler,
                               GeglTileSource  *source)
 {
-  g_set_object (&handler->source, source);
+  if (source != handler->source)
+    {
+      if (handler->source)
+        g_object_unref (handler->source);
+
+      handler->source = source;
+
+      if (handler->source)
+        g_object_ref (handler->source);
+    }
 }
 
 void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]