[dovecot-cvs] dovecot/src/lib-index mail-cache.c,1.11,1.12
cras at procontrol.fi
cras at procontrol.fi
Mon Sep 8 04:36:38 EEST 2003
Update of /home/cvs/dovecot/src/lib-index
In directory danu:/tmp/cvs-serv2565/lib-index
Modified Files:
mail-cache.c
Log Message:
minor speedups
Index: mail-cache.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-cache.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mail-cache.c 7 Sep 2003 14:10:50 -0000 1.11
+++ mail-cache.c 8 Sep 2003 00:36:36 -0000 1.12
@@ -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);
More information about the dovecot-cvs
mailing list