2003-02-15 Anders Carlsson <andersca@codefactory.se>
authorAnders Carlsson <andersca@codefactory.se>
Sat, 15 Feb 2003 17:15:40 +0000 (17:15 +0000)
committerAnders Carlsson <andersca@codefactory.se>
Sat, 15 Feb 2003 17:15:40 +0000 (17:15 +0000)
* dbus/dbus-internals.h:
Fix build without tests.

* dbus/dbus-list.c: (alloc_link):
Fix a segfault when a malloc fails.

* dbus/dbus-memory.c: (initialize_malloc_debug), (dbus_malloc),
(dbus_malloc0), (dbus_realloc):
Add support for malloc debugging.

ChangeLog
dbus/dbus-internals.h
dbus/dbus-list.c
dbus/dbus-memory.c

index 77b80003f978a8c5e23d04fbad2a0faa35ba06e2..24abc4e2aa8bb9768fac238d3f46002a732bae33 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2003-02-15  Anders Carlsson  <andersca@codefactory.se>
+
+       * dbus/dbus-internals.h:
+       Fix build without tests.
+       
+       * dbus/dbus-list.c: (alloc_link):
+       Fix a segfault when a malloc fails.
+       
+       * dbus/dbus-memory.c: (initialize_malloc_debug), (dbus_malloc),
+       (dbus_malloc0), (dbus_realloc):
+       Add support for malloc debugging.
+
 2003-02-15  Alexander Larsson  <alexl@redhat.com>
 
        * dbus/dbus-threads.c:
index 29dd41ce55dfe6c31b8fdb209f4d350b81a827e4..26661564b790add058cea6aafa8eae7712b6860c 100644 (file)
@@ -150,7 +150,7 @@ dbus_bool_t _dbus_decrement_fail_alloc_counter (void);
 #else
 #define _dbus_set_fail_alloc_counter(n)
 #define _dbus_get_fail_alloc_counter _DBUS_INT_MAX
-#define _dbus_decrement_fail_alloc_counter FALSE
+#define _dbus_decrement_fail_alloc_counter() FALSE
 #endif /* !DBUS_BUILD_TESTS */
 
 DBUS_END_DECLS;
index 7f12e3db65ffa05ff4d36272021b8deb457b9c56..8c4e0c3a3ea5456d8f09e37f8d8f7b392cdc3178 100644 (file)
@@ -78,7 +78,8 @@ alloc_link (void *data)
     }
   
   link = _dbus_mem_pool_alloc (list_pool);
-  link->data = data;
+  if (link)
+    link->data = data;
   
   dbus_mutex_unlock (list_pool_lock);
 
index 357e8be68eb2c804c52f0ac82116a5b4134de671..74c97c266ddb1e0dc29ccb0fed8c57b7ce65cfa8 100644 (file)
@@ -25,6 +25,7 @@
 #include "dbus-internals.h"
 #include <stdlib.h>
 
+
 /**
  * @defgroup DBusMemory Memory Allocation
  * @ingroup  DBus
  * @param memory the memory to free
  */
 
+#ifdef DBUS_BUILD_TESTS
+static dbus_bool_t inited = FALSE;
+static int fail_counts = -1;
+static int fail_size = -1;
+#endif
+
+#ifdef DBUS_BUILD_TESTS
+static void
+initialize_malloc_debug (void)
+{
+  if (!inited)
+    {
+      if (_dbus_getenv ("DBUS_MALLOC_FAIL_NTH") != NULL)
+       {
+         fail_counts = atoi (_dbus_getenv ("DBUS_MALLOC_FAIL_NTH"));
+         _dbus_set_fail_alloc_counter (fail_counts);
+       }
+      
+      if (_dbus_getenv ("DBUS_MALLOC_FAIL_GREATER_THAN") != NULL)
+       fail_size = atoi (_dbus_getenv ("DBUS_MALLOC_FAIL_GREATER_THAN"));
+      
+      inited = TRUE;
+    }
+}
+#endif
+
 /**
  * Allocates the given number of bytes, as with standard
  * malloc(). Guaranteed to return #NULL if bytes is zero
 void*
 dbus_malloc (size_t bytes)
 {
+#ifdef DBUS_BUILD_TESTS
+  initialize_malloc_debug ();
+  
   if (_dbus_decrement_fail_alloc_counter ())
-    return NULL;
+    {
+      if (fail_counts != -1)
+       _dbus_set_fail_alloc_counter (fail_counts);
+      
+      return NULL;
+    }
+#endif
   
   if (bytes == 0) /* some system mallocs handle this, some don't */
     return NULL;
+#if DBUS_BUILD_TESTS
+  else if (fail_size != -1 && bytes > fail_size)
+    return NULL;
+#endif
   else
     return malloc (bytes);
 }
@@ -104,11 +144,24 @@ dbus_malloc (size_t bytes)
 void*
 dbus_malloc0 (size_t bytes)
 {
+#ifdef DBUS_BUILD_TESTS
+  initialize_malloc_debug ();
+  
   if (_dbus_decrement_fail_alloc_counter ())
-    return NULL;
+    {
+      if (fail_counts != -1)
+       _dbus_set_fail_alloc_counter (fail_counts);
+      
+      return NULL;
+    }
+#endif
 
   if (bytes == 0)
     return NULL;
+#if DBUS_BUILD_TESTS
+  else if (fail_size != -1 && bytes > fail_size)
+    return NULL;
+#endif
   else
     return calloc (bytes, 1);
 }
@@ -127,14 +180,27 @@ void*
 dbus_realloc (void  *memory,
               size_t bytes)
 {
+#ifdef DBUS_BUILD_TESTS
+  initialize_malloc_debug ();
+  
   if (_dbus_decrement_fail_alloc_counter ())
-    return NULL;
+    {
+      if (fail_counts != -1)
+       _dbus_set_fail_alloc_counter (fail_counts);
+      
+      return NULL;
+    }
+#endif
   
   if (bytes == 0) /* guarantee this is safe */
     {
       dbus_free (memory);
       return NULL;
     }
+#if DBUS_BUILD_TESTS
+  else if (fail_size != -1 && bytes > fail_size)
+    return NULL;
+#endif
   else
     {
       return realloc (memory, bytes);