Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3374:8b2dd340e16d HEAD
Added file_cache_write() to update cached memory area.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 14 May 2005 14:29:07 +0300 |
parents | 690dcc51cdc1 |
children | 9e2abc4c341c |
files | src/lib/file-cache.c src/lib/file-cache.h |
diffstat | 2 files changed, 35 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/file-cache.c Fri May 13 16:35:19 2005 +0300 +++ b/src/lib/file-cache.c Sat May 14 14:29:07 2005 +0300 @@ -160,6 +160,37 @@ return cache->mmap_base; } +void file_cache_write(struct file_cache *cache, const void *data, size_t size, + uoff_t offset) +{ + size_t page_size = mmap_get_page_size(); + size_t max_size; + unsigned char *bits; + unsigned int first_page, last_page; + + if (offset >= cache->mmap_length) + return; + + max_size = cache->mmap_length - offset; + memcpy(PTR_OFFSET(cache->mmap_base, offset), + data, I_MIN(size, max_size)); + + /* mark fully written pages cached */ + if (size >= page_size) { + first_page = offset / page_size; + last_page = (offset + size) / page_size; + if ((offset % page_size) != 0) + first_page++; + + bits = buffer_get_space_unsafe(cache->page_bitmask, 0, + last_page / CHAR_BIT + 1); + for (; first_page < last_page; first_page++) { + bits[first_page / CHAR_BIT] |= + 1 << (first_page % CHAR_BIT); + } + } +} + void file_cache_invalidate(struct file_cache *cache, uoff_t offset, uoff_t size) { size_t page_size = mmap_get_page_size();
--- a/src/lib/file-cache.h Fri May 13 16:35:19 2005 +0300 +++ b/src/lib/file-cache.h Sat May 14 14:29:07 2005 +0300 @@ -18,6 +18,10 @@ Note that the pointer may become invalid after calling file_cache_read(). */ const void *file_cache_get_map(struct file_cache *cache, size_t *size_r); +/* Update cached memory area. Mark fully written pages as cached. */ +void file_cache_write(struct file_cache *cache, const void *data, size_t size, + uoff_t offset); + /* Invalidate cached memory area. It will be read again next time it's tried to be accessed. */ void file_cache_invalidate(struct file_cache *cache,