You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2011/02/08 03:37:04 UTC

svn commit: r1068254 - in /subversion/branches/integrate-string-improvements: ./ subversion/include/svn_string.h subversion/libsvn_delta/svndiff.c subversion/libsvn_subr/svn_string.c

Author: stefan2
Date: Tue Feb  8 02:37:04 2011
New Revision: 1068254

URL: http://svn.apache.org/viewvc?rev=1068254&view=rev
Log:
Introduce svn_stringbuf_create_empty() and use that to optimize
stream decompression.

Merged revisions from /branches/performance:
985673, 985673, 1029339 (svn_string.h only)

Modified:
    subversion/branches/integrate-string-improvements/   (props changed)
    subversion/branches/integrate-string-improvements/subversion/include/svn_string.h   (contents, props changed)
    subversion/branches/integrate-string-improvements/subversion/libsvn_delta/svndiff.c
    subversion/branches/integrate-string-improvements/subversion/libsvn_subr/svn_string.c

Propchange: subversion/branches/integrate-string-improvements/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb  8 02:37:04 2011
@@ -27,7 +27,7 @@
 /subversion/branches/log-g-performance:870941-871032
 /subversion/branches/merge-skips-obstructions:874525-874615
 /subversion/branches/nfc-nfd-aware-client:870276,870376
-/subversion/branches/performance:979193,980118,981087,981684,982043,982355,983764,983766,984927,984973,984984,985014,985037,985046,985472,985477,985482,985500,985606,985669,986453,987888,987893,988319,990541,990568,990572,990600,990759,992899,992911,993127,993141,994956,995478,995507,995603,998858,999098,1001413,1001417,1004291,1022668,1022670,1022676,1022715,1022719,1025660,1025672,1027193,1027203,1027206,1027214,1027227,1028077,1028092,1028094,1028104,1028107,1028111,1028354,1029038,1029042-1029043,1029078,1029080,1029090,1029092-1029093,1029111,1029151,1029158,1029232,1029335,1029340,1029342,1029344,1030763,1030827,1031203,1031235,1032285,1032333,1033040,1033057,1033294,1035869,1039511,1043705,1053735,1056015,1066452,1067683
+/subversion/branches/performance:979193,980118,981087,981684,982043,982355,983764,983766,984927,984973,984984,985014,985037,985046,985472,985477,985482,985500,985606,985669,985673,985697,986453,987888,987893,988319,990541,990568,990572,990600,990759,992899,992911,993127,993141,994956,995478,995507,995603,998858,999098,1001413,1001417,1004291,1022668,1022670,1022676,1022715,1022719,1025660,1025672,1027193,1027203,1027206,1027214,1027227,1028077,1028092,1028094,1028104,1028107,1028111,1028354,1029038,1029042-1029043,1029078,1029080,1029090,1029092-1029093,1029111,1029151,1029158,1029232,1029335,1029340,1029342,1029344,1030763,1030827,1031203,1031235,1032285,1032333,1033040,1033057,1033294,1035869,1039511,1043705,1053735,1056015,1066452,1067683
 /subversion/branches/py-tests-as-modules:956579-1033052
 /subversion/branches/ra_serf-digest-authn:875693-876404
 /subversion/branches/reintegrate-improvements:873853-874164

Modified: subversion/branches/integrate-string-improvements/subversion/include/svn_string.h
URL: http://svn.apache.org/viewvc/subversion/branches/integrate-string-improvements/subversion/include/svn_string.h?rev=1068254&r1=1068253&r2=1068254&view=diff
==============================================================================
--- subversion/branches/integrate-string-improvements/subversion/include/svn_string.h (original)
+++ subversion/branches/integrate-string-improvements/subversion/include/svn_string.h Tue Feb  8 02:37:04 2011
@@ -196,6 +196,12 @@ svn_stringbuf_create(const char *cstring
 svn_stringbuf_t *
 svn_stringbuf_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool);
 
