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 2014/06/24 22:56:24 UTC

svn commit: r1605188 - /subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c

Author: stefan2
Date: Tue Jun 24 20:56:24 2014
New Revision: 1605188

URL: http://svn.apache.org/r1605188
Log:
Slightly reduce the memory usage when writing to and reading from
changed path lists caches.  Since APR arrays are glorified memory
buffers with their structure being part of the ABI, we can read
and write them directly.

* subversion/libsvn_fs_fs/temp_serializer.c
  (svn_fs_fs__serialize_changes): Directly serialize from the
                                  array's data buffer.
  (svn_fs_fs__deserialize_changes): Use the copy already handed into
                                    this function as the array's buffer.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c?rev=1605188&r1=1605187&r2=1605188&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c Tue Jun 24 20:56:24 2014
@@ -1148,13 +1148,10 @@ svn_fs_fs__serialize_changes(void **data
   svn_stringbuf_t *serialized;
   int i;
 
-  /* initialize our auxiliary data structure */
+  /* initialize our auxiliary data structure and link it to the
+   * array elements */
   changes.count = array->nelts;
-  changes.changes = apr_palloc(pool, sizeof(change_t*) * changes.count);
-
-  /* populate it with the array elements */
-  for (i = 0; i < changes.count; ++i)
-    changes.changes[i] = APR_ARRAY_IDX(array, i, change_t*);
+  changes.changes = (change_t **)array->elts;
 
   /* serialize it and all its elements */
   context = svn_temp_serializer__init(&changes,
@@ -1188,19 +1185,21 @@ svn_fs_fs__deserialize_changes(void **ou
 {
   int i;
   changes_data_t *changes = (changes_data_t *)data;
-  apr_array_header_t *array = apr_array_make(pool, changes->count,
-                                             sizeof(change_t *));
+  apr_array_header_t *array = apr_array_make(pool, 0, sizeof(change_t *));
 
   /* de-serialize our auxiliary data structure */
   svn_temp_deserializer__resolve(changes, (void**)&changes->changes);
 
   /* de-serialize each entry and add it to the array */
   for (i = 0; i < changes->count; ++i)
-    {
-      deserialize_change(changes->changes,
-                         (change_t **)&changes->changes[i]);
-      APR_ARRAY_PUSH(array, change_t *) = changes->changes[i];
-    }
+    deserialize_change(changes->changes,
+                       (change_t **)&changes->changes[i]);
+
+  /* Use the changes buffer as the array's data buffer
+   * (DATA remains valid for at least as long as POOL). */
+  array->elts = (char *)changes->changes;
+  array->nelts = changes->count;
+  array->nalloc = changes->count;
 
   /* done */
   *out = array;