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
};