Mercurial > dovecot > core-2.2
changeset 1759:25b42c124efd HEAD
minor speedups
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 08 Sep 2003 03:36:36 +0300 |
parents | 81ebf6c81fc4 |
children | 7bbd17c237a4 |
files | src/lib-index/mail-cache.c |
diffstat | 1 files changed, 27 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache.c Mon Sep 08 03:04:59 2003 +0300 +++ b/src/lib-index/mail-cache.c Mon Sep 08 03:36:36 2003 +0300 @@ -37,9 +37,8 @@ #define MAIL_CACHE_LOCK_TIMEOUT 120 #define MAIL_CACHE_LOCK_STALE_TIMEOUT 60 -#define CACHE_RECORD(cache, data_pos) \ - ((struct mail_cache_record *) \ - ((char *) (cache)->mmap_base + ((data_pos) & ~3))) +#define CACHE_RECORD(cache, offset) \ + ((struct mail_cache_record *) ((char *) (cache)->mmap_base + offset)) struct mail_cache_header { uint32_t indexid; @@ -296,7 +295,7 @@ /* indexid changed, most likely it was rebuilt. try reopening. */ if (!mail_cache_file_reopen(cache)) - return FALSE; + return -1; /* force mmap refresh */ size = 0; @@ -306,13 +305,13 @@ size <= cache->mmap_length - offset) { /* already mapped */ if (!cache->mmap_refresh) - return TRUE; + return 1; cache->mmap_refresh = FALSE; } if (cache->anon_mmap) - return TRUE; + return 1; if (cache->mmap_base != NULL) { if (cache->locks != 0) { @@ -320,7 +319,7 @@ if (msync(cache->mmap_base, cache->mmap_length, MS_SYNC) < 0) { mail_cache_set_syscall_error(cache, "msync()"); - return FALSE; + return -1; } } @@ -337,16 +336,24 @@ cache->mmap_base = mmap_rw_file(cache->fd, &cache->mmap_length); if (cache->mmap_base == MAP_FAILED) { cache->mmap_base = NULL; - return mail_cache_set_syscall_error(cache, "mmap()"); + mail_cache_set_syscall_error(cache, "mmap()"); + return -1; } - return TRUE; + /* re-mmaped, check header */ + return 0; } static int mmap_update(struct mail_cache *cache, size_t offset, size_t size) { - return mmap_update_nocheck(cache, offset, size) && - mmap_verify_header(cache); + int ret; + + ret = mmap_update_nocheck(cache, offset, size); + if (ret > 0) + return TRUE; + if (ret < 0) + return FALSE; + return mmap_verify_header(cache); } static int mail_cache_open_and_verify(struct mail_cache *cache, int silent) @@ -373,7 +380,7 @@ return 0; cache->mmap_refresh = TRUE; - if (!mmap_update_nocheck(cache, 0, sizeof(struct mail_cache_header))) + if (mmap_update_nocheck(cache, 0, sizeof(struct mail_cache_header)) < 0) return -1; /* verify that this really is the cache for wanted index */ @@ -1325,6 +1332,7 @@ static struct mail_cache_record * cache_get_record(struct mail_cache *cache, uint32_t offset) { +#define CACHE_PREFETCH 1024 struct mail_cache_record *cache_rec; size_t size; @@ -1332,7 +1340,7 @@ if (offset == 0) return NULL; - if (!mmap_update(cache, offset, sizeof(*cache_rec) + 1024)) + if (!mmap_update(cache, offset, sizeof(*cache_rec) + CACHE_PREFETCH)) return NULL; if (offset + sizeof(*cache_rec) > cache->mmap_length) { @@ -1346,8 +1354,10 @@ mail_cache_set_corrupted(cache, "invalid record size"); return NULL; } - if (!mmap_update(cache, offset, size)) - return NULL; + if (size > CACHE_PREFETCH) { + if (!mmap_update(cache, offset, size)) + return NULL; + } if (offset + size > cache->mmap_length) { mail_cache_set_corrupted(cache, "record points outside file"); @@ -1599,8 +1609,9 @@ /* see if we've reached the max. deleted space in file */ max_del_space = cache->used_file_size / 100 * COMPRESS_PERCENTAGE; if (deleted_space >= max_del_space && - cache->used_file_size >= COMPRESS_MIN_SIZE) + cache->used_file_size >= COMPRESS_MIN_SIZE) { cache->index->set_flags |= MAIL_INDEX_HDR_FLAG_COMPRESS_CACHE; + } cache->header->deleted_space = uint32_to_nbo(deleted_space);