Mercurial > hg > icedtea9-forest > jdk
changeset 5585:332bebb463d1
7168505: (bf) MappedByteBuffer.load does not load buffer's content into memory
Reviewed-by: mduigou, forax
author | alanb |
---|---|
date | Wed, 16 May 2012 12:43:27 +0100 |
parents | 9a18e318f95a |
children | ce165aa48dcb |
files | src/share/classes/java/nio/MappedByteBuffer.java |
diffstat | 1 files changed, 10 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/nio/MappedByteBuffer.java Tue May 15 11:51:51 2012 -0700 +++ b/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; }