summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-mempool.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-02-14 04:54:55 +0000
committerHavoc Pennington <hp@redhat.com>2003-02-14 04:54:55 +0000
commit07a795f1db3b09beeec647643a4f263f617bc371 (patch)
tree4f557fce8ee2012dc7fcd40587d8d40b20d112e3 /dbus/dbus-mempool.c
parentb544e59358251f0811c9fe35c149a67d5deafdba (diff)
2003-02-14 Havoc Pennington <hp@pobox.com>
* dbus/dbus-mempool.c: fail if the debug functions so indicate * dbus/dbus-memory.c: fail if the debug functions indicate we should * dbus/dbus-internals.c (_dbus_set_fail_alloc_counter) (_dbus_decrement_fail_alloc_counter): debug functions to simulate memory allocation failures
Diffstat (limited to 'dbus/dbus-mempool.c')
-rw-r--r--dbus/dbus-mempool.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/dbus/dbus-mempool.c b/dbus/dbus-mempool.c
index 05e3749b..3b233dd1 100644
--- a/dbus/dbus-mempool.c
+++ b/dbus/dbus-mempool.c
@@ -1,7 +1,7 @@
/* -*- mode: C; c-file-style: "gnu" -*- */
/* dbus-mempool.h Memory pools
*
- * Copyright (C) 2002 Red Hat, Inc.
+ * Copyright (C) 2002, 2003 Red Hat, Inc.
*
* Licensed under the Academic Free License version 1.2
*
@@ -195,6 +195,9 @@ _dbus_mem_pool_free (DBusMemPool *pool)
void*
_dbus_mem_pool_alloc (DBusMemPool *pool)
{
+ if (_dbus_decrement_fail_alloc_counter ())
+ return NULL;
+
if (pool->free_elements)
{
DBusFreedElement *element = pool->free_elements;
@@ -216,7 +219,10 @@ _dbus_mem_pool_alloc (DBusMemPool *pool)
/* Need a new block */
DBusMemBlock *block;
int alloc_size;
-
+#ifdef DBUS_BUILD_TESTS
+ int saved_counter;
+#endif
+
if (pool->block_size <= _DBUS_INT_MAX / 4) /* avoid overflow */
{
/* use a larger block size for our next block */
@@ -226,12 +232,27 @@ _dbus_mem_pool_alloc (DBusMemPool *pool)
}
alloc_size = sizeof (DBusMemBlock) - ELEMENT_PADDING + pool->block_size;
+
+#ifdef DBUS_BUILD_TESTS
+ /* We save/restore the counter, so that memory pools won't
+ * cause a given function to have different number of
+ * allocations on different invocations. i.e. when testing
+ * we want consistent alloc patterns. So we skip our
+ * malloc here for purposes of failed alloc simulation.
+ */
+ saved_counter = _dbus_get_fail_alloc_counter ();
+ _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
+#endif
if (pool->zero_elements)
block = dbus_malloc0 (alloc_size);
else
block = dbus_malloc (alloc_size);
+#ifdef DBUS_BUILD_TESTS
+ _dbus_set_fail_alloc_counter (saved_counter);
+#endif
+
if (block == NULL)
return NULL;