Author: hwright
Date: Thu Jan 19 20:46:50 2012
New Revision: 1233565

URL: http://svn.apache.org/viewvc?rev=1233565&view=rev
Log:
Create a stream which is wrapped around a spillbuffer.

* subversion/include/private/svn_subr_private.h
  (svn_stream__from_spillbuf): New.
 
* subversion/libsvn_subr/spillbuf.c
  (spillbuf_baton, read_handler_spillbuf, write_handler_spillbuf,
   svn_stream__from_spillbuf): New.

* subversion/tests/libsvn_subr/spillbuf-test.c
  (test_spillbuf_stream): New.
  (test_funcs): Run the new test.

Modified:
    subversion/trunk/subversion/include/private/svn_subr_private.h
    subversion/trunk/subversion/libsvn_subr/spillbuf.c
    subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c

Modified: subversion/trunk/subversion/include/private/svn_subr_private.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_subr_private.h?rev=1233565&r1=1233564&r2=1233565&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_subr_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_subr_private.h Thu Jan 19 
20:46:50 2012
@@ -25,6 +25,7 @@
 #define SVN_SUBR_PRIVATE_H
 
 #include "svn_types.h"
+#include "svn_io.h"
 
 
 #ifdef __cplusplus
@@ -188,6 +189,16 @@ svn_spillbuf__reader_write(svn_spillbuf_
                            apr_size_t len,
                            apr_pool_t *scratch_pool);
 
+
+/* Return a stream built on top of a spillbuf, using the same arguments as
+   svn_spillbuf__create().  This stream can be used for reading and writing,
+   but implements the same basic sematics of a spillbuf for the underlying
+   storage. */
+svn_stream_t *
+svn_stream__from_spillbuf(apr_size_t blocksize,
+                          apr_size_t maxsize,
+                          apr_pool_t *result_pool);
+
 /** @} */
 
 

Modified: subversion/trunk/subversion/libsvn_subr/spillbuf.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/spillbuf.c?rev=1233565&r1=1233564&r2=1233565&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/spillbuf.c (original)
+++ subversion/trunk/subversion/libsvn_subr/spillbuf.c Thu Jan 19 20:46:50 2012
@@ -552,3 +552,56 @@ svn_spillbuf__reader_write(svn_spillbuf_
   return svn_error_trace(svn_spillbuf__write(&reader->buf, data, len,
                                              scratch_pool));
 }
+
+
+struct spillbuf_baton
+{
+  svn_spillbuf_reader_t *reader;
+  apr_pool_t *scratch_pool;
+};
+
+
+static svn_error_t *
+read_handler_spillbuf(void *baton, char *buffer, apr_size_t *len)
+{
+  struct spillbuf_baton *sb = baton;
+
+  SVN_ERR(svn_spillbuf__reader_read(len, sb->reader, buffer, *len,
+                                    sb->scratch_pool));
+
+  svn_pool_clear(sb->scratch_pool);
+  return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+write_handler_spillbuf(void *baton, const char *data, apr_size_t *len)
+{
+  struct spillbuf_baton *sb = baton;
+
+  SVN_ERR(svn_spillbuf__reader_write(sb->reader, data, *len, 
sb->scratch_pool));
+
+  svn_pool_clear(sb->scratch_pool);
+  return SVN_NO_ERROR;
+}
+
+
+svn_stream_t *
+svn_stream__from_spillbuf(apr_size_t blocksize,
+                          apr_size_t maxsize,
+                          apr_pool_t *result_pool)
+{
+  svn_stream_t *stream;
+  struct spillbuf_baton *sb = apr_pcalloc(result_pool, sizeof(*sb));
+
+  sb->reader = svn_spillbuf__reader_create(blocksize, maxsize, result_pool);
+  sb->scratch_pool = svn_pool_create(result_pool);
+
+  stream = svn_stream_create(sb, result_pool);
+
+  svn_stream_set_read(stream, read_handler_spillbuf);
+  svn_stream_set_write(stream, write_handler_spillbuf);
+
+
+  return stream;
+}

Modified: subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c?rev=1233565&r1=1233564&r2=1233565&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c Thu Jan 19 
20:46:50 2012
@@ -277,6 +277,55 @@ test_spillbuf_reader(apr_pool_t *pool)
 }
 
 
+static svn_error_t *
+test_spillbuf_stream(apr_pool_t *pool)
+{
+  svn_stream_t *stream = svn_stream__from_spillbuf(8 /* blocksize */,
+                                                   15 /* maxsize */,
+                                                   pool);
+  char readbuf[256];
+  apr_size_t readlen;
+  apr_size_t writelen;
+
+  writelen = 6;
+  SVN_ERR(svn_stream_write(stream, "abcdef", &writelen));
+  SVN_ERR(svn_stream_write(stream, "ghijkl", &writelen));
+  /* now: two blocks of 8 and 4 bytes  */
+
+  readlen = 8;
+  SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+  SVN_TEST_ASSERT(readlen == 8
+                  && memcmp(readbuf, "abcdefgh", 8) == 0);
+  /* now: one block of 4 bytes  */
+
+  SVN_ERR(svn_stream_write(stream, "mnopqr", &writelen));
+  /* now: two blocks of 8 and 2 bytes  */
+
+  SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+  SVN_TEST_ASSERT(readlen == 8
+                  && memcmp(readbuf, "ijklmnop", 8) == 0);
+  /* now: one block of 2 bytes  */
+
+  SVN_ERR(svn_stream_write(stream, "stuvwx", &writelen));
+  SVN_ERR(svn_stream_write(stream, "ABCDEF", &writelen));
+  SVN_ERR(svn_stream_write(stream, "GHIJKL", &writelen));
+  /* now: two blocks of 8 and 6 bytes, and 6 bytes spilled to a file  */
+
+  SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+  SVN_TEST_ASSERT(readlen == 8
+                  && memcmp(readbuf, "qrstuvwx", 8) == 0);
+  readlen = 6;
+  SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+  SVN_TEST_ASSERT(readlen == 6
+                  && memcmp(readbuf, "ABCDEF", 6) == 0);
+  SVN_ERR(svn_stream_read(stream, readbuf, &readlen));
+  SVN_TEST_ASSERT(readlen == 6
+                  && memcmp(readbuf, "GHIJKL", 6) == 0);
+
+  return SVN_NO_ERROR;
+}
+
+
 /* The test table.  */
 struct svn_test_descriptor_t test_funcs[] =
   {
@@ -287,5 +336,6 @@ struct svn_test_descriptor_t test_funcs[
     SVN_TEST_PASS2(test_spillbuf_interleaving,
                    "interleaving reads and writes"),
     SVN_TEST_PASS2(test_spillbuf_reader, "spill buffer reader test"),
+    SVN_TEST_PASS2(test_spillbuf_stream, "spill buffer stream test"),
     SVN_TEST_NULL
   };


Reply via email to