You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2011/10/10 19:40:57 UTC
svn commit: r1181090 - in /subversion/trunk/subversion: include/svn_sorts.h
libsvn_client/merge.c libsvn_subr/mergeinfo.c libsvn_subr/sorts.c
Author: pburba
Date: Mon Oct 10 17:40:57 2011
New Revision: 1181090
URL: http://svn.apache.org/viewvc?rev=1181090&view=rev
Log:
Follow-up to r1180154: svn_rangelist_merge2 optimization.
Suggested by: philip
* subversion/include/svn_sorts.h
(svn_sort__array_delete): Add an argument specifying the number of elements
to delete.
* subversion/libsvn_client/merge.c
(remove_absent_children,
remove_children_with_deleted_mergeinfo): Update calls to
svn_sort__array_delete.
* subversion/libsvn_subr/mergeinfo.c
(adjust_remaining_ranges): Make a single call to svn_sort__array_delete
rather than iterating over each deleted element.
* subversion/libsvn_subr/sorts.c
(svn_sort__array_delete): Add an argument specifying the number of elements
to delete.
Modified:
subversion/trunk/subversion/include/svn_sorts.h
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/libsvn_subr/mergeinfo.c
subversion/trunk/subversion/libsvn_subr/sorts.c
Modified: subversion/trunk/subversion/include/svn_sorts.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_sorts.h?rev=1181090&r1=1181089&r2=1181090&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_sorts.h (original)
+++ subversion/trunk/subversion/include/svn_sorts.h Mon Oct 10 17:40:57 2011
@@ -182,11 +182,15 @@ svn_sort__array_insert(const void *new_e
int insert_index);
-/* Remove the element at DELETE_INDEX from the array ARR.
- If DELETE_INDEX is not a valid element of ARR do nothing. */
+/* Remove ELEMENTS_TO_DELETE elements starting at DELETE_INDEX from the
+ array ARR. If DELETE_INDEX is not a valid element of ARR,
+ ELEMENTS_TO_DELETE is not greater than zero, or
+ DELETE_INDEX + ELEMENTS_TO_DELETE is grater than ARR->NELTS, then do
+ nothing. */
void
svn_sort__array_delete(apr_array_header_t *arr,
- int delete_index);
+ int delete_index,
+ int elements_to_delete);
#ifdef __cplusplus
}
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1181090&r1=1181089&r2=1181090&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Mon Oct 10 17:40:57 2011
@@ -4795,7 +4795,7 @@ remove_absent_children(const char *targe
if ((child->absent || child->scheduled_for_deletion)
&& svn_dirent_is_ancestor(target_wcpath, child->abspath))
{
- svn_sort__array_delete(children_with_mergeinfo, i--);
+ svn_sort__array_delete(children_with_mergeinfo, i--, 1);
}
}
}
@@ -4831,7 +4831,7 @@ remove_children_with_deleted_mergeinfo(m
child->abspath,
APR_HASH_KEY_STRING))
{
- svn_sort__array_delete(notify_b->children_with_mergeinfo, i--);
+ svn_sort__array_delete(notify_b->children_with_mergeinfo, i--, 1);
}
}
}
Modified: subversion/trunk/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/mergeinfo.c?rev=1181090&r1=1181089&r2=1181090&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/mergeinfo.c Mon Oct 10 17:40:57 2011
@@ -902,8 +902,7 @@ adjust_remaining_ranges(apr_array_header
}
if (elements_to_delete)
- for (i = starting_index; i < (elements_to_delete + starting_index); i++)
- svn_sort__array_delete(rangelist, starting_index);
+ svn_sort__array_delete(rangelist, starting_index, elements_to_delete);
}
svn_error_t *
Modified: subversion/trunk/subversion/libsvn_subr/sorts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sorts.c?rev=1181090&r1=1181089&r2=1181090&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sorts.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sorts.c Mon Oct 10 17:40:57 2011
@@ -248,21 +248,31 @@ svn_sort__array_insert(const void *new_e
void
svn_sort__array_delete(apr_array_header_t *arr,
- int delete_index)
+ int delete_index,
+ int elements_to_delete)
{
- /* Do we have a valid index? */
- if (delete_index >= 0 && delete_index < arr->nelts)
+ /* Do we have a valid index and are there enough elements? */
+ if (delete_index >= 0
+ && delete_index < arr->nelts
+ && elements_to_delete > 0
+ && (elements_to_delete + delete_index) <= arr->nelts)
{
if (delete_index == (arr->nelts - 1))
{
/* Deleting the last or only element in an array is easy. */
apr_array_pop(arr);
}
+ else if ((delete_index + elements_to_delete) == arr->nelts)
+ {
+ /* Delete the last ELEMENTS_TO_DELETE elements. */
+ arr->nelts -= elements_to_delete;
+ }
else
{
memmove(arr->elts + arr->elt_size * delete_index,
arr->elts + arr->elt_size * (delete_index + 1),
- arr->elt_size * (arr->nelts - 1 - delete_index));
+ arr->elt_size * (arr->nelts - 1 - delete_index)
+ * elements_to_delete);
--(arr->nelts);
}
}