diff options
Diffstat (limited to 'sal/rtl/source/alloc.c')
-rw-r--r-- | sal/rtl/source/alloc.c | 157 |
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(); + } +} /*=========================================================================== * |