]> err.no Git - libchamplain/commitdiff
Fix Bug 584368 for ChamplainCache
authorPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Sun, 31 May 2009 21:01:44 +0000 (17:01 -0400)
committerPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Sun, 31 May 2009 21:01:44 +0000 (17:01 -0400)
champlain/champlain-cache.c
champlain/champlain-cache.h
champlain/champlain-network-map-source.c

index 4a6a34cf7c72dd17a9441009c340cfb06ead1d27..c342526fecfe8af80ec7780d6479eebc42b4286a 100644 (file)
@@ -57,6 +57,8 @@ enum
 
 typedef struct _ChamplainCachePrivate ChamplainCachePrivate;
 
+static ChamplainCache *instance = NULL;
+
 struct _ChamplainCachePrivate {
   guint size_limit;
 
@@ -142,6 +144,29 @@ champlain_cache_finalize (GObject *object)
   G_OBJECT_CLASS (champlain_cache_parent_class)->finalize (object);
 }
 
+static GObject *
+champlain_cache_constructor (GType type,
+    guint n_construct_params,
+    GObjectConstructParam *construct_params)
+{
+  GObject *retval;
+
+  if (instance == NULL)
+    {
+      retval = G_OBJECT_CLASS (champlain_cache_parent_class)->constructor
+          (type, n_construct_params, construct_params);
+
+      instance = CHAMPLAIN_CACHE (retval);
+      g_object_add_weak_pointer (retval, (gpointer) &instance);
+    }
+  else
+    {
+      retval = g_object_ref (instance);
+    }
+
+  return retval;
+}
+
 static void
 champlain_cache_class_init (ChamplainCacheClass *klass)
 {
@@ -149,6 +174,7 @@ champlain_cache_class_init (ChamplainCacheClass *klass)
 
   g_type_class_add_private (klass, sizeof (ChamplainCachePrivate));
 
+  object_class->constructor = champlain_cache_constructor;
   object_class->get_property = champlain_cache_get_property;
   object_class->set_property = champlain_cache_set_property;
   object_class->dispose = champlain_cache_dispose;
@@ -259,17 +285,9 @@ cleanup:
  * Since: 0.4
  */
 ChamplainCache*
-champlain_cache_get_default (void)
+champlain_cache_dup_default (void)
 {
-  static ChamplainCache * instance = NULL;
-
-  if (G_UNLIKELY (instance == NULL))
-    {
-      instance = g_object_new (CHAMPLAIN_TYPE_CACHE, NULL);
-      return instance;
-    }
-
-  return g_object_ref (instance);
+  return g_object_new (CHAMPLAIN_TYPE_CACHE, NULL);
 }
 
 /**
@@ -404,7 +422,10 @@ champlain_cache_fill_tile (ChamplainCache *self,
       g_strdup (filename));
 
   if (priv->popularity_id == 0)
+  {
+    g_object_ref (self);
     priv->popularity_id = g_idle_add (inc_popularity, self);
+  }
 
 cleanup:
   sqlite3_reset (priv->stmt_select);
@@ -452,6 +473,7 @@ inc_popularity (gpointer data)
 
   if (priv->popularity_queue == NULL)
     {
+      g_object_unref (cache);
       priv->popularity_id = 0;
       return FALSE;
     }
index fe0d01e59450e7266bc317cf5591b2bc5f6389ab..818aa760c72a79abf0ee6fbccd86f735aba5ce4e 100644 (file)
@@ -54,7 +54,7 @@ typedef struct {
 
 GType champlain_cache_get_type (void);
 
-ChamplainCache* champlain_cache_get_default (void);
+ChamplainCache* champlain_cache_dup_default (void);
 
 void champlain_cache_update_tile (ChamplainCache *self,
     ChamplainTile *tile,
index 4e2bb40f687bbd5faede99c6b94d85052ab0fad5..d4d7aa20115a816ca0377f546f680dc21ec662f9 100644 (file)
@@ -421,7 +421,7 @@ file_loaded_cb (SoupSession *session,
   GFile *file;
   GFileInfo *info;
   guint filesize = 0;
-  ChamplainCache *cache = champlain_cache_get_default ();
+  ChamplainCache *cache = champlain_cache_dup_default ();
 
   filename = champlain_tile_get_filename (tile);
 
@@ -545,6 +545,7 @@ file_loaded_cb (SoupSession *session,
 
 cleanup:
   g_object_unref (loader);
+  g_object_unref (cache);
   g_free (path);
 finish:
   champlain_tile_set_state (tile, CHAMPLAIN_STATE_DONE);
@@ -562,7 +563,7 @@ fill_tile (ChamplainMapSource *map_source,
 
   ChamplainNetworkMapSource *source = CHAMPLAIN_NETWORK_MAP_SOURCE (map_source);
   ChamplainNetworkMapSourcePrivate *priv = source->priv;
-  ChamplainCache *cache = champlain_cache_get_default ();
+  ChamplainCache *cache = champlain_cache_dup_default ();
 
   /* Try the cached version first */
   filename = get_filename (source, tile);
@@ -647,5 +648,6 @@ fill_tile (ChamplainMapSource *map_source,
   /* If a tile is neither in cache or can be fetched, do nothing, it'll show up
    * as empty
    */
+  g_object_unref (cache);
 }