You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/03/25 21:27:12 UTC
svn commit: r927587 - /subversion/trunk/subversion/libsvn_subr/iter.c
Author: hwright
Date: Thu Mar 25 20:27:11 2010
New Revision: 927587
URL: http://svn.apache.org/viewvc?rev=927587&view=rev
Log:
When using APR >= 1.4.0, use the apr-provided hash iteration mechanisms.
Because we've already released our own hash iteration as a public API,
implement it using the apr function.
* subversion/libsvn_subr/iter.c
(hash_do_baton, hash_do_callback): New.
(svn_iter_apr_hash): If using APR >= 1.4.0, use apr_hash_do() to accomplish
hash iteration.
Modified:
subversion/trunk/subversion/libsvn_subr/iter.c
Modified: subversion/trunk/subversion/libsvn_subr/iter.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/iter.c?rev=927587&r1=927586&r2=927587&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/iter.c (original)
+++ subversion/trunk/subversion/libsvn_subr/iter.c Thu Mar 25 20:27:11 2010
@@ -23,6 +23,7 @@
#include "svn_iter.h"
#include "svn_pools.h"
+#include "private/svn_dep_compat.h"
#include "svn_error_codes.h"
@@ -36,6 +37,30 @@ static svn_error_t internal_break_error
__LINE__ /* line number */
};
+#if APR_VERSION_AT_LEAST(1, 4, 0)
+struct hash_do_baton
+{
+ void *baton;
+ svn_iter_apr_hash_cb_t func;
+ svn_error_t *err;
+ apr_pool_t *iterpool;
+};
+
+static
+int hash_do_callback(void *baton,
+ const void *key,
+ apr_ssize_t klen,
+ const void *value)
+{
+ struct hash_do_baton *hdb = baton;
+
+ svn_pool_clear(hdb->iterpool);
+ hdb->err = (*hdb->func)(hdb->baton, key, klen, (void *)value, hdb->iterpool);
+
+ return hdb->err == SVN_NO_ERROR;
+}
+#endif
+
svn_error_t *
svn_iter_apr_hash(svn_boolean_t *completed,
apr_hash_t *hash,
@@ -43,6 +68,36 @@ svn_iter_apr_hash(svn_boolean_t *complet
void *baton,
apr_pool_t *pool)
{
+#if APR_VERSION_AT_LEAST(1, 4, 0)
+ struct hash_do_baton hdb;
+ svn_boolean_t error_received;
+
+ hdb.func = func;
+ hdb.baton = baton;
+ hdb.iterpool = svn_pool_create(pool);
+
+ error_received = !apr_hash_do(hash_do_callback, &hdb, hash);
+
+ svn_pool_destroy(hdb.iterpool);
+
+ if (completed)
+ *completed = !error_received;
+
+ if (!error_received)
+ return SVN_NO_ERROR;
+
+ if (hdb.err->apr_err == SVN_ERR_ITER_BREAK
+ && hdb.err != &internal_break_error)
+ {
+ /* Errors - except those created by svn_iter_break() -
+ need to be cleared when not further propagated. */
+ svn_error_clear(hdb.err);
+
+ hdb.err = SVN_NO_ERROR;
+ }
+
+ return hdb.err;
+#else
svn_error_t *err = SVN_NO_ERROR;
apr_pool_t *iterpool = svn_pool_create(pool);
apr_hash_index_t *hi;
@@ -78,6 +133,7 @@ svn_iter_apr_hash(svn_boolean_t *complet
svn_pool_destroy(iterpool);
return err;
+#endif
}
svn_error_t *