151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.nio.ch; // Formerly in sun.misc 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.ByteOrder; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.misc.Unsafe; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// ## In the fullness of time, this class will be eliminated 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Proxies for objects that reside in native memory. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass NativeObject { // package-private 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected static final Unsafe unsafe = Unsafe.getUnsafe(); 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Native allocation address; 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // may be smaller than the base address due to page-size rounding 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected long allocationAddress; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Native base address 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final long address; 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new native object that is based at the given native address. 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NativeObject(long address) { 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.allocationAddress = address; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.address = address; 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new native object allocated at the given native address but 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * whose base is at the additional offset. 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NativeObject(long address, long offset) { 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.allocationAddress = address; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.address = address + offset; 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Invoked only by AllocatedNativeObject 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected NativeObject(int size, boolean pageAligned) { 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!pageAligned) { 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.allocationAddress = unsafe.allocateMemory(size); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.address = this.allocationAddress; 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int ps = pageSize(); 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long a = unsafe.allocateMemory(size + ps); 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.allocationAddress = a; 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.address = a + ps - (a & (ps - 1)); 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the native base address of this native object. 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The native base address 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long address() { 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return address; 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long allocationAddress() { 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return allocationAddress; 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new native object starting at the given offset from the base 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of this native object. 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset from the base of this native object that is to be 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the base of the new native object 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The newly created native object 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NativeObject subObject(int offset) { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new NativeObject(offset + address); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads an address from this native object at the given offset and 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * constructs a native object using that address. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset of the address to be read. Note that the size of an 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address is implementation-dependent. 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The native object created using the address read from the 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * given offset 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NativeObject getObject(int offset) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long newAddress = 0L; 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (addressSize()) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 8: 127c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath newAddress = unsafe.getLong(offset + address); 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 4: 130c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath newAddress = unsafe.getInt(offset + address) & 0x00000000FFFFFFFF; 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InternalError("Address size not supported"); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new NativeObject(newAddress); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes the base address of the given native object at the given offset 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of this native object. 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which the address is to be written. Note that the 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * size of an address is implementation-dependent. 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ob 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The native object whose address is to be written 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void putObject(int offset, NativeObject ob) { 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (addressSize()) { 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 8: 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski putLong(offset, ob.address); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 4: 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski putInt(offset, (int)(ob.address & 0x00000000FFFFFFFF)); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InternalError("Address size not supported"); 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* -- Value accessors: No range checking! -- */ 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a byte starting at the given offset from base of this native 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the byte 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The byte value read 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final byte getByte(int offset) { 176c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getByte(offset + address); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a byte at the specified offset from this native object's 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the byte 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The byte value to be written 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putByte(int offset, byte value) { 190c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putByte(offset + address, value); 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a short starting at the given offset from base of this native 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the short 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The short value read 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final short getShort(int offset) { 203c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getShort(offset + address); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a short at the specified offset from this native object's 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the short 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The short value to be written 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putShort(int offset, short value) { 217c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putShort(offset + address, value); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a char starting at the given offset from base of this native 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the char 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The char value read 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final char getChar(int offset) { 230c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getChar(offset + address); 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a char at the specified offset from this native object's 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the char 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The char value to be written 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putChar(int offset, char value) { 244c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putChar(offset + address, value); 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads an int starting at the given offset from base of this native 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the int 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The int value read 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final int getInt(int offset) { 257c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getInt(offset + address); 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes an int at the specified offset from this native object's 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the int 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The int value to be written 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putInt(int offset, int value) { 271c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putInt(offset + address, value); 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a long starting at the given offset from base of this native 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the long 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The long value read 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final long getLong(int offset) { 284c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getLong(offset + address); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a long at the specified offset from this native object's 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the long 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The long value to be written 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putLong(int offset, long value) { 298c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putLong(offset + address, value); 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a float starting at the given offset from base of this native 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the float 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The float value read 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final float getFloat(int offset) { 311c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getFloat(offset + address); 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a float at the specified offset from this native object's 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the float 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The float value to be written 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putFloat(int offset, float value) { 325c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putFloat(offset + address, value); 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads a double starting at the given offset from base of this native 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to read the double 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The double value read 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final double getDouble(int offset) { 338c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath return unsafe.getDouble(offset + address); 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a double at the specified offset from this native object's 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * base address. 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The offset at which to write the double 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The double value to be written 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final void putDouble(int offset, double value) { 352c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putDouble(offset + address, value); 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the native architecture's address size in bytes. 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The address size of the native architecture 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static int addressSize() { 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return unsafe.addressSize(); 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Cache for byte order 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static ByteOrder byteOrder = null; 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the byte order of the underlying hardware. 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return An instance of {@link java.nio.ByteOrder} 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static ByteOrder byteOrder() { 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (byteOrder != null) 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return byteOrder; 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long a = unsafe.allocateMemory(8); 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 377c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath unsafe.putLong(a, 0x0102030405060708L); 378c87bc620b0986cdc9114434e063258c12bb32285Narayan Kamath byte b = unsafe.getByte(a); 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (b) { 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 0x01: byteOrder = ByteOrder.BIG_ENDIAN; break; 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN; break; 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski assert false; 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unsafe.freeMemory(a); 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return byteOrder; 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Cache for page size 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static int pageSize = -1; 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the page size of the underlying hardware. 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The page size, in bytes 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static int pageSize() { 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pageSize == -1) 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pageSize = unsafe.pageSize(); 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return pageSize; 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 406