summaryrefslogtreecommitdiff
path: root/subversion/libsvn_subr/pool.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_subr/pool.c')
-rw-r--r--subversion/libsvn_subr/pool.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/subversion/libsvn_subr/pool.c b/subversion/libsvn_subr/pool.c
index db57a6e9f9817..5fd80a7a83ccd 100644
--- a/subversion/libsvn_subr/pool.c
+++ b/subversion/libsvn_subr/pool.c
@@ -26,12 +26,14 @@
#include <stdlib.h>
#include <stdio.h>
+#include <apr.h>
+#include <apr_version.h>
#include <apr_general.h>
#include <apr_pools.h>
-#include <apr_thread_mutex.h>
#include "svn_pools.h"
+#include "pools.h"
#if APR_POOL_DEBUG
/* file_line for the non-debug case. */
@@ -52,6 +54,13 @@ abort_on_pool_failure(int retcode)
/* Don't translate this string! It requires memory allocation to do so!
And we don't have any of it... */
printf("libsvn: Out of memory - terminating application.\n");
+
+#ifdef WIN32
+ /* Provide a way to distinguish the out-of-memory error from abort(). */
+ if (retcode == APR_ENOMEM)
+ RaiseException(STATUS_NO_MEMORY, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+
abort();
return 0; /* not reached */
}
@@ -140,3 +149,24 @@ svn_pool_create_allocator(svn_boolean_t thread_safe)
return allocator;
}
+
+
+/*
+ * apr_pool_create_core_ex was introduced in APR 1.3.0, then
+ * deprecated and renamed to apr_pool_create_unmanaged_ex in 1.3.3.
+ * Since our minimum requirement is APR 1.3.0, one or the other of
+ * these functions will always be available.
+ */
+#if !APR_VERSION_AT_LEAST(1,3,3)
+#define apr_pool_create_unmanaged_ex apr_pool_create_core_ex
+#endif
+
+/* Private function that creates an unmanaged pool. */
+apr_pool_t *
+svn_pool__create_unmanaged(svn_boolean_t thread_safe)
+{
+ apr_pool_t *pool;
+ apr_pool_create_unmanaged_ex(&pool, abort_on_pool_failure,
+ svn_pool_create_allocator(thread_safe));
+ return pool;
+}