dovecot: Code cleanup / optimization
dovecot at dovecot.org
dovecot at dovecot.org
Thu Jun 14 04:57:26 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/615a8c31ff47
changeset: 5737:615a8c31ff47
user: Timo Sirainen <tss at iki.fi>
date: Thu Jun 14 04:57:22 2007 +0300
description:
Code cleanup / optimization
diffstat:
1 file changed, 26 insertions(+), 41 deletions(-)
src/lib-index/mail-cache-compress.c | 67 +++++++++++++----------------------
diffs (109 lines):
diff -r b3ed52bbeca7 -r 615a8c31ff47 src/lib-index/mail-cache-compress.c
--- a/src/lib-index/mail-cache-compress.c Thu Jun 14 04:40:34 2007 +0300
+++ b/src/lib-index/mail-cache-compress.c Thu Jun 14 04:57:22 2007 +0300
@@ -17,45 +17,27 @@ struct mail_cache_copy_context {
struct mail_cache *cache;
buffer_t *buffer, *field_seen;
+ ARRAY_DEFINE(bitmask_pos, unsigned int);
uint8_t field_seen_value;
bool new_msg;
};
-static void mail_cache_merge_bitmask(struct mail_cache *cache, buffer_t *buffer,
- uint32_t field, const void *data,
- size_t data_size)
-{
- void *buf_data;
- uint32_t buf_field;
- unsigned int i, buf_data_size;
- size_t pos, buf_size;
-
- buf_data = buffer_get_modifiable_data(buffer, &buf_size);
- for (pos = sizeof(struct mail_cache_record); pos < buf_size; ) {
- buf_field = *((uint32_t *)PTR_OFFSET(buf_data, pos));
- pos += sizeof(uint32_t);
- i_assert(buf_field < cache->fields_count);
-
- buf_data_size = cache->fields[buf_field].field.field_size;
- if (buf_data_size == (unsigned int)-1) {
- buf_data_size =
- *((uint32_t *)PTR_OFFSET(buf_data, pos));
- pos += sizeof(uint32_t);
- }
-
- if (buf_field == field) {
- /* @UNSAFE: found it, do the merging */
- unsigned char *dest = PTR_OFFSET(buf_data, pos);
-
- i_assert(buf_data_size == data_size);
- i_assert(pos + buf_data_size <= buf_size);
- for (i = 0; i < buf_data_size; i++)
- dest[i] |= ((const unsigned char*)data)[i];
- break;
- }
- pos += (buf_data_size + 3) & ~3;
- i_assert(pos <= buf_size);
- }
+static void
+mail_cache_merge_bitmask(struct mail_cache_copy_context *ctx,
+ const struct mail_cache_iterate_field *field)
+{
+ unsigned char *dest;
+ unsigned int i, *pos;
+
+ pos = array_idx_modifiable(&ctx->bitmask_pos, field->field_idx);
+ if (*pos == 0) {
+ /* we decided to drop this field */
+ return;
+ }
+
+ dest = buffer_get_space_unsafe(ctx->buffer, *pos, field->size);
+ for (i = 0; i < field->size; i++)
+ dest[i] |= ((const unsigned char*)field->data)[i];
}
static void
@@ -73,11 +55,8 @@ mail_cache_compress_field(struct mail_ca
field_seen = buffer_get_space_unsafe(ctx->field_seen, field_idx, 1);
if (*field_seen == ctx->field_seen_value) {
/* duplicate */
- if (cache_field->type == MAIL_CACHE_FIELD_BITMASK) {
- mail_cache_merge_bitmask(ctx->cache, ctx->buffer,
- field_idx, field->data,
- field->size);
- }
+ if (cache_field->type == MAIL_CACHE_FIELD_BITMASK)
+ mail_cache_merge_bitmask(ctx, field);
return;
}
*field_seen = ctx->field_seen_value;
@@ -98,6 +77,12 @@ mail_cache_compress_field(struct mail_ca
buffer_append(ctx->buffer, &size32, sizeof(size32));
}
+ if (cache_field->type == MAIL_CACHE_FIELD_BITMASK) {
+ /* remember the position in case we need to update it */
+ unsigned int pos = ctx->buffer->used;
+
+ array_idx_set(&ctx->bitmask_pos, field->field_idx, &pos);
+ }
buffer_append(ctx->buffer, field->data, field->size);
if ((field->size & 3) != 0)
buffer_append_zero(ctx->buffer, 4 - (field->size & 3));
@@ -163,6 +148,7 @@ mail_cache_copy(struct mail_cache *cache
ctx.buffer = buffer_create_dynamic(default_pool, 4096);
ctx.field_seen = buffer_create_dynamic(default_pool, 64);
ctx.field_seen_value = 0;
+ t_array_init(&ctx.bitmask_pos, 32);
t_array_init(ext_offsets, message_count);
for (seq = 1; seq <= message_count; seq++) {
@@ -301,7 +287,6 @@ static int mail_cache_compress_locked(st
unsigned int i, count;
int fd, ret;
- i_warning("cache compress");
/* get the latest info on fields */
if (mail_cache_header_fields_read(cache) < 0)
return -1;
More information about the dovecot-cvs
mailing list