On 06.04.21 21:14, Daniel Shahaf wrote:
Stefan Fuhrmann wrote on Mon, Apr 05, 2021 at 21:17:23 +0200:
+static svn_error_t *output_processed(
+ svn_task__t **task,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_task__t *current = *task;
+ root_t *root = current->root;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ output_t *output;
+ callbacks_t *callbacks;
+
+ while (current && is_processed(current))
+ {
+ svn_pool_clear(iterpool);
+ if (current->first_sub)
+ {
+ current = current->first_sub;
+ output = current->output;
+ callbacks = current->parent->callbacks;
+ if (output && output->prior_parent_output)
+ SVN_ERR(callbacks->output_func(
+ current->parent, output->prior_parent_output,
+ callbacks->output_baton,
+ cancel_func, cancel_baton,
+ result_pool, iterpool));
FWIW: The pre-order of outputs surprised me. When I read that in the
docstring in r1888446 I thought it was a typo for "post-order", but it's
not.
Actually, it is mainly post-order with optional pre-order outputs.
The original docstring is wrong there. r1888523 hopefully clarifies that.
+ }
+ else
+ {
+ output_t *output = current->output;
+ if (output)
+ {
+ svn_error_t *err = output->error;
+ output->error = SVN_NO_ERROR;
+ SVN_ERR(err);
+
+ callbacks = current->callbacks;
+ if (output->output)
+ SVN_ERR(callbacks->output_func(
+ current, output->output,
+ callbacks->output_baton,
+ cancel_func, cancel_baton,
+ result_pool, iterpool));
+ }
+
+ /* The output function may have added additional sub-tasks. */
+ if (!current->first_sub)
+ {
+ svn_task__t *to_delete = current;
+ current = to_delete->parent;
+ remove_task(to_delete);
Error leak. Cf. tools/dev/warn-ignored-err.sh.
Yep. Fixed in r1888520.
Thank you for the review!
-- Stefan^2.