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 */