changeset 2439:7d6ca38c8c37 HEAD

Added mmap_get_page_size() call which basically returns getpagesize() but makes sure it's called only once so there's no syscall overhead every time.
author Timo Sirainen <tss@iki.fi>
date Sun, 22 Aug 2004 09:30:13 +0300
parents 7daa6c257a56
children 0ac79623b58e
files src/lib/istream-mmap.c src/lib/mmap-util.c src/lib/mmap-util.h
diffstat 3 files changed, 21 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/istream-mmap.c	Sun Aug 22 09:24:04 2004 +0300
+++ b/src/lib/istream-mmap.c	Sun Aug 22 09:30:13 2004 +0300
@@ -19,7 +19,6 @@
 	unsigned int autoclose_fd:1;
 };
 
-static size_t mmap_pagesize = 0;
 static size_t mmap_pagemask = 0;
 
 static void _close(struct _iostream *stream)
@@ -59,11 +58,13 @@
 	struct mmap_istream *mstream = (struct mmap_istream *) stream;
 
 	/* allow only full page sizes */
-	if (max_size < mmap_pagesize)
-		mstream->mmap_block_size = mmap_pagesize;
+	if (max_size < mmap_get_page_size())
+		mstream->mmap_block_size = mmap_get_page_size();
 	else {
-		if (max_size % mmap_pagesize != 0)
-			max_size += mmap_pagesize - (max_size % mmap_pagesize);
+		if (max_size % mmap_get_page_size() != 0) {
+			max_size += mmap_get_page_size() -
+				(max_size % mmap_get_page_size());
+		}
 		mstream->mmap_block_size = max_size;
 	}
 }
@@ -127,7 +128,7 @@
 		stream->buffer = mstream->mmap_base;
 	}
 
-	if (stream->buffer_size > mmap_pagesize) {
+	if (stream->buffer_size > mmap_get_page_size()) {
 		if (madvise(mstream->mmap_base, stream->buffer_size,
 			    MADV_SEQUENTIAL) < 0)
 			i_error("mmap_istream.madvise(): %m");
@@ -171,10 +172,8 @@
         struct istream *istream;
 	struct stat st;
 
-	if (mmap_pagesize == 0) {
-		mmap_pagesize = getpagesize();
-		mmap_pagemask = mmap_pagesize-1;
-	}
+	if (mmap_pagemask == 0)
+		mmap_pagemask = mmap_get_page_size()-1;
 
 	if (v_size == 0) {
 		if (fstat(fd, &st) < 0)
--- a/src/lib/mmap-util.c	Sun Aug 22 09:24:04 2004 +0300
+++ b/src/lib/mmap-util.c	Sun Aug 22 09:30:13 2004 +0300
@@ -43,3 +43,13 @@
 {
 }
 #endif
+
+size_t mmap_get_page_size(void)
+{
+	static size_t size = 0;
+
+	if (size != 0)
+		return size;
+	size = getpagesize();
+	return size;
+}
--- a/src/lib/mmap-util.h	Sun Aug 22 09:24:04 2004 +0300
+++ b/src/lib/mmap-util.h	Sun Aug 22 09:30:13 2004 +0300
@@ -37,4 +37,6 @@
 		  unsigned long flags);
 int munmap_anon(void *start, size_t length);
 
+size_t mmap_get_page_size(void);
+
 #endif