/* * Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.hazelcast.internal.memory; import java.lang.reflect.Field; import static com.hazelcast.internal.memory.GlobalMemoryAccessorRegistry.MEM; import static com.hazelcast.internal.memory.GlobalMemoryAccessorRegistry.MEM_AVAILABLE; /** * Accessor of Java heap memory. Heap must be addressed as an offset from a given object's base address. */ public interface HeapMemoryAccessor extends ByteAccessStrategy<Object> { /** * Base offset of boolean[] */ int ARRAY_BOOLEAN_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(boolean[].class) : -1; /** * Base offset of byte[] */ int ARRAY_BYTE_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(byte[].class) : -1; /** * Base offset of short[] */ int ARRAY_SHORT_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(short[].class) : -1; /** * Base offset of char[] */ int ARRAY_CHAR_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(char[].class) : -1; /** * Base offset of int[] */ int ARRAY_INT_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(int[].class) : -1; /** * Base offset of float[] */ int ARRAY_FLOAT_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(float[].class) : -1; /** * Base offset of long[] */ int ARRAY_LONG_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(long[].class) : -1; /** * Base offset of double[] */ int ARRAY_DOUBLE_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(double[].class) : -1; /** * Base offset of any type of Object[] */ int ARRAY_OBJECT_BASE_OFFSET = MEM_AVAILABLE ? MEM.arrayBaseOffset(Object[].class) : -1; /** * Index scale of boolean[] */ int ARRAY_BOOLEAN_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(boolean[].class) : -1; /** * Index scale of byte[] */ int ARRAY_BYTE_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(byte[].class) : -1; /** * Index scale of short[] */ int ARRAY_SHORT_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(short[].class) : -1; /** * Index scale of char[] */ int ARRAY_CHAR_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(char[].class) : -1; /** * Index scale of int[] */ int ARRAY_INT_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(int[].class) : -1; /** * Index scale of float[] */ int ARRAY_FLOAT_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(float[].class) : -1; /** * Index scale of long[] */ int ARRAY_LONG_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(long[].class) : -1; /** * Index scale of double[] */ int ARRAY_DOUBLE_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(double[].class) : -1; /** * Index scale of any type of Object[] */ int ARRAY_OBJECT_INDEX_SCALE = MEM_AVAILABLE ? MEM.arrayIndexScale(Object[].class) : -1; /** * Gets the offset of given field. * * @param field the field whose offset is requested * @return the offset of given field */ long objectFieldOffset(Field field); /** * Gets the base offset of the array typed with given class. * * @param arrayClass the type of the array whose base offset is requested * @return the base offset of the array typed with given class */ int arrayBaseOffset(Class<?> arrayClass); /** * Gets the index scale of the array typed with given class. * * @param arrayClass the type of the array whose index scale is requested * @return the index scale of the array typed with given class */ int arrayIndexScale(Class<?> arrayClass); /** * Copies memory from source to destination. Source and destination addresses are specified * in the form {@code (baseObject, offset)} such that the offset is added to the object's base * address on Java heap. * * @param srcObj source object * @param srcOffset source offset * @param destObj destination object * @param destOffset destination offset * @param lengthBytes number of bytes to be copied */ void copyMemory(Object srcObj, long srcOffset, Object destObj, long destOffset, long lengthBytes); /** * Returns the object reference at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ Object getObject(Object base, long offset); /** * Puts the supplied object reference at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putObject(Object base, long offset, Object x); /** * Returns the boolean value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ boolean getBoolean(Object base, long offset); /** * Puts the supplied boolean value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putBoolean(Object base, long offset, boolean x); /** * Returns the byte value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ byte getByte(Object base, long offset); /** * Puts the supplied byte value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putByte(Object base, long offset, byte x); /** * Returns the char value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ char getChar(Object base, long offset); /** * Puts the supplied char value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putChar(Object base, long offset, char x); /** * Returns the short value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ short getShort(Object base, long offset); /** * Puts the supplied short value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putShort(Object base, long offset, short x); /** * Returns the int value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ int getInt(Object base, long offset); /** * Puts the supplied int value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putInt(Object base, long offset, int x); /** * Returns the float value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ float getFloat(Object base, long offset); /** * Puts the supplied float value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putFloat(Object base, long offset, float x); /** * Returns the long value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ long getLong(Object base, long offset); /** * Puts the supplied long value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putLong(Object base, long offset, long x); /** * Returns the double value at the supplied offset from the supplied object's base address. * * @param base the object whose base address to use for the operation * @param offset offset from object's base to the accessed location */ double getDouble(Object base, long offset); /** * Puts the supplied double value at the supplied offset from the supplied object's base address. * * @param base the owner object where the referenced object will be written to * @param offset offset from object's base to the accessed location * @param x the referenced object to be written */ void putDouble(Object base, long offset, double x); }