[dovecot-cvs] dovecot/src/lib file-cache.c, 1.6, 1.7 file-cache.h, 1.2, 1.3

cras at dovecot.org cras at dovecot.org
Sat May 14 14:29:10 EEST 2005


Update of /var/lib/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv6674/lib

Modified Files:
	file-cache.c file-cache.h 
Log Message:
Added file_cache_write() to update cached memory area.



Index: file-cache.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib/file-cache.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- file-cache.c	10 May 2005 21:36:05 -0000	1.6
+++ file-cache.c	14 May 2005 11:29:07 -0000	1.7
@@ -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();

Index: file-cache.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib/file-cache.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- file-cache.h	5 Dec 2004 01:36:12 -0000	1.2
+++ file-cache.h	14 May 2005 11:29:07 -0000	1.3
@@ -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,



More information about the dovecot-cvs mailing list