Author: stefan2
Date: Sat Apr 27 16:21:10 2013
New Revision: 1476613

URL: http://svn.apache.org/r1476613
Log:
On the fsfs-format7 branch: add cache serialization support to string tables.

* subversion/libsvn_fs_fs/string_table.h
  (svn_fs_fs__serialize_string_table,
   svn_fs_fs__deserialize_string_table): declare (de-)serialization functions

* subversion/libsvn_fs_fs/string_table.c
  (svn_fs_fs__serialize_string_table,
   svn_fs_fs__deserialize_string_table): implement them

Modified:
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h

Modified: 
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c?rev=1476613&r1=1476612&r2=1476613&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c 
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c Sat 
Apr 27 16:21:10 2013
@@ -713,3 +713,86 @@ svn_fs_fs__read_string_table(string_tabl
 
   return SVN_NO_ERROR;
 }
+
+void
+svn_fs_fs__serialize_string_table(svn_temp_serializer__context_t *context,
+                                  string_table_t **st)
+{
+  apr_size_t i, k;
+  string_table_t *string_table = *st;
+  if (string_table == NULL)
+    return;
+
+  /* string table struct */
+  svn_temp_serializer__push(context,
+                            (const void * const *)st,
+                            sizeof(*string_table));
+
+  /* sub-table array (all structs in a single memory block) */
+  svn_temp_serializer__push(context,
+                            (const void * const *)&string_table->sub_tables,
+                            sizeof(*string_table->sub_tables) *
+                            string_table->size);
+
+  /* sub-elements of all sub-tables */
+  for (i = 0; i < string_table->size; ++i)
+    {
+      string_sub_table_t *sub_table = &string_table->sub_tables[i];
+      svn_temp_serializer__add_leaf(context,
+                                    (const void * const *)&sub_table->data,
+                                    sub_table->data_size);
+      svn_temp_serializer__add_leaf(context,
+                    (const void * const *)&sub_table->short_strings,
+                    sub_table->short_string_count * sizeof(string_header_t));
+
+      /* all "long string" instances form a single memory block */
+      svn_temp_serializer__push(context,
+                    (const void * const *)&sub_table->long_strings,
+                    sub_table->long_string_count * sizeof(svn_string_t));
+
+      /* serialize actual long string contents */
+      for (k = 0; k < sub_table->long_string_count; ++k)
+        {
+          svn_string_t *string = &sub_table->long_strings[k];
+          svn_temp_serializer__add_leaf(context,
+                                        (const void * const *)&string->data,
+                                        string->len + 1);
+        }
+        
+      svn_temp_serializer__pop(context);
+    }
+
+  /* back to the caller's nesting level */
+  svn_temp_serializer__pop(context);
+  svn_temp_serializer__pop(context);
+}
+
+void
+svn_fs_fs__deserialize_string_table(void *buffer,
+                                    string_table_t **table)
+{
+  apr_size_t i, k;
+  string_sub_table_t *sub_tables;
+  
+  svn_temp_deserializer__resolve(buffer, (void **)table);
+  if (*table == NULL)
+    return;
+
+  svn_temp_deserializer__resolve(*table, (void **)&(*table)->sub_tables);
+  sub_tables = (*table)->sub_tables;
+  for (i = 0; i < (*table)->size; ++i)
+    {
+      string_sub_table_t *sub_table = sub_tables + i;
+
+      svn_temp_deserializer__resolve(sub_tables,
+                                     (void **)&sub_table->data);
+      svn_temp_deserializer__resolve(sub_tables,
+                                     (void **)&sub_table->short_strings);
+      svn_temp_deserializer__resolve(sub_tables,
+                                     (void **)&sub_table->long_strings);
+
+      for (k = 0; k < sub_table->long_string_count; ++k)
+        svn_temp_deserializer__resolve(sub_table->long_strings,
+                               (void **)&sub_table->long_strings[k].data);
+    }
+}

Modified: 
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h?rev=1476613&r1=1476612&r2=1476613&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h 
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h Sat 
Apr 27 16:21:10 2013
@@ -24,6 +24,7 @@
 #define SVN_LIBSVN_FS_FS_STRING_TABLE_H
 
 #include "svn_io.h"
+#include "private/svn_temp_serializer.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -117,6 +118,18 @@ svn_fs_fs__read_string_table(string_tabl
                              apr_pool_t *result_pool,
                              apr_pool_t *scratch_pool); 
 
+/* Implements svn_cache__serialize_func_t for string_table_t objects.
+ */
+void
+svn_fs_fs__serialize_string_table(svn_temp_serializer__context_t *context,
+                                  string_table_t **st);
+
+/* Implements svn_cache__deserialize_func_t for string_table_t objects.
+ */
+void
+svn_fs_fs__deserialize_string_table(void *buffer,
+                                    string_table_t **table);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */


Reply via email to