+/** Create a truely empty string object (length and blocksize are 0)
+ * @since New in 1.7.
+ */
+svn_stringbuf_t *
+svn_stringbuf_create_empty(apr_pool_t *pool);
+
 /** Create a new empty bytestring with at least @a minimum_size bytes of
  * space available in the memory block.
  *

Propchange: subversion/branches/integrate-string-improvements/subversion/include/svn_string.h
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Feb  8 02:37:04 2011
@@ -0,0 +1,46 @@
+/subversion/branches/1.5.x-r30215/subversion/include/svn_string.h:870312
+/subversion/branches/atomic-revprop/subversion/include/svn_string.h:965046-1000689
+/subversion/branches/bdb-reverse-deltas/subversion/include/svn_string.h:872050-872529
+/subversion/branches/diff-callbacks3/subversion/include/svn_string.h:870059-870761
+/subversion/branches/diff-optimizations/subversion/include/svn_string.h:1031270-1037352
+/subversion/branches/diff-optimizations-bytes/subversion/include/svn_string.h:1037353-1067789
+/subversion/branches/dont-save-plaintext-passwords-by-default/subversion/include/svn_string.h:870728-871118
+/subversion/branches/double-delete/subversion/include/svn_string.h:870511-872970
+/subversion/branches/explore-wc/subversion/include/svn_string.h:875486,875493,875497,875507,875511,875514,875559,875580-875581,875584,875587,875611,875627,875647,875667-875668,875711-875712,875733-875734,875736,875744-875748,875751,875758,875782,875795-875796,875830,875836,875838,875842,875852,875855,875864,875870,875873,875880,875885-875888,875890,875897-875898,875905,875907-875909,875935,875943-875944,875946,875979,875982-875983,875985-875986,875990,875997
+/subversion/branches/file-externals/subversion/include/svn_string.h:871779-873302
+/subversion/branches/fs-rep-sharing/subversion/include/svn_string.h:869036-873803
+/subversion/branches/fsfs-pack/subversion/include/svn_string.h:873717-874575
+/subversion/branches/gnome-keyring/subversion/include/svn_string.h:870558-871410
+/subversion/branches/http-protocol-v2/subversion/include/svn_string.h:874395-876041
+/subversion/branches/in-memory-cache/subversion/include/svn_string.h:869829-871452
+/subversion/branches/integrate-cache-membuffer/subversion/include/svn_string.h:998649-998852
+/subversion/branches/issue-2779-dev/subversion/include/svn_string.h:965496-984198
+/subversion/branches/issue-2843-dev/subversion/include/svn_string.h:871432-874179
+/subversion/branches/issue-3000/subversion/include/svn_string.h:871713,871716-871719,871721-871726,871728,871734
+/subversion/branches/issue-3067-deleted-subtrees/subversion/include/svn_string.h:873375-874084
+/subversion/branches/issue-3148-dev/subversion/include/svn_string.h:875193-875204
+/subversion/branches/issue-3220-dev/subversion/include/svn_string.h:872210-872226
+/subversion/branches/issue-3242-dev/subversion/include/svn_string.h:879653-896436
+/subversion/branches/issue-3334-dirs/subversion/include/svn_string.h:875156-875867
+/subversion/branches/issue-3668-3669/subversion/include/svn_string.h:1031000-1035744
+/subversion/branches/kwallet/subversion/include/svn_string.h:870785-871314
+/subversion/branches/log-g-performance/subversion/include/svn_string.h:870941-871032
+/subversion/branches/merge-skips-obstructions/subversion/include/svn_string.h:874525-874615
+/subversion/branches/nfc-nfd-aware-client/subversion/include/svn_string.h:870276,870376
+/subversion/branches/performance/subversion/include/svn_string.h:979193,980118,981087,981684,982043,982355,983764,983766,984927,984973,984984,985014,985037,985046,985472,985477,985482,985500,985606,985669,985673,985697,986453,987888,987893,988319,990541,990568,990572,990600,990759,992899,992911,993127,993141,994956,995478,995507,995603,998858,999098,1001413,1001417,1004291,1022668,1022670,1022676,1022715,1022719,1025660,1025672,1027193,1027203,1027206,1027214,1027227,1028077,1028092,1028094,1028104,1028107,1028111,1028354,1029038,1029042-1029043,1029078,1029080,1029090,1029092-1029093,1029111,1029151,1029158,1029232,1029335,1029339-1029340,1029342,1029344,1030763,1030827,1031203,1031235,1032285,1032333,1033040,1033057,1033294,1035869,1039511,1043705,1053735,1056015,1066452,1067683
+/subversion/branches/py-tests-as-modules/subversion/include/svn_string.h:956579-1033052
+/subversion/branches/ra_serf-digest-authn/subversion/include/svn_string.h:875693-876404
+/subversion/branches/reintegrate-improvements/subversion/include/svn_string.h:873853-874164
+/subversion/branches/subtree-mergeinfo/subversion/include/svn_string.h:876734-878766
+/subversion/branches/svn-mergeinfo-enhancements/subversion/include/svn_string.h:870119-870195,870197-870288
+/subversion/branches/svn-patch-improvements/subversion/include/svn_string.h:918519-934609
+/subversion/branches/svnpatch-diff/subversion/include/svn_string.h:865738-876477
+/subversion/branches/svnraisetc/subversion/include/svn_string.h:874709-875149
+/subversion/branches/svnserve-logging/subversion/include/svn_string.h:869828-870893
+/subversion/branches/tc-issue-3334/subversion/include/svn_string.h:874697-874773
+/subversion/branches/tc-merge-notify/subversion/include/svn_string.h:874017-874062
+/subversion/branches/tc-resolve/subversion/include/svn_string.h:874191-874239
+/subversion/branches/tc_url_rev/subversion/include/svn_string.h:874351-874483
+/subversion/branches/tree-conflicts/subversion/include/svn_string.h:868291-873154
+/subversion/branches/tree-conflicts-notify/subversion/include/svn_string.h:873926-874008
+/subversion/branches/uris-as-urls/subversion/include/svn_string.h:1060426-1064427

Modified: subversion/branches/integrate-string-improvements/subversion/libsvn_delta/svndiff.c
URL: http://svn.apache.org/viewvc/subversion/branches/integrate-string-improvements/subversion/libsvn_delta/svndiff.c?rev=1068254&r1=1068253&r2=1068254&view=diff
==============================================================================
--- subversion/branches/integrate-string-improvements/subversion/libsvn_delta/svndiff.c (original)
+++ subversion/branches/integrate-string-improvements/subversion/libsvn_delta/svndiff.c Tue Feb  8 02:37:04 2011
@@ -180,9 +180,9 @@ window_handler(svn_txdelta_window_t *win
 {
   struct encoder_baton *eb = baton;
   apr_pool_t *pool = svn_pool_create(eb->pool);
-  svn_stringbuf_t *instructions = svn_stringbuf_create("", pool);
-  svn_stringbuf_t *i1 = svn_stringbuf_create("", pool);
-  svn_stringbuf_t *header = svn_stringbuf_create("", pool);
+  svn_stringbuf_t *instructions = svn_stringbuf_create_empty(pool);
+  svn_stringbuf_t *i1 = svn_stringbuf_create_empty(pool);
+  svn_stringbuf_t *header = svn_stringbuf_create_empty(pool);
   const svn_string_t *newdata;
   unsigned char ibuf[MAX_INSTRUCTION_LEN], *ip;
   const svn_txdelta_op_t *op;
@@ -251,7 +251,7 @@ window_handler(svn_txdelta_window_t *win
   append_encoded_int(header, instructions->len);
   if (eb->version == 1)
     {
-      svn_stringbuf_t *temp = svn_stringbuf_create("", pool);
+      svn_stringbuf_t *temp = svn_stringbuf_create_empty(pool);
       svn_string_t *tempstr = svn_string_create("", pool);
       SVN_ERR(zlib_encode(window->new_data->data, window->new_data->len,
                           temp));
@@ -414,20 +414,21 @@ decode_size(apr_size_t *val,
   return NULL;
 }
 
-/* Decode the possibly-zlib compressed string that is in IN, into OUT.
-   We expect an integer is prepended to IN that specifies the original
-   size, and that if encoded size == original size, that the remaining
-   data is not compressed.  */
+/* Decode the possibly-zlib compressed string of length INLEN that is in
+   IN, into OUT.  We expect an integer is prepended to IN that specifies
+   the original size, and that if encoded size == original size, that the
+   remaining data is not compressed.  An error is returned if the decoded
+   length exceeds the given LIMIT.*/
 static svn_error_t *
