On Wed, Oct 7, 2015 at 3:02 PM, Ivan Zhakov <i...@visualsvn.com> wrote:

> On 7 October 2015 at 15:57, Stefan Fuhrmann
> <stefan.fuhrm...@wandisco.com> wrote:
> > On Wed, Oct 7, 2015 at 2:47 PM, Julian Foad <julianf...@gmail.com>
> wrote:
> >>
> >> Stefan wrote:
> >> > I guess the correct way of doing this is revert Ivan's
> >> > change and apply something like the attached patch.
> >> Ivan wrote:
> >> > Here is the patch that I wanted commit later. What do you think?
> >>
> >> I am not interested in reviewing any more patches that tweak just one
> >> of the implementations. If you (anybody) want to do something, please
> >> combine the two functions into one implementation, and then I will be
> >> interested in reviewing the (single) implementation.
> >
> >
> > Alright, here you go.
> >
> Hi Stefan,
>
> Are you sure that code in proposed patch compiles at least? :)
>

It does, GCC is quite lenient when it comes to pointer types ;)

But it has caused a few test failures. Here the final version.
If that doesn't work either then I'm done for today.

-- Stefan^2.
Index: subversion/libsvn_subr/stream.c
===================================================================
--- subversion/libsvn_subr/stream.c	(revision 1707288)
+++ subversion/libsvn_subr/stream.c	(working copy)
@@ -1488,21 +1488,25 @@
 {
 #define MIN_READ_SIZE 64
 
-  apr_size_t to_read = 0;
+  apr_size_t to_read, gotten;
   svn_stringbuf_t *text
-    = svn_stringbuf_create_ensure(len_hint + MIN_READ_SIZE,
+    = svn_stringbuf_create_ensure(len_hint ? len_hint : MIN_READ_SIZE,
                                   result_pool);
 
   do
     {
       to_read = text->blocksize - 1 - text->len;
-      SVN_ERR(svn_stream_read_full(stream, text->data + text->len, &to_read));
-      text->len += to_read;
+      if (to_read == 0)
+        {
+          svn_stringbuf_ensure(text, text->blocksize * 2);
+          to_read = text->blocksize - 1 - text->len;
+        }
 
-      if (to_read && text->blocksize < text->len + MIN_READ_SIZE)
-        svn_stringbuf_ensure(text, text->blocksize * 2);
+      gotten = to_read;
+      SVN_ERR(svn_stream_read_full(stream, text->data + text->len, &gotten));
+      text->len += gotten;
     }
-  while (to_read);
+  while (gotten == to_read);
 
   text->data[text->len] = '\0';
   *str = text;
@@ -1798,27 +1802,11 @@
                        apr_pool_t *result_pool,
                        apr_pool_t *scratch_pool)
 {
-  svn_stringbuf_t *work = svn_stringbuf_create_ensure(SVN__STREAM_CHUNK_SIZE,
-                                                      result_pool);
-  char *buffer = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE);
-
-  while (1)
-    {
-      apr_size_t len = SVN__STREAM_CHUNK_SIZE;
-
-      SVN_ERR(svn_stream_read_full(stream, buffer, &len));
-      svn_stringbuf_appendbytes(work, buffer, len);
-
-      if (len < SVN__STREAM_CHUNK_SIZE)
-        break;
-    }
-
+  svn_stringbuf_t *buffer;
+  SVN_ERR(svn_stringbuf_from_stream(&buffer, stream, 0, scratch_pool));
+  *result = svn_string_ncreate(buffer->data, buffer->len, result_pool);
   SVN_ERR(svn_stream_close(stream));
 
-  *result = apr_palloc(result_pool, sizeof(**result));
-  (*result)->data = work->data;
-  (*result)->len = work->len;
-
   return SVN_NO_ERROR;
 }
 

Reply via email to