@Override public final long readAddressForLob(int index) { assert index >= 1 && index <= readNumLobsColumns(true): "index=" + index + " numLobs=" + readNumLobsColumns(true); return UnsafeMemoryChunk.readAbsoluteLongVolatile(getBaseDataAddress() + (index - 1) * LOB_ADDRESS_WIDTH); }
@Override public final long readAddressForLob(int index) { assert index >= 1 && index <= readNumLobsColumns(true): "index=" + index + " numLobs=" + readNumLobsColumns(true); return UnsafeMemoryChunk.readAbsoluteLongVolatile(getBaseDataAddress() + (index - 1) * LOB_ADDRESS_WIDTH); }
@Override public final long readAddressForLob(int index) { assert index >= 1 && index <= readNumLobsColumns(true): "index=" + index + " numLobs=" + readNumLobsColumns(true); return UnsafeMemoryChunk.readAbsoluteLongVolatile(getBaseDataAddress() + (index - 1) * LOB_ADDRESS_WIDTH); }
@Released public static void freeLobsIfPresent(final long parentAddress, final ChunkType ct, int dataSizeDelta) { // read source type if (ct == OffHeapRowWithLobs.TYPE) { int dataSize = getSize(parentAddress) - dataSizeDelta; long startLocation = parentAddress + OFF_HEAP_HEADER_SIZE; int numLobCols = readCompactNumLobs(startLocation + dataSize - 1); for (int i = 1; i <= numLobCols; ++i, startLocation += LOB_ADDRESS_WIDTH) { long address = UnsafeMemoryChunk .readAbsoluteLongVolatile(startLocation); if (address != 0l && OffHeapRegionEntryHelper.isOffHeap(address)) { Chunk.release(address, false); } } } }
@Released public static void freeLobsIfPresent(final long parentAddress, final ChunkType ct, int dataSizeDelta) { // read source type if (ct == OffHeapRowWithLobs.TYPE) { int dataSize = getSize(parentAddress) - dataSizeDelta; long startLocation = parentAddress + OFF_HEAP_HEADER_SIZE; int numLobCols = readCompactNumLobs(startLocation + dataSize - 1); for (int i = 1; i <= numLobCols; ++i, startLocation += LOB_ADDRESS_WIDTH) { long address = UnsafeMemoryChunk .readAbsoluteLongVolatile(startLocation); if (address != 0l && OffHeapRegionEntryHelper.isOffHeap(address)) { Chunk.release(address, false); } } } }
@Released public static void freeLobsIfPresent(final long parentAddress, final ChunkType ct, int dataSizeDelta) { // read source type if (ct == OffHeapRowWithLobs.TYPE) { int dataSize = getSize(parentAddress) - dataSizeDelta; long startLocation = parentAddress + OFF_HEAP_HEADER_SIZE; int numLobCols = readCompactNumLobs(startLocation + dataSize - 1); for (int i = 1; i <= numLobCols; ++i, startLocation += LOB_ADDRESS_WIDTH) { long address = UnsafeMemoryChunk .readAbsoluteLongVolatile(startLocation); if (address != 0l && OffHeapRegionEntryHelper.isOffHeap(address)) { Chunk.release(address, false); } } } }