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 2013/03/01 23:22:24 UTC
svn commit: r1451738 -
/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
Author: stefan2
Date: Fri Mar 1 22:22:24 2013
New Revision: 1451738
URL: http://svn.apache.org/r1451738
Log:
On the fsfs-format7 branch: Fix bugs in the string table implemenation
discovered by our new unit tests.
* subversion/libsvn_fs_fs/string_table.c
(insert_string): buggy remaining table capacity calculation
(svn_fs_fs__string_table_builder_add): the default match length is 0
(create_table): pick delta base from tree order not insert order
(table_copy_string): handle an edge case
(svn_fs_fs__string_table_get): result got lost
Modified:
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
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=1451738&r1=1451737&r2=1451738&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 Fri Mar 1 22:22:24 2013
@@ -205,9 +205,13 @@ insert_string(builder_table_t *table,
to_insert->next_match_len
= match_length(¤t->string, &to_insert->string);
current->previous_match_len = to_insert->next_match_len;
-
- table->max_data_size -= MIN(to_insert->previous_match_len,
- to_insert->next_match_len);
+
+ table->max_data_size -= to_insert->string.len;
+ if (to_insert->previous == NULL)
+ table->max_data_size += to_insert->next_match_len;
+ else
+ table->max_data_size += MIN(to_insert->previous_match_len,
+ to_insert->next_match_len);
return to_insert->position;
}
@@ -242,8 +246,12 @@ insert_string(builder_table_t *table,
= match_length(¤t->string, &to_insert->string);
current->next_match_len = to_insert->previous_match_len;
- table->max_data_size -= MIN(to_insert->previous_match_len,
- to_insert->next_match_len);
+ table->max_data_size -= to_insert->string.len;
+ if (to_insert->next == NULL)
+ table->max_data_size += to_insert->previous_match_len;
+ else
+ table->max_data_size += MIN(to_insert->previous_match_len,
+ to_insert->next_match_len);
return to_insert->position;
}
@@ -295,8 +303,8 @@ svn_fs_fs__string_table_builder_add(stri
builder_string_t *item = apr_pcalloc(builder->pool, sizeof(*item));
item->string.data = string;
item->string.len = len;
- item->previous_match_len = APR_SIZE_MAX;
- item->next_match_len = APR_SIZE_MAX;
+ item->previous_match_len = 0;
+ item->next_match_len = 0;
if ( table->long_strings->nelts == MAX_STRINGS_PER_TABLE
|| table->max_data_size < len)
@@ -349,13 +357,8 @@ create_table(string_sub_table_t *target,
string_header_t *tail_match;
apr_size_t head_length = string->previous_match_len;
- int base = i - 1;
- if (head_length)
- while ( base >= 0
- && target->short_strings[i].head_length >= head_length)
- --base;
-
- entry->head_string = (apr_uint16_t)base;
+ entry->head_string
+ = (apr_uint16_t)(head_length ? string->previous->position : 0);
entry->head_length = (apr_uint16_t)head_length;
entry->tail_length
= (apr_uint16_t)(string->string.len - entry->head_length);
@@ -418,10 +421,14 @@ table_copy_string(char *buffer,
while (to_copy)
{
- memcpy(buffer + header->head_length,
- table->data + header->tail_start,
- len - header->head_length);
- to_copy = header->head_length;
+ if (header->head_length < to_copy)
+ {
+ memcpy(buffer + header->head_length,
+ table->data + header->tail_start,
+ to_copy - header->head_length);
+ to_copy = header->head_length;
+ }
+
header = &table->short_strings[header->head_string];
}
@@ -455,6 +462,8 @@ svn_fs_fs__string_table_get(const string
apr_size_t len = header->head_length + header->tail_length + 1;
char *result = apr_palloc(pool, len);
table_copy_string(result, len, sub_table, header);
+
+ return result;
}
}
}