Don't crash if removing a nonexistent value.
[platform/upstream/glib.git] / gcache.c
index b2fe779..dc58f07 100644 (file)
--- a/gcache.c
+++ b/gcache.c
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+/* 
+ * MT safe
+ */
+
 #include "glib.h"
 
 
@@ -56,7 +68,7 @@ static void        g_cache_node_destroy (GCacheNode *node);
 
 
 static GMemChunk *node_mem_chunk = NULL;
-
+G_LOCK_DEFINE_STATIC (node_mem_chunk);
 
 GCache*
 g_cache_new (GCacheNewFunc      value_new_func,
@@ -145,6 +157,9 @@ g_cache_remove (GCache   *cache,
   key = g_hash_table_lookup (rcache->value_table, value);
   node = g_hash_table_lookup (rcache->key_table, key);
 
+  if (node == NULL)
+    return;
+
   node->ref_count -= 1;
   if (node->ref_count == 0)
     {
@@ -193,11 +208,13 @@ g_cache_node_new (gpointer value)
 {
   GCacheNode *node;
 
+  G_LOCK (node_mem_chunk);
   if (!node_mem_chunk)
     node_mem_chunk = g_mem_chunk_new ("cache node mem chunk", sizeof (GCacheNode),
                                      1024, G_ALLOC_AND_FREE);
 
   node = g_chunk_new (GCacheNode, node_mem_chunk);
+  G_UNLOCK (node_mem_chunk);
 
   node->value = value;
   node->ref_count = 1;
@@ -208,5 +225,7 @@ g_cache_node_new (gpointer value)
 static void
 g_cache_node_destroy (GCacheNode *node)
 {
+  G_LOCK (node_mem_chunk);
   g_mem_chunk_free (node_mem_chunk, node);
+  G_UNLOCK (node_mem_chunk);
 }