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,