Index: icu46/source/common/cmemory.c |
=================================================================== |
--- icu46/source/common/cmemory.c (revision 0) |
+++ icu46/source/common/cmemory.c (revision 0) |
@@ -0,0 +1,124 @@ |
+/* |
+****************************************************************************** |
+* |
+* Copyright (C) 2002-2003, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+* |
+****************************************************************************** |
+* |
+* File cmemory.c ICU Heap allocation. |
+* All ICU heap allocation, both for C and C++ new of ICU |
+* class types, comes through these functions. |
+* |
+* If you have a need to replace ICU allocation, this is the |
+* place to do it. |
+* |
+* Note that uprv_malloc(0) returns a non-NULL pointer, and |
+* that a subsequent free of that pointer value is a NOP. |
+* |
+****************************************************************************** |
+*/ |
+#include "unicode/uclean.h" |
+#include "cmemory.h" |
+#include <stdlib.h> |
+ |
+/* uprv_malloc(0) returns a pointer to this read-only data. */ |
+static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0}; |
+ |
+/* Function Pointers for user-supplied heap functions */ |
+static const void *pContext; |
+static UMemAllocFn *pAlloc; |
+static UMemReallocFn *pRealloc; |
+static UMemFreeFn *pFree; |
+ |
+/* Flag indicating whether any heap allocations have happened. |
+ * Used to prevent changing out the heap functions after allocations have been made */ |
+static UBool gHeapInUse; |
+ |
+U_CAPI void * U_EXPORT2 |
+uprv_malloc(size_t s) { |
+ if (s > 0) { |
+ gHeapInUse = TRUE; |
+ if (pAlloc) { |
+ return (*pAlloc)(pContext, s); |
+ } else { |
+ return malloc(s); |
+ } |
+ } else { |
+ return (void *)zeroMem; |
+ } |
+} |
+ |
+U_CAPI void * U_EXPORT2 |
+uprv_realloc(void * buffer, size_t size) { |
+ if (buffer == zeroMem) { |
+ return uprv_malloc(size); |
+ } else if (size == 0) { |
+ if (pFree) { |
+ (*pFree)(pContext, buffer); |
+ } else { |
+ free(buffer); |
+ } |
+ return (void *)zeroMem; |
+ } else { |
+ gHeapInUse = TRUE; |
+ if (pRealloc) { |
+ return (*pRealloc)(pContext, buffer, size); |
+ } else { |
+ return realloc(buffer, size); |
+ } |
+ } |
+} |
+ |
+U_CAPI void U_EXPORT2 |
+uprv_free(void *buffer) { |
+ if (buffer != zeroMem) { |
+ if (pFree) { |
+ (*pFree)(pContext, buffer); |
+ } else { |
+ free(buffer); |
+ } |
+ } |
+} |
+ |
+U_CAPI void U_EXPORT2 |
+u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, UErrorCode *status) |
+{ |
+ if (U_FAILURE(*status)) { |
+ return; |
+ } |
+ if (a==NULL || r==NULL || f==NULL) { |
+ *status = U_ILLEGAL_ARGUMENT_ERROR; |
+ return; |
+ } |
+ if (gHeapInUse) { |
+ *status = U_INVALID_STATE_ERROR; |
+ return; |
+ } |
+ pContext = context; |
+ pAlloc = a; |
+ pRealloc = r; |
+ pFree = f; |
+} |
+ |
+ |
+U_CFUNC UBool cmemory_cleanup(void) { |
+ pContext = NULL; |
+ pAlloc = NULL; |
+ pRealloc = NULL; |
+ pFree = NULL; |
+ gHeapInUse = FALSE; |
+ return TRUE; |
+} |
+ |
+ |
+/* |
+ * gHeapInUse |
+ * Return True if ICU has allocated any memory. |
+ * Used by u_SetMutexFunctions() and similar to verify that ICU has not |
+ * been used, that it is in a pristine initial state. |
+ */ |
+U_CFUNC UBool cmemory_inUse() { |
+ return gHeapInUse; |
+} |
+ |
Property changes on: icu46/source/common/cmemory.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |