You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/08/26 18:08:42 UTC
svn commit: r808083 - in /commons/sandbox/runtime/trunk/src/main/native:
include/acr_memory.h shared/memory.c
Author: mturk
Date: Wed Aug 26 16:08:41 2009
New Revision: 808083
URL: http://svn.apache.org/viewvc?rev=808083&view=rev
Log:
Add few handy array management utils
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr_memory.h
commons/sandbox/runtime/trunk/src/main/native/shared/memory.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_memory.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_memory.h?rev=808083&r1=808082&r2=808083&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_memory.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_memory.h Wed Aug 26 16:08:41 2009
@@ -139,6 +139,55 @@
ACR_DECLARE(void *) ACR_SbhCalloc(JNIEnv *env, const char *file, int line,
acr_sbh_t *sbh, acr_size_t size);
+/**
+ * Apache's "replacement" for the malloc() function that throws
+ * thejava.lang.OutOfMemoryError in case of failure.
+ * @param env Current JNI environment.
+ * @param size Allocation size
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @return Pointer to allocated memory.
+ */
+ACR_DECLARE(void *) ACR_Malloc(JNIEnv *env, const char *file, int line,
+ acr_size_t size);
+
+/**
+ * Allocate pointer array function that throws
+ * thejava.lang.OutOfMemoryError in case of failure.
+ * @param env Current JNI environment.
+ * @param size Allocation size
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @return Pointer to allocated array of pointers.
+ * @note Allocated pointers are set to NULL.
+ */
+ACR_DECLARE(void **) ACR_Aalloc(JNIEnv *env, const char *file, int line,
+ acr_size_t size);
+
+/**
+ * Free the array of pointers calling free on all array members.
+ * @param env Current JNI environment.
+ * @param array Pointer array to free
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called.
+ * @note Function calls free on each non NULL array member and stops
+ * on first NULL pointer. This means that pointer array must not
+ * be interleaved with NULL pointers.
+ */
+ACR_DECLARE(void) ACR_Afree(JNIEnv *env, const char *file, int line,
+ void **array);
+
+/**
+ * Count the number of non NULL elemenst in the array.
+ * @param array Pointer array to use.
+ * @note Use this function only with arrays allocated with ACR_Aalloc
+ * or with the array that have terminating NULL pointer. If the
+ * array is not NULL terminated the function will go beyond array
+ * size leading to faulty results.
+ * In case NULL is provided for array the function returns zero.
+ */
+ACR_DECLARE(size_t) ACR_Asize(const void * const *array);
+
#ifdef __cplusplus
}
#endif
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/memory.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/memory.c?rev=808083&r1=808082&r2=808083&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/memory.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/memory.c Wed Aug 26 16:08:41 2009
@@ -253,6 +253,60 @@
free(sbh);
}
+ACR_DECLARE(void **) ACR_Aalloc(JNIEnv *_E, const char *file, int line,
+ size_t size)
+{
+ void **arr = x_calloc((size + 1) * sizeof(void *));
+
+ if (!arr) {
+ int err = ACR_GET_OS_ERROR();
+ if (_E == NULL)
+ _E = ACR_GetJNIEnv();
+ if (IS_VALID_HANDLE(_E))
+ ACR_ThrowException(_E, file, line, ACR_EX_ENOMEM, err);
+ }
+ return arr;
+}
+
+ACR_DECLARE(void) ACR_Afree(JNIEnv *_E, const char *file, int line,
+ void **arr)
+{
+ void **ptr = arr;
+ if (IS_INVALID_HANDLE(arr)) {
+ if (_E == NULL)
+ _E = ACR_GetJNIEnv();
+ if (IS_VALID_HANDLE(_E))
+ ACR_ThrowException(_E, file, line, ACR_EX_ENULL,
+ ACR_EISNULL);
+ }
+ else {
+ while (*ptr != NULL)
+ free(*(ptr++));
+ free(arr);
+ }
+}
+
+ACR_DECLARE(size_t) ACR_Asize(const void * const *arr)
+{
+ const void * const *ptr = arr;
+ if (arr) {
+ size_t len = 0;
+ while (*ptr != NULL) {
+ ptr++;
+ len++;
+#if defined (DEBUG)
+ if (len > (SIZE_T_MAX / 2)) {
+ /* This is probably ubterminated array
+ */
+ return 0;
+ }
+#endif
+ }
+ return len;
+ }
+ else
+ return 0;
+}
static int memory_pointer_cleanup(void *mem, size_t unused)
{