Mercurial > dovecot > core-2.2
changeset 3186:31313e1fe036 HEAD
Space reservation fixes and cleanups.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 08 Mar 2005 12:12:55 +0200 |
parents | 3089083e1d47 |
children | aa83063864c7 |
files | src/lib-index/mail-cache-transaction.c |
diffstat | 1 files changed, 17 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-transaction.c Mon Mar 07 22:21:52 2005 +0200 +++ b/src/lib-index/mail-cache-transaction.c Tue Mar 08 12:12:55 2005 +0200 @@ -181,12 +181,14 @@ } static void -mail_cache_transaction_add_reservation(struct mail_cache_transaction_ctx *ctx) +mail_cache_transaction_add_reservation(struct mail_cache_transaction_ctx *ctx, + uint32_t offset, uint32_t size) { - buffer_append(ctx->reservations, &ctx->reserved_space_offset, - sizeof(ctx->reserved_space_offset)); - buffer_append(ctx->reservations, &ctx->reserved_space, - sizeof(ctx->reserved_space)); + ctx->reserved_space_offset = offset; + ctx->reserved_space = size; + + buffer_append(ctx->reservations, &offset, sizeof(offset)); + buffer_append(ctx->reservations, &size, sizeof(size)); } static int @@ -203,9 +205,8 @@ if (mail_cache_unlink_hole(cache, block_size, &hole)) { /* found a large enough hole. */ - ctx->reserved_space_offset = hole.next_offset; - ctx->reserved_space = hole.size; - mail_cache_transaction_add_reservation(ctx); + mail_cache_transaction_add_reservation(ctx, hole.next_offset, + hole.size); return 0; } @@ -236,9 +237,8 @@ return -1; if (ctx->reserved_space_offset + ctx->reserved_space == - hdr->used_file_size && ctx->reserved_space > 0) { + hdr->used_file_size) { /* we can simply grow it */ - ctx->reserved_space = block_size; /* grow reservation. it's probably the last one in the buffer, but it's not guarateed because we might have used holes @@ -250,11 +250,12 @@ i_assert(size >= 2); size -= 2; } while (buf[size] + buf[size+1] != hdr->used_file_size); - buf[size+1] += ctx->reserved_space; + + buf[size+1] += block_size; + ctx->reserved_space += block_size; } else { - ctx->reserved_space_offset = hdr->used_file_size; - ctx->reserved_space = block_size; - mail_cache_transaction_add_reservation(ctx); + mail_cache_transaction_add_reservation(ctx, hdr->used_file_size, + block_size); } cache->hdr_modified = TRUE; @@ -311,6 +312,8 @@ i_assert(ctx->cache_file_seq == ctx->cache->hdr->file_seq); mail_cache_free_space(ctx->cache, ctx->reserved_space_offset, ctx->reserved_space); + ctx->reserved_space_offset = 0; + ctx->reserved_space = 0; } if (!locked) @@ -580,8 +583,6 @@ if ((ctx->reserved_space > 0 || ctx->reservations->used > 0) && !MAIL_CACHE_IS_UNUSABLE(cache)) { if (mail_cache_transaction_lock(ctx) > 0) { - mail_cache_transaction_free_space(ctx); - buf = buffer_get_data(ctx->reservations, &size); i_assert(size % sizeof(uint32_t)*2 == 0); size /= sizeof(*buf);