stef...@apache.org wrote on Sat, Aug 14, 2010 at 13:20:22 -0000:
> Author: stefan2
> Date: Sat Aug 14 13:20:22 2010
> New Revision: 985487
> 
> URL: http://svn.apache.org/viewvc?rev=985487&view=rev
> Log:
> APR file I/O is a high frequency operation as the respective streams directly 
> map their requests
> onto the file layer. Thus, introduce svn_io_file_putc() as symmetrical 
> counterpart to *_getc()
> and use both for single char read requests because their APR implementation 
> tends to involve
> far less overhead.
> 
> Also, introduce and use svn_io_file_read_full2 that optionally doesn't create 
> an error object
> upon EOF that may be discarded by the caller anyways. This actually 
> translates into significant
> runtime savings because constructing the svn_error_t for file errors involves 
> expensive locale
> dependent functions.
> 
> * subversion/include/svn_io.h
>   (svn_io_file_putc, svn_io_file_read_full2): declare new API functions
> * subversion/libsvn_subr/svn_io.c
>   (svn_io_file_putc, svn_io_file_read_full2): implement new API functions
> * subversion/libsvn_subr/stream.c
>   (read_handler_apr, write_handler_apr): use the I/O function best suitable 
> for the request
> 
> Modified:
>     subversion/branches/performance/subversion/include/svn_io.h
>     subversion/branches/performance/subversion/libsvn_subr/io.c
>     subversion/branches/performance/subversion/libsvn_subr/stream.c
> 
> Modified: subversion/branches/performance/subversion/include/svn_io.h
> URL: 
> http://svn.apache.org/viewvc/subversion/branches/performance/subversion/include/svn_io.h?rev=985487&r1=985486&r2=985487&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/include/svn_io.h (original)
> +++ subversion/branches/performance/subversion/include/svn_io.h Sat Aug 14 
> 13:20:22 2010
> @@ -1745,6 +1745,15 @@ svn_io_file_getc(char *ch,
>                   apr_pool_t *pool);
>  
>  
> +/** Wrapper for apr_file_putc(). 
> +  * @since New in 1.7
> +  */
> +svn_error_t *
> +svn_io_file_putc(char ch,
> +                 apr_file_t *file,
> +                 apr_pool_t *pool);
> +
> +
>  /** Wrapper for apr_file_info_get(). */
>  svn_error_t *
>  svn_io_file_info_get(apr_finfo_t *finfo,
> @@ -1770,6 +1779,20 @@ svn_io_file_read_full(apr_file_t *file,
>                        apr_pool_t *pool);
>  
>  
> +/** Wrapper for apr_file_read_full(). 
> + * If eof_is_ok is set, no svn_error_t error object
> + * will be created upon EOF.
> + * @since New in 1.7
> + */
> +svn_error_t *
> +svn_io_file_read_full2(apr_file_t *file,
> +                       void *buf,
> +                       apr_size_t nbytes,
> +                       apr_size_t *bytes_read,
> +                       svn_boolean_t eof_is_ok,
> +                       apr_pool_t *pool);
> +
> +

Why didn't you deprecate svn_io_file_read_full() in the same commit?

Usually we do it as follows:

+ the declaration of svn_io_file_read_full2() is *above* that
  of svn_io_file_read_full (not critical)
+ mark the old function SVN_DEPRECATED (preprocessor symbol) and
  doxygen @deprecated
+ change the doc string of the old function to be a diff against the new
  function's docs
+ in the appropriate *.c file, upgrade the definition in-place
+ re-define the old function in lib_$foo/deprecated.c as a wrapper around the
  new function

Why you didn't make svn_io_file_read_full() a deprecated wrapper around
svn_io_file_read_full2()?

Daniel

>  /** Wrapper for apr_file_seek(). */
>  svn_error_t *
>  svn_io_file_seek(apr_file_t *file,
> 
> Modified: subversion/branches/performance/subversion/libsvn_subr/io.c
> URL: 
> http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_subr/io.c?rev=985487&r1=985486&r2=985487&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/libsvn_subr/io.c (original)
> +++ subversion/branches/performance/subversion/libsvn_subr/io.c Sat Aug 14 
> 13:20:22 2010
> @@ -2856,6 +2856,17 @@ svn_io_file_getc(char *ch, apr_file_t *f
>  
>  
>  svn_error_t *
> +svn_io_file_putc(char ch, apr_file_t *file, apr_pool_t *pool)
> +{
> +  return do_io_file_wrapper_cleanup
> +    (file, apr_file_putc(ch, file),
> +     N_("Can't write file '%s'"),
> +     N_("Can't write stream"),
> +     pool);
> +}
> +
> +
> +svn_error_t *
>  svn_io_file_info_get(apr_finfo_t *finfo, apr_int32_t wanted,
>                       apr_file_t *file, apr_pool_t *pool)
>  {
> @@ -2893,6 +2904,24 @@ svn_io_file_read_full(apr_file_t *file, 
>  
>  
>  svn_error_t *
> +svn_io_file_read_full2(apr_file_t *file, void *buf,
> +                       apr_size_t nbytes, apr_size_t *bytes_read,
> +                       svn_boolean_t eof_is_ok,
> +                       apr_pool_t *pool)
> +{
> +  apr_status_t status = apr_file_read_full(file, buf, nbytes, bytes_read);
> +  if (APR_STATUS_IS_EOF(status) && eof_is_ok)
> +    return SVN_NO_ERROR;
> +
> +  return do_io_file_wrapper_cleanup
> +    (file, status,
> +     N_("Can't read file '%s'"),
> +     N_("Can't read stream"),
> +     pool);
> +}
> +
> +
> +svn_error_t *
>  svn_io_file_seek(apr_file_t *file, apr_seek_where_t where,
>                   apr_off_t *offset, apr_pool_t *pool)
>  {
> 
> Modified: subversion/branches/performance/subversion/libsvn_subr/stream.c
> URL: 
> http://svn.apache.org/viewvc/subversion/branches/performance/subversion/libsvn_subr/stream.c?rev=985487&r1=985486&r2=985487&view=diff
> ==============================================================================
> --- subversion/branches/performance/subversion/libsvn_subr/stream.c (original)
> +++ subversion/branches/performance/subversion/libsvn_subr/stream.c Sat Aug 
> 14 13:20:22 2010
> @@ -600,12 +600,15 @@ read_handler_apr(void *baton, char *buff
>    struct baton_apr *btn = baton;
>    svn_error_t *err;
>  
> -  err = svn_io_file_read_full(btn->file, buffer, *len, len, btn->pool);
> -  if (err && APR_STATUS_IS_EOF(err->apr_err))
> +  if (*len == 1)
>      {
> -      svn_error_clear(err);
> -      err = SVN_NO_ERROR;
> -    }
> +      err = svn_io_file_getc (buffer, btn->file, btn->pool);
> +      if (err)
> +        *len = 0;
> +    }
> +    else
> +      err = svn_io_file_read_full2(btn->file, buffer, *len, len, 
> +                                   TRUE, btn->pool);
>  
>    return err;
>  }
> @@ -614,8 +617,18 @@ static svn_error_t *
>  write_handler_apr(void *baton, const char *data, apr_size_t *len)
>  {
>    struct baton_apr *btn = baton;
> +  svn_error_t *err;
> +
> +  if (*len == 1)
> +    {
> +      err = svn_io_file_putc (*data, btn->file, btn->pool);
> +      if (err)
> +        *len = 0;
> +    }
> +    else
> +      err = svn_io_file_write_full(btn->file, data, *len, len, btn->pool);
>  
> -  return svn_io_file_write_full(btn->file, data, *len, len, btn->pool);
> +  return err;
>  }
>  
>  static svn_error_t *
> 
> 

Reply via email to