[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r995478 [1/2] - in /subversion/branches/performance: ./ subversion/bindings/javahl/native/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ subversion/bindings/javahl/src/org/tigris/subversion/javahl/ subversion/bindings/j

From: Hyrum Wright <hwright_at_apache.org>
Date: Thu, 9 Sep 2010 11:08:21 -0500

On Thu, Sep 9, 2010 at 10:59 AM, <hwright_at_apache.org> wrote:
> Author: hwright
> Date: Thu Sep  9 15:59:00 2010
> New Revision: 995478
>
> URL: http://svn.apache.org/viewvc?rev=995478&view=rev
> Log:
> On the performance branch:
> Bring up-to-date with trunk.
...
> Modified: subversion/branches/performance/subversion/libsvn_subr/io.c
> URL: http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_subr/io.c?rev=995478&r1=995477&r2=995478&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/libsvn_subr/io.c (original)
> +++ subversion/branches/performance/subversion/libsvn_subr/io.c Thu Sep  9 15:59:00 2010
> @@ -1076,14 +1076,19 @@ svn_error_t *svn_io_file_create(const ch
>  {
>   apr_file_t *f;
>   apr_size_t written;
> +  svn_error_t *err;
>
>   SVN_ERR(svn_io_file_open(&f, file,
>                            (APR_WRITE | APR_CREATE | APR_EXCL),
>                            APR_OS_DEFAULT,
>                            pool));
> -  SVN_ERR(svn_io_file_write_full(f, contents, strlen(contents),
> -                                 &written, pool));
> -  return svn_io_file_close(f, pool);
> +  err= svn_io_file_write_full(f, contents, strlen(contents),
> +                              &written, pool);
> +
> +
> +  return svn_error_return(
> +                        svn_error_compose_create(err,
> +                                                 svn_io_file_close(f, pool)));
>  }
>
>  svn_error_t *svn_io_dir_file_copy(const char *src_path,
> @@ -2952,12 +2957,19 @@ svn_io_write_unique(const char **tmp_pat
>                     apr_pool_t *pool)
>  {
>   apr_file_t *new_file;
> +  svn_error_t *err;
>
>   SVN_ERR(svn_io_open_unique_file3(&new_file, tmp_path, dirpath,
>                                    delete_when, pool, pool));
> -  SVN_ERR(svn_io_file_write_full(new_file, buf, nbytes, NULL, pool));
> -  SVN_ERR(svn_io_file_flush_to_disk(new_file, pool));
> -  return svn_io_file_close(new_file, pool);
> +
> +  err = svn_io_file_write_full(new_file, buf, nbytes, NULL, pool);
> +
> +  if (!err)
> +    err = svn_io_file_flush_to_disk(new_file, pool);
> +
> +  return svn_error_return(
> +                  svn_error_compose_create(err,
> +                                           svn_io_file_close(new_file, pool)));
>  }
>
>
> @@ -3521,15 +3533,17 @@ svn_io_read_version_file(int *version,
>   apr_file_t *format_file;
>   char buf[80];
>   apr_size_t len;
> +  svn_error_t *err;
>
>   /* Read a chunk of data from PATH */
>   SVN_ERR(svn_io_file_open(&format_file, path, APR_READ,
>                            APR_OS_DEFAULT, pool));
>   len = sizeof(buf);
> -  SVN_ERR(svn_io_file_read(format_file, buf, &len, pool));
> +  err = svn_io_file_read(format_file, buf, &len, pool);
>
>   /* Close the file. */
> -  SVN_ERR(svn_io_file_close(format_file, pool));
> +  SVN_ERR(svn_error_compose_create(err,
> +                                   svn_io_file_close(format_file, pool)));
>
>   /* If there was no data in PATH, return an error. */
>   if (len == 0)
> @@ -3556,7 +3570,7 @@ svn_io_read_version_file(int *version,
>   }
>
>   /* Convert to integer. */
> -  *version = atoi(buf);
> +  SVN_ERR(svn_cstring_atoi(version, buf));
>
>   return SVN_NO_ERROR;
>  }
> @@ -3570,40 +3584,65 @@ contents_identical_p(svn_boolean_t *iden
>                      const char *file2,
>                      apr_pool_t *pool)
>  {
> +  svn_error_t *err;
>   apr_size_t bytes_read1, bytes_read2;
>   char *buf1 = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE);
>   char *buf2 = apr_palloc(pool, SVN__STREAM_CHUNK_SIZE);
>   apr_file_t *file1_h = NULL;
>   apr_file_t *file2_h = NULL;
> +  svn_boolean_t done1 = FALSE;
> +  svn_boolean_t done2 = FALSE;
>
>   SVN_ERR(svn_io_file_open(&file1_h, file1, APR_READ, APR_OS_DEFAULT,
>                            pool));
> -  SVN_ERR(svn_io_file_open(&file2_h, file2, APR_READ, APR_OS_DEFAULT,
> -                           pool));
> +
> +  err = svn_io_file_open(&file2_h, file2, APR_READ, APR_OS_DEFAULT,
> +                         pool);
> +
> +  if (err)
> +    return svn_error_return(
> +               svn_error_compose_create(err,
> +                                        svn_io_file_close(file1_h, pool)));
>
>   *identical_p = TRUE;  /* assume TRUE, until disproved below */
> -  do
> +  while (! (done1 || done2))
>     {
> -      SVN_ERR(svn_io_file_read_full2(file1_h, buf1,
> -                                     SVN__STREAM_CHUNK_SIZE, &bytes_read1,
> -                                     TRUE, pool));
> -      SVN_ERR(svn_io_file_read_full2(file2_h, buf2,
> -                                     SVN__STREAM_CHUNK_SIZE, &bytes_read2,
> -                                     TRUE, pool));
> +      err = svn_io_file_read_full(file1_h, buf1,
> +                                  SVN__STREAM_CHUNK_SIZE, &bytes_read1, pool);

Stefan,
This call, and the one following, needed to revert back to
svn_io_file_read_full(), since read_full2() was being stuck in an
infinite loop. Perhaps you can investigate?

> +      if (err && APR_STATUS_IS_EOF(err->apr_err))
> +        {
> +          svn_error_clear(err);
> +          err = NULL;
> +          done1 = TRUE;
> +        }
> +      else if (err)
> +        break;
> +
> +      err = svn_io_file_read_full(file2_h, buf2,
> +                                  SVN__STREAM_CHUNK_SIZE, &bytes_read2, pool);
> +      if (err && APR_STATUS_IS_EOF(err->apr_err))
> +        {
> +          svn_error_clear(err);
> +          err = NULL;
> +          done2 = TRUE;
> +        }
> +      else if (err)
> +        break;
>
>       if ((bytes_read1 != bytes_read2)
> +          || (done1 != done2)
>           || (memcmp(buf1, buf2, bytes_read1)))
>         {
>           *identical_p = FALSE;
>           break;
>         }
> -      /* The read_full functions are supposed to read until either the
> -         buffer has been completely filled or EOF has been accountered.
> -         Hence, the following check reliably tests for EOF. */
> -    } while (bytes_read1 == SVN__STREAM_CHUNK_SIZE);
> +    }
>
> -  SVN_ERR(svn_io_file_close(file1_h, pool));
> -  return svn_io_file_close(file2_h, pool);
> +  return svn_error_return(
> +           svn_error_compose_create(
> +                err,
> +                svn_error_compose_create(svn_io_file_close(file1_h, pool),
> +                                         svn_io_file_close(file2_h, pool))));
>  }
Received on 2010-09-09 18:09:01 CEST

This is an archived mail posted to the Subversion Dev mailing list.