-zlib_decode(svn_stringbuf_t *in, svn_stringbuf_t *out, apr_size_t limit)
+zlib_decode(const unsigned char *in, apr_size_t inLen, svn_stringbuf_t *out,
+            apr_size_t limit)
 {
   apr_size_t len;
-  char *oldplace = in->data;
+  const unsigned char *oldplace = in;
 
   /* First thing in the string is the original length.  */
-  in->data = (char *)decode_size(&len, (unsigned char *)in->data,
-                                 (unsigned char *)in->data+in->len);
-  if (in->data == NULL)
+  in = decode_size(&len, in, in + inLen);
+  if (in == NULL)
     return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA, NULL,
                             _("Decompression of svndiff data failed: no size"));
   if (len > limit)
@@ -436,33 +437,36 @@ zlib_decode(svn_stringbuf_t *in, svn_str
                               "size too large"));
   /* We need to subtract the size of the encoded original length off the
    *      still remaining input length.  */
-  in->len -= (in->data - oldplace);
-  if (in->len == len)
+  inLen -= (in - oldplace);
+  if (inLen == len)
     {
-      svn_stringbuf_appendstr(out, in);
+      /* "in" is no longer used but the memory remains allocated for
+       * at least as long as "out" will be used by the caller.
+       */
+      out->data = (char *)in;
+      out->len = len;
+      out->blocksize = len; /* sic! */
+
       return SVN_NO_ERROR;
     }
   else
     {
-      unsigned long zliblen;
+      unsigned long zlen = len;
 
       svn_stringbuf_ensure(out, len);
-
-      zliblen = len;
-      if (uncompress  ((unsigned char *)out->data, &zliblen,
-                       (const unsigned char *)in->data, in->len) != Z_OK)
+      if (uncompress((unsigned char *)out->data, &zlen, in, inLen) != Z_OK)
         return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA,
                                 NULL,
                                 _("Decompression of svndiff data failed"));
 
       /* Zlib should not produce something that has a different size than the
          original length we stored. */
