Author: stefan2
Date: Sun Feb 14 18:17:39 2016
New Revision: 1730365
URL: http://svn.apache.org/viewvc?rev=1730365&view=rev
Log:
In FSX, natively implement the new svn_fs_paths_changed3 API.
This still uses unbound memory but already eliminates the need for
additional copies and conversions.
* subversion/libsvn_fs_x/tree.c
(x_txn_changes_iterator_get,
txn_changes_iterator_vtable): Implement the iterator for in-txn changes.
(fs_revision_changes_iterator_data_t,
x_revision_changes_iterator_get,
rev_changes_iterator_vtable): Implement the iterator for in-rev changes.
(x_report_changes): Implement the vtable entry for svn_fs_paths_changed3.
(root_vtable): Enable the new API implementation and temporarily disable
the old one. This enforces FSX tests to use the new API
entirely.
Modified:
subversion/trunk/subversion/libsvn_fs_x/tree.c
Modified: subversion/trunk/subversion/libsvn_fs_x/tree.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/tree.c?rev=1730365&r1=1730364&r2=1730365&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/tree.c Sun Feb 14 18:17:39 2016
@@ -2385,6 +2385,101 @@ x_paths_changed(apr_hash_t **changed_pat
return SVN_NO_ERROR;
}
+/* Implement changes_iterator_vtable_t.get for in-txn change lists.
+ There is no specific FSAP data type, a simple APR hash iterator
+ to the underlying collection is sufficient. */
+static svn_error_t *
+x_txn_changes_iterator_get(svn_fs_path_change3_t **change,
+ svn_fs_path_change_iterator_t *iterator)
+{
+ apr_hash_index_t *hi = iterator->fsap_data;
+
+ if (hi)
+ {
+ *change = apr_hash_this_val(hi);
+ iterator->fsap_data = apr_hash_next(hi);
+ }
+ else
+ {
+ *change = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static changes_iterator_vtable_t txn_changes_iterator_vtable =
+{
+ x_txn_changes_iterator_get
+};
+
+/* FSAP data structure for in-revision changes list iterators. */
+typedef struct fs_revision_changes_iterator_data_t
+{
+ /* Changes to send. */
+ apr_array_header_t *changes;
+
+ /* Current indexes within CHANGES. */
+ int idx;
+} fs_revision_changes_iterator_data_t;
+
+static svn_error_t *
+x_revision_changes_iterator_get(svn_fs_path_change3_t **change,
+ svn_fs_path_change_iterator_t *iterator)
+{
+ fs_revision_changes_iterator_data_t *data = iterator->fsap_data;
+
+ if (data->idx < data->changes->nelts)
+ {
+ *change = APR_ARRAY_IDX(data->changes, data->idx,
+ svn_fs_x__change_t *);
+ ++data->idx;
+ }
+ else
+ {
+ *change = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static changes_iterator_vtable_t rev_changes_iterator_vtable =
+{
+ x_revision_changes_iterator_get
+};
+
+static svn_error_t *
+x_report_changes(svn_fs_path_change_iterator_t **iterator,
+ svn_fs_root_t *root,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_path_change_iterator_t *result = apr_pcalloc(result_pool,
+ sizeof(*result));
+ if (root->is_txn_root)
+ {
+ apr_hash_t *changed_paths;
+ SVN_ERR(svn_fs_x__txn_changes_fetch(&changed_paths, root->fs,
+ svn_fs_x__root_txn_id(root),
+ result_pool));
+
+ result->fsap_data = apr_hash_first(result_pool, changed_paths);
+ result->vtable = &txn_changes_iterator_vtable;
+ }
+ else
+ {
+ fs_revision_changes_iterator_data_t *data = apr_pcalloc(result_pool,
+ sizeof(*data));
+ SVN_ERR(svn_fs_x__get_changes(&data->changes, root->fs, root->rev,
+ result_pool));
+
+ result->fsap_data = data;
+ result->vtable = &rev_changes_iterator_vtable;
+ }
+
+ *iterator = result;
+
+ return SVN_NO_ERROR;
+}
/* Our coolio opaque history object. */
@@ -3214,8 +3309,8 @@ x_get_mergeinfo(svn_mergeinfo_catalog_t
/* The vtable associated with root objects. */
static root_vtable_t root_vtable = {
- x_paths_changed,
NULL,
+ x_report_changes,
svn_fs_x__check_path,
x_node_history,
x_node_id,