7168505: (bf) MappedByteBuffer.load does not load buffer's content into memory
Reviewed-by: mduigou, forax
--- a/jdk/src/share/classes/java/nio/MappedByteBuffer.java Tue May 15 11:51:51 2012 -0700
+++ b/jdk/src/share/classes/java/nio/MappedByteBuffer.java Wed May 16 12:43:27 2012 +0100
@@ -139,6 +139,9 @@
return isLoaded0(mappingAddress(offset), length, Bits.pageCount(length));
}
+ // not used, but a potential target for a store, see load() for details.
+ private static byte unused;
+
/**
* Loads this buffer's content into physical memory.
*
@@ -157,15 +160,20 @@
long length = mappingLength(offset);
load0(mappingAddress(offset), length);
- // touch each page
+ // Read a byte from each page to bring it into memory. A checksum
+ // is computed as we go along to prevent the compiler from otherwise
+ // considering the loop as dead code.
Unsafe unsafe = Unsafe.getUnsafe();
int ps = Bits.pageSize();
int count = Bits.pageCount(length);
long a = mappingAddress(offset);
+ byte x = 0;
for (int i=0; i<count; i++) {
- unsafe.getByte(a);
+ x ^= unsafe.getByte(a);
a += ps;
}
+ if (unused != 0)
+ unused = x;
return this;
}