summaryrefslogtreecommitdiff
path: root/sal/rtl/source/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sal/rtl/source/alloc.c')
-rw-r--r--sal/rtl/source/alloc.c157
1 files changed, 132 insertions, 25 deletions
diff --git a/sal/rtl/source/alloc.c b/sal/rtl/source/alloc.c
index 44b37c255004..67828bb6adb1 100644
--- a/sal/rtl/source/alloc.c
+++ b/sal/rtl/source/alloc.c
@@ -287,6 +287,38 @@ static sal_Size __rtl_memory_vmpagesize (void)
/*===========================================================================
*
+ * Determine allocation mode (debug/release) by examining unix
+ * environment variable "G_SLICE"
+ *
+ *=========================================================================*/
+
+#include <stdlib.h> /* getenv */
+#include <stdio.h> /* stderr */
+
+typedef
+ enum { AMode_CUSTOM, AMode_SYSTEM, AMode_UNSET }
+ AllocMode;
+
+static AllocMode alloc_mode = AMode_UNSET;
+
+static void determine_alloc_mode ( void )
+{
+ /* This shouldn't happen, but still ... */
+ if (alloc_mode != AMode_UNSET)
+ return;
+
+ if (getenv("G_SLICE") != NULL) {
+ alloc_mode = AMode_SYSTEM;
+ fprintf(stderr, "OOo: Using system memory allocator.\n");
+ fprintf(stderr, "OOo: This is for debugging only. To disable,\n");
+ fprintf(stderr, "OOo: unset the environment variable G_SLICE.\n");
+ } else {
+ alloc_mode = AMode_CUSTOM;
+ }
+}
+
+/*===========================================================================
+ *
* rtl_memory (global) internals.
*
*=========================================================================*/
@@ -1233,8 +1265,8 @@ static void __rtl_memory_enqueue (memory_type **ppMemory)
/*
* rtl_reallocateMemory.
*/
-#ifndef FORCE_SYSALLOC
-void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+static
+void* SAL_CALL rtl_reallocateMemory_CUSTOM (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
memory_type * memory;
if (!(!p || !n))
@@ -1390,18 +1422,33 @@ void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
}
return (p);
}
-#else /* FORCE_SYSALLOC */
-void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+
+static
+void* SAL_CALL rtl_reallocateMemory_SYSTEM (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
return realloc(p, (sal_Size)(n));
}
-#endif /* FORCE_SYSALLOC */
+
+void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ while (1) {
+ if (alloc_mode == AMode_CUSTOM) {
+ return rtl_reallocateMemory_CUSTOM(p,n);
+ }
+ if (alloc_mode == AMode_SYSTEM) {
+ return rtl_reallocateMemory_SYSTEM(p,n);
+ }
+ determine_alloc_mode();
+ }
+}
+
+
/*
* rtl_allocateMemory.
*/
-#ifndef FORCE_SYSALLOC
-void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+static
+void* SAL_CALL rtl_allocateMemory_CUSTOM (sal_Size n) SAL_THROW_EXTERN_C()
{
void * p = 0;
if (n > 0)
@@ -1423,18 +1470,33 @@ void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
}
return (p);
}
-#else /* FORCE_SYSALLOC */
-void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+
+static
+void* SAL_CALL rtl_allocateMemory_SYSTEM (sal_Size n) SAL_THROW_EXTERN_C()
{
return malloc((sal_Size)(n));
}
-#endif /* FORCE_SYSALLOC */
+
+void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ while (1) {
+ if (alloc_mode == AMode_CUSTOM) {
+ return rtl_allocateMemory_CUSTOM(n);
+ }
+ if (alloc_mode == AMode_SYSTEM) {
+ return rtl_allocateMemory_SYSTEM(n);
+ }
+ determine_alloc_mode();
+ }
+}
+
+
/*
* rtl_freeMemory.
*/
-#ifndef FORCE_SYSALLOC
-void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+static
+void SAL_CALL rtl_freeMemory_CUSTOM (void * p) SAL_THROW_EXTERN_C()
{
if (p)
{
@@ -1455,18 +1517,34 @@ void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
RTL_MEMORY_LEAVE();
}
}
-#else /* FORCE_SYSALLOC */
-void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+
+static
+void SAL_CALL rtl_freeMemory_SYSTEM (void * p) SAL_THROW_EXTERN_C()
{
free(p);
}
-#endif /* FORCE_SYSALLOC */
+
+void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+{
+ while (1) {
+ if (alloc_mode == AMode_CUSTOM) {
+ rtl_freeMemory_CUSTOM(p);
+ return;
+ }
+ if (alloc_mode == AMode_SYSTEM) {
+ rtl_freeMemory_SYSTEM(p);
+ return;
+ }
+ determine_alloc_mode();
+ }
+}
+
/*
* rtl_allocateZeroMemory.
*/
-#ifndef FORCE_SYSALLOC
-void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+static
+void* SAL_CALL rtl_allocateZeroMemory_CUSTOM (sal_Size n) SAL_THROW_EXTERN_C()
{
void * p = 0;
if (n > 0)
@@ -1489,18 +1567,32 @@ void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
}
return (p);
}
-#else /* FORCE_SYSALLOC */
-void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+
+static
+void* SAL_CALL rtl_allocateZeroMemory_SYSTEM (sal_Size n) SAL_THROW_EXTERN_C()
{
return calloc((sal_Size)(n), 1);
}
-#endif /* FORCE_SYSALLOC */
+
+void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ while (1) {
+ if (alloc_mode == AMode_CUSTOM) {
+ return rtl_allocateZeroMemory_CUSTOM(n);
+ }
+ if (alloc_mode == AMode_SYSTEM) {
+ return rtl_allocateZeroMemory_SYSTEM(n);
+ }
+ determine_alloc_mode();
+ }
+}
+
/*
* rtl_freeZeroMemory.
*/
-#ifndef FORCE_SYSALLOC
-void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+static
+void SAL_CALL rtl_freeZeroMemory_CUSTOM (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
(void) n; /* unused */
if (p)
@@ -1523,8 +1615,9 @@ void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
RTL_MEMORY_LEAVE();
}
}
-#else /* FORCE_SYSALLOC */
-void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+
+static
+void SAL_CALL rtl_freeZeroMemory_SYSTEM (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
if (p)
{
@@ -1532,7 +1625,21 @@ void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
free(p);
}
}
-#endif /* FORCE_SYSALLOC */
+
+void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ while (1) {
+ if (alloc_mode == AMode_CUSTOM) {
+ rtl_freeZeroMemory_CUSTOM(p,n);
+ return;
+ }
+ if (alloc_mode == AMode_SYSTEM) {
+ rtl_freeZeroMemory_SYSTEM(p,n);
+ return;
+ }
+ determine_alloc_mode();
+ }
+}
/*===========================================================================
*