-      if (zliblen != len)
+      if (zlen != len)
         return svn_error_create(SVN_ERR_SVNDIFF_INVALID_COMPRESSED_DATA,
                                 NULL,
                                 _("Size of uncompressed data "
                                   "does not match stored original length"));
-      out->len = zliblen;
+      out->len = zlen;
     }
   return SVN_NO_ERROR;
 }
@@ -610,16 +614,13 @@ decode_window(svn_txdelta_window_t *wind
 
   if (version == 1)
     {
-      svn_stringbuf_t *instin, *ndin;
-      svn_stringbuf_t *instout, *ndout;
+      svn_stringbuf_t *instout = svn_stringbuf_create_empty(pool);
+      svn_stringbuf_t *ndout = svn_stringbuf_create_empty(pool);
 
-      instin = svn_stringbuf_ncreate((const char *)data, insend - data, pool);
-      instout = svn_stringbuf_create("", pool);
-      SVN_ERR(zlib_decode(instin, instout, MAX_INSTRUCTION_SECTION_LEN));
-
-      ndin = svn_stringbuf_ncreate((const char *)insend, newlen, pool);
-      ndout = svn_stringbuf_create("", pool);
-      SVN_ERR(zlib_decode(ndin, ndout, SVN_DELTA_WINDOW_SIZE));
+      SVN_ERR(zlib_decode(insend, newlen, ndout,
+                          SVN_DELTA_WINDOW_SIZE));
+      SVN_ERR(zlib_decode(data, insend - data, instout,
+                          MAX_INSTRUCTION_SECTION_LEN));
 
       newlen = ndout->len;
       data = (unsigned char *)instout->data;
@@ -829,7 +830,7 @@ svn_txdelta_parse_svndiff(svn_txdelta_wi
   db->consumer_baton = handler_baton;
   db->pool = subpool;
   db->subpool = svn_pool_create(subpool);
-  db->buffer = svn_stringbuf_create("", db->subpool);
+  db->buffer = svn_stringbuf_create_empty(db->subpool);
   db->last_sview_offset = 0;
   db->last_sview_len = 0;
   db->header_bytes = 0;

Modified: subversion/branches/integrate-string-improvements/subversion/libsvn_subr/svn_string.c
URL: http://svn.apache.org/viewvc/subversion/branches/integrate-string-improvements/subversion/libsvn_subr/svn_string.c?rev=1068254&r1=1068253&r2=1068254&view=diff
==============================================================================
--- subversion/branches/integrate-string-improvements/subversion/libsvn_subr/svn_string.c (original)
+++ subversion/branches/integrate-string-improvements/subversion/libsvn_subr/svn_string.c Tue Feb  8 02:37:04 2011
@@ -28,7 +28,6 @@
 #include <apr.h>
 
 #include <string.h>      /* for memcpy(), memcmp(), strlen() */
-#include <apr_lib.h>     /* for apr_isspace() */
 #include <apr_fnmatch.h>
 #include "svn_string.h"  /* loads "svn_types.h" and <apr_pools.h> */
 #include "svn_ctype.h"
@@ -248,6 +247,12 @@ create_stringbuf(char *data, apr_size_t 
 }
 
 svn_stringbuf_t *
+svn_stringbuf_create_empty(apr_pool_t *pool)
+{
+  return create_stringbuf((char*)"", 0, 0, pool);
+}
+
+svn_stringbuf_t *
 svn_stringbuf_create_ensure(apr_size_t blocksize, apr_pool_t *pool)
 {
   char *data;