svn commit: r1325478 - in /subversion/trunk/subversion: include/svn_pools.h libsvn_subr/pool.c

2012-04-12 Thread stefan2
Author: stefan2
Date: Thu Apr 12 20:02:36 2012
New Revision: 1325478

URL: http://svn.apache.org/viewvc?rev=1325478&view=rev
Log:
Introduce a new API function to create and initialize a new
APR pool allocator. Make its thread-safety properties
explicit in the docstring.

Will be used by the next commit to replace boilerplate code.

* subversion/include/svn_pools.h
  (svn_pool_create_allocator): declare new API function
* subversion/libsvn_subr/pool.c
  (svn_pool_create_allocator): declare new API function

Modified:
subversion/trunk/subversion/include/svn_pools.h
subversion/trunk/subversion/libsvn_subr/pool.c

Modified: subversion/trunk/subversion/include/svn_pools.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_pools.h?rev=1325478&r1=1325477&r2=1325478&view=diff
==
--- subversion/trunk/subversion/include/svn_pools.h (original)
+++ subversion/trunk/subversion/include/svn_pools.h Thu Apr 12 20:02:36 2012
@@ -30,7 +30,7 @@
 #ifndef SVN_POOLS_H
 #define SVN_POOLS_H
 
-#include 
+#include "svn_types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -86,6 +86,23 @@ svn_pool_create_ex_debug(pool, allocator
  */
 #define svn_pool_destroy apr_pool_destroy
 
+/** Return a new allocator.  This function limits the unused memory in the
+ * new allocator to @ref SVN_ALLOCATOR_RECOMMENDED_MAX_FREE and ensures
+ * proper synchronization if the allocator is used by multiple threads.
+ *
+ * If your application uses multiple threads, creating a separate allocator
+ * for each of these threads may not be feasible. Set the @a thread_safe
+ * parameter to @c TRUE in that case.  Pools will still not thread-safe, i.e.
+ * access to them may require explicit serialization.  Set the parameter to
+ * @c FALSE, otherwise, to maximize performance. 
+ * 
+ * To access the owner pool, which can also serve as the root pool for your
+ * sub-pools, call @c apr_allocator_get_owner().
+ *
+ * @since: New in 1.8
+ */
+apr_allocator_t *
+svn_pool_create_allocator(svn_boolean_t thread_safe);
 
 #ifdef __cplusplus
 }

Modified: subversion/trunk/subversion/libsvn_subr/pool.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/pool.c?rev=1325478&r1=1325477&r2=1325478&view=diff
==
--- subversion/trunk/subversion/libsvn_subr/pool.c (original)
+++ subversion/trunk/subversion/libsvn_subr/pool.c Thu Apr 12 20:02:36 2012
@@ -28,6 +28,7 @@
 
 #include 
 #include 
+#include 
 
 #include "svn_pools.h"
 
@@ -97,3 +98,44 @@ svn_pool_create_ex(apr_pool_t *pool, apr
 }
 
 #endif /* APR_POOL_DEBUG */
+
+apr_allocator_t *
+svn_pool_create_allocator(svn_boolean_t thread_safe)
+{
+  apr_allocator_t *allocator;
+  apr_pool_t *pool;
+
+  /* create the allocator and limit it's internal free list to keep
+   * memory usage in check */
+  
+  if (apr_allocator_create(&allocator))
+abort_on_pool_failure(EXIT_FAILURE);
+
+  apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
+
+  /* create the root pool */
+
+  pool = svn_pool_create_ex(NULL, allocator);
+  apr_allocator_owner_set(allocator, pool);
+
+#if APR_POOL_DEBUG
+  apr_pool_tag (pool, "svn root pool");
+#endif
+
+  /* By default, allocators are *not* thread-safe. We must provide a mutex
+   * if we want thread-safety for that mutex. */
+ 
+#if APR_HAS_THREADS
+  if (thread_safe)
+{
+  apr_thread_mutex_t *mutex;
+  apr_thread_mutex_create (&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
+  apr_allocator_mutex_set (allocator, mutex);
+}
+#endif
+
+  /* better safe than sorry */
+  SVN_ERR_ASSERT_NO_RETURN(allocator != NULL);
+  
+  return allocator;
+}




Re: svn commit: r1325478 - in /subversion/trunk/subversion: include/svn_pools.h libsvn_subr/pool.c

2012-04-13 Thread Daniel Shahaf
stef...@apache.org wrote on Thu, Apr 12, 2012 at 20:02:37 -:
> Author: stefan2
> Date: Thu Apr 12 20:02:36 2012
> New Revision: 1325478
> 
> URL: http://svn.apache.org/viewvc?rev=1325478&view=rev
> Log:
> Introduce a new API function to create and initialize a new
> APR pool allocator. Make its thread-safety properties
> explicit in the docstring.
> 
> Will be used by the next commit to replace boilerplate code.
> 
> * subversion/include/svn_pools.h
>   (svn_pool_create_allocator): declare new API function
> * subversion/libsvn_subr/pool.c
>   (svn_pool_create_allocator): declare new API function
> 
> Modified:
> subversion/trunk/subversion/include/svn_pools.h
> subversion/trunk/subversion/libsvn_subr/pool.c
> 
> Modified: subversion/trunk/subversion/include/svn_pools.h
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_pools.h?rev=1325478&r1=1325477&r2=1325478&view=diff
> ==
> --- subversion/trunk/subversion/include/svn_pools.h (original)
> +++ subversion/trunk/subversion/include/svn_pools.h Thu Apr 12 20:02:36 2012
> @@ -30,7 +30,7 @@
>  #ifndef SVN_POOLS_H
>  #define SVN_POOLS_H
>  
> -#include 
> +#include "svn_types.h"
>  
>  #ifdef __cplusplus
>  extern "C" {
> @@ -86,6 +86,23 @@ svn_pool_create_ex_debug(pool, allocator
>   */
>  #define svn_pool_destroy apr_pool_destroy
>  
> +/** Return a new allocator.  This function limits the unused memory in the
> + * new allocator to @ref SVN_ALLOCATOR_RECOMMENDED_MAX_FREE and ensures
> + * proper synchronization if the allocator is used by multiple threads.
> + *
> + * If your application uses multiple threads, creating a separate allocator
> + * for each of these threads may not be feasible. Set the @a thread_safe
> + * parameter to @c TRUE in that case.  Pools will still not thread-safe, i.e.
> + * access to them may require explicit serialization.  Set the parameter to
> + * @c FALSE, otherwise, to maximize performance. 
> + * 
> + * To access the owner pool, which can also serve as the root pool for your
> + * sub-pools, call @c apr_allocator_get_owner().
> + *
> + * @since: New in 1.8
> + */
> +apr_allocator_t *
> +svn_pool_create_allocator(svn_boolean_t thread_safe);

Should this be an svn-private API?  Should it take a parameter
that allows overriding the SVN_ALLOCATOR_RECOMMENDED_MAX_FREE default?