On Wed, Oct 7, 2015 at 2:57 PM, 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. > Ugh, pitfall: svn_string_from_stream closes the stream after reading it. Updated patch. -- Stefan^2.
Index: subversion/libsvn_subr/stream.c =================================================================== --- subversion/libsvn_subr/stream.c (revision 1706628) +++ subversion/libsvn_subr/stream.c (working copy) @@ -1488,7 +1488,7 @@ { #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 ? len_hint : MIN_READ_SIZE, result_pool); @@ -1496,13 +1496,17 @@ 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,10 @@ 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); + 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); - 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_ERR(svn_stream_close(stream)); - - *result = apr_palloc(result_pool, sizeof(**result)); - (*result)->data = work->data; - (*result)->len = work->len; - return SVN_NO_ERROR; }