< prev index next >
src/java.base/share/classes/jdk/internal/misc/Unsafe.java
Print this page
rev 57826 : 8237521: Memory Access API fixes for 32-bit
Reviewed-by: mcimadamore, dholmes
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -582,10 +582,21 @@
/// wrappers for malloc, realloc, free:
/**
+ * Round up allocation size to a multiple of HeapWordSize.
+ */
+ private long alignToHeapWordSize(long bytes) {
+ if (bytes >= 0) {
+ return (bytes + ADDRESS_SIZE - 1) & ~(ADDRESS_SIZE - 1);
+ } else {
+ throw invalidInput();
+ }
+ }
+
+ /**
* Allocates a new block of native memory, of the given size in bytes. The
* contents of the memory are uninitialized; they will generally be
* garbage. The resulting native pointer will never be zero, and will be
* aligned for all value types. Dispose of this memory by calling {@link
* #freeMemory}, or resize it with {@link #reallocateMemory}.
@@ -606,10 +617,12 @@
*
* @see #getByte(long)
* @see #putByte(long, byte)
*/
public long allocateMemory(long bytes) {
+ bytes = alignToHeapWordSize(bytes);
+
allocateMemoryChecks(bytes);
if (bytes == 0) {
return 0;
}
@@ -659,10 +672,12 @@
* @throws OutOfMemoryError if the allocation is refused by the system
*
* @see #allocateMemory
*/
public long reallocateMemory(long address, long bytes) {
+ bytes = alignToHeapWordSize(bytes);
+
reallocateMemoryChecks(address, bytes);
if (bytes == 0) {
freeMemory(address);
return 0;
< prev index next >