Author: brane
Date: Thu Aug 1 06:24:37 2013
New Revision: 1509090
URL: http://svn.apache.org/r1509090
Log:
Add spill-all-data functionality to spillbufs.
* subversion/include/private/svn_subr_private.h
(svn_spillbuf__create_extended): New spillbuf constructor.
* subversion/libsvn_subr/spillbuf.c
(init_spillbuf_extended, init_spillbuf): Fix thinko: the temp_path field is
set in in svn_spillbuf__write and should not be initialized.
(svn_spillbuf__create_extended): Implement.
(svn_spillbuf__write): Optionally write the in-memory contents to the
newly created spill file.
* subversion/tests/libsvn_subr/spillbuf-test.c
(test_spillbuf__basic, test_spillbuf_basic_spill_all,
test_spillbuf__callback, test_spillbuf_callback_spill_all,
test_spillbuf__file, test_spillbuf_file_spill_all,
test_spillbuf__interleaving, test_spillbuf_interleaving_spill_all,
test_spillbuf__rwfile, test_spillbuf_rwfile_spill_all,
test_spillbuf__eof, test_spillbuf_eof_spill_all): New tests and helpers.
(test_funcs): Add new tests.
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=1509090&r1=1509089&r2=1509090&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_subr_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_subr_private.h Thu Aug 1
06:24:37 2013
@@ -94,6 +94,14 @@ svn_spillbuf__create(apr_size_t blocksiz
apr_size_t maxsize,
apr_pool_t *result_pool);
+/* Create a spill buffer, with extra parameters. */
+svn_spillbuf_t *
+svn_spillbuf__create_extended(apr_size_t blocksize,
+ apr_size_t maxsize,
+ svn_boolean_t delete_on_close,
+ svn_boolean_t spill_all_contents,
+ const char* dirpath,
+ apr_pool_t *result_pool);
/* Determine how much content is stored in the spill buffer. */
svn_filesize_t
Modified: subversion/trunk/subversion/libsvn_subr/spillbuf.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/spillbuf.c?rev=1509090&r1=1509089&r2=1509090&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/spillbuf.c (original)
+++ subversion/trunk/subversion/libsvn_subr/spillbuf.c Thu Aug 1 06:24:37 2013
@@ -121,7 +121,6 @@ init_spillbuf_extended(svn_spillbuf_t *b
svn_boolean_t delete_on_close,
svn_boolean_t spill_all_contents,
const char* dirpath,
- const char* temp_path,
apr_pool_t *result_pool)
{
buf->pool = result_pool;
@@ -130,7 +129,6 @@ init_spillbuf_extended(svn_spillbuf_t *b
buf->delete_on_close = delete_on_close;
buf->spill_all_contents = spill_all_contents;
buf->dirpath = dirpath;
- buf->temp_path = temp_path;
}
/* Common constructor for initializing spillbufs.
@@ -142,7 +140,7 @@ init_spillbuf(svn_spillbuf_t *buf,
apr_pool_t *result_pool)
{
init_spillbuf_extended(buf, blocksize, maxsize,
- TRUE, FALSE, NULL, NULL,
+ TRUE, FALSE, NULL,
result_pool);
}
@@ -157,6 +155,21 @@ svn_spillbuf__create(apr_size_t blocksiz
}
+svn_spillbuf_t *
+svn_spillbuf__create_extended(apr_size_t blocksize,
+ apr_size_t maxsize,
+ svn_boolean_t delete_on_close,
+ svn_boolean_t spill_all_contents,
+ const char* dirpath,
+ apr_pool_t *result_pool)
+{
+ svn_spillbuf_t *buf = apr_pcalloc(result_pool, sizeof(*buf));
+ init_spillbuf_extended(buf, blocksize, maxsize,
+ delete_on_close, spill_all_contents, dirpath,
+ result_pool);
+ return buf;
+}
+
svn_filesize_t
svn_spillbuf__get_size(const svn_spillbuf_t *buf)
{
@@ -221,6 +234,19 @@ svn_spillbuf__write(svn_spillbuf_t *buf,
? svn_io_file_del_on_close
: svn_io_file_del_none),
buf->pool, scratch_pool));
+
+ /* Optionally write the memory contents into the file. */
+ if (buf->spill_all_contents && buf->head != NULL)
+ {
+ mem = buf->head;
+ while (mem != NULL)
+ {
+ SVN_ERR(svn_io_file_write_full(buf->spill, mem->data, mem->size,
+ NULL, scratch_pool));
+ mem = mem->next;
+ }
+ buf->spill_start = buf->memory_size;
+ }
}
/* Once a spill file has been constructed, then we need to put all
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=1509090&r1=1509089&r2=1509090&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/spillbuf-test.c Thu Aug 1
06:24:37 2013
@@ -57,10 +57,8 @@ check_read(svn_spillbuf_t *buf,
static svn_error_t *
-test_spillbuf_basic(apr_pool_t *pool)
+test_spillbuf__basic(apr_pool_t *pool, apr_size_t len, svn_spillbuf_t *buf)
{
- apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
- svn_spillbuf_t *buf = svn_spillbuf__create(len, 10 * len, pool);
int i;
const char *readptr;
apr_size_t readlen;
@@ -87,6 +85,22 @@ test_spillbuf_basic(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_basic(apr_pool_t *pool)
+{
+ apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
+ svn_spillbuf_t *buf = svn_spillbuf__create(len, 10 * len, pool);
+ return test_spillbuf__basic(pool, len, buf);
+}
+
+static svn_error_t *
+test_spillbuf_basic_spill_all(apr_pool_t *pool)
+{
+ apr_size_t len = strlen(basic_data); /* Don't include basic_data's NUL */
+ svn_spillbuf_t *buf =
+ svn_spillbuf__create_extended(len, 10 * len, TRUE, TRUE, NULL, pool);
+ return test_spillbuf__basic(pool, len, buf);
+}
static svn_error_t *
read_callback(svn_boolean_t *stop,
@@ -107,12 +121,8 @@ read_callback(svn_boolean_t *stop,
static svn_error_t *
-test_spillbuf_callback(apr_pool_t *pool)
+test_spillbuf__callback(apr_pool_t *pool, svn_spillbuf_t *buf)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(
- sizeof(basic_data) /* blocksize */,
- 10 * sizeof(basic_data) /* maxsize */,
- pool);
int i;
int counter;
svn_boolean_t exhausted;
@@ -133,15 +143,31 @@ test_spillbuf_callback(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_file(apr_pool_t *pool)
+test_spillbuf_callback(apr_pool_t *pool)
{
- apr_size_t altsize = sizeof(basic_data) + 2;
svn_spillbuf_t *buf = svn_spillbuf__create(
- altsize /* blocksize */,
- 2 * sizeof(basic_data) /* maxsize */,
+ sizeof(basic_data) /* blocksize */,
+ 10 * sizeof(basic_data) /* maxsize */,
pool);
+ return test_spillbuf__callback(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_callback_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ sizeof(basic_data) /* blocksize */,
+ 10 * sizeof(basic_data) /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__callback(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf__file(apr_pool_t *pool, apr_size_t altsize, svn_spillbuf_t *buf)
+{
int i;
const char *readptr;
apr_size_t readlen;
@@ -203,14 +229,33 @@ test_spillbuf_file(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_file(apr_pool_t *pool)
+{
+ apr_size_t altsize = sizeof(basic_data) + 2;
+ svn_spillbuf_t *buf = svn_spillbuf__create(
+ altsize /* blocksize */,
+ 2 * sizeof(basic_data) /* maxsize */,
+ pool);
+ return test_spillbuf__file(pool, altsize, buf);
+}
static svn_error_t *
-test_spillbuf_interleaving(apr_pool_t *pool)
+test_spillbuf_file_spill_all(apr_pool_t *pool)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(8 /* blocksize */,
- 15 /* maxsize */,
- pool);
+ apr_size_t altsize = sizeof(basic_data) + 2;
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ altsize /* blocksize */,
+ 2 * sizeof(basic_data) /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__file(pool, altsize, buf);
+}
+static svn_error_t *
+test_spillbuf__interleaving(apr_pool_t *pool, svn_spillbuf_t* buf)
+{
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
/* now: two blocks: 8 and 4 bytes */
@@ -238,6 +283,26 @@ test_spillbuf_interleaving(apr_pool_t *p
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_interleaving(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create(8 /* blocksize */,
+ 15 /* maxsize */,
+ pool);
+ return test_spillbuf__interleaving(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_interleaving_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 8 /* blocksize */,
+ 15 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__interleaving(pool, buf);
+}
static svn_error_t *
test_spillbuf_reader(apr_pool_t *pool)
@@ -319,14 +384,9 @@ test_spillbuf_stream(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_rwfile(apr_pool_t *pool)
+test_spillbuf__rwfile(apr_pool_t *pool, svn_spillbuf_t *buf)
{
- svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
- 10 /* maxsize */,
- pool);
-
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "mnopqr", 6, pool));
@@ -360,14 +420,30 @@ test_spillbuf_rwfile(apr_pool_t *pool)
return SVN_NO_ERROR;
}
-
static svn_error_t *
-test_spillbuf_eof(apr_pool_t *pool)
+test_spillbuf_rwfile(apr_pool_t *pool)
{
svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
10 /* maxsize */,
pool);
+ return test_spillbuf__rwfile(pool, buf);
+}
+static svn_error_t *
+test_spillbuf_rwfile_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 4 /* blocksize */,
+ 10 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__rwfile(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf__eof(apr_pool_t *pool, svn_spillbuf_t *buf)
+{
SVN_ERR(svn_spillbuf__write(buf, "abcdef", 6, pool));
SVN_ERR(svn_spillbuf__write(buf, "ghijkl", 6, pool));
/* now: two blocks: 4 and 2 bytes, and 6 bytes in spill file. */
@@ -415,19 +491,51 @@ test_spillbuf_eof(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_spillbuf_eof(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create(4 /* blocksize */,
+ 10 /* maxsize */,
+ pool);
+ return test_spillbuf__eof(pool, buf);
+}
+
+static svn_error_t *
+test_spillbuf_eof_spill_all(apr_pool_t *pool)
+{
+ svn_spillbuf_t *buf = svn_spillbuf__create_extended(
+ 4 /* blocksize */,
+ 10 /* maxsize */,
+ TRUE /* delte on close */,
+ TRUE /* spill all data */,
+ NULL, pool);
+ return test_spillbuf__eof(pool, buf);
+}
/* The test table. */
struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_spillbuf_basic, "basic spill buffer test"),
+ SVN_TEST_PASS2(test_spillbuf_basic_spill_all,
+ "basic spill buffer test (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_callback, "spill buffer read callback"),
+ SVN_TEST_PASS2(test_spillbuf_callback_spill_all,
+ "spill buffer read callback (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_file, "spill buffer file test"),
+ SVN_TEST_PASS2(test_spillbuf_file_spill_all,
+ "spill buffer file test (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_interleaving,
"interleaving reads and writes"),
+ SVN_TEST_PASS2(test_spillbuf_interleaving_spill_all,
+ "interleaving reads and writes (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_reader, "spill buffer reader test"),
SVN_TEST_PASS2(test_spillbuf_stream, "spill buffer stream test"),
SVN_TEST_PASS2(test_spillbuf_rwfile, "read/write spill file"),
+ SVN_TEST_PASS2(test_spillbuf_rwfile_spill_all,
+ "read/write spill file (spill-all-data)"),
SVN_TEST_PASS2(test_spillbuf_eof, "validate reaching EOF of spill file"),
+ SVN_TEST_PASS2(test_spillbuf_eof_spill_all,
+ "validate reaching EOF (spill-all-data)"),
SVN_TEST_NULL
};