private int copyToDirectByteBuffer( int sourceOffset, ByteBuffer buf ) { int pos = buf.position(); int bytesToCopy = Math.min( buf.limit() - pos, pageSize - sourceOffset ); long source = pointer + sourceOffset; if ( sourceOffset < getCurrentPageSize() & sourceOffset >= 0 ) { long target = UnsafeUtil.getDirectByteBufferAddress( buf ); UnsafeUtil.copyMemory( source, target + pos, bytesToCopy ); buf.position( pos + bytesToCopy ); } else { outOfBounds = true; } return bytesToCopy; }
@Override public Memory copy() { final MemoryBlock copy = blockAllocator.allocate( block.size, tracker ); copyMemory( block.addr, copy.addr, block.size ); return new OffHeapMemory( copy ); }
@Override public int copyTo( int sourceOffset, PageCursor targetCursor, int targetOffset, int lengthInBytes ) { int sourcePageSize = getCurrentPageSize(); int targetPageSize = targetCursor.getCurrentPageSize(); if ( targetCursor.getClass() != MuninnWritePageCursor.class ) { throw new IllegalArgumentException( "Target cursor must be writable" ); } if ( sourceOffset >= 0 & targetOffset >= 0 & sourceOffset < sourcePageSize & targetOffset < targetPageSize & lengthInBytes >= 0 ) { MuninnPageCursor cursor = (MuninnPageCursor) targetCursor; int remainingSource = sourcePageSize - sourceOffset; int remainingTarget = targetPageSize - targetOffset; int bytes = Math.min( lengthInBytes, Math.min( remainingSource, remainingTarget ) ); UnsafeUtil.copyMemory( pointer + sourceOffset, cursor.pointer + targetOffset, bytes ); return bytes; } outOfBounds = true; return 0; }
private void clearMemoryFast( long baseAddress, long pageCount, long memcpyChunkSize, long metaDataEntriesPerChunk ) { // Initialise one chunk worth of data. clearMemorySimple( baseAddress, metaDataEntriesPerChunk ); // Since all entries contain the same data, we can now copy this chunk over and over. long chunkCopies = pageCount / metaDataEntriesPerChunk - 1; long address = baseAddress + memcpyChunkSize; for ( int i = 0; i < chunkCopies; i++ ) { UnsafeUtil.copyMemory( baseAddress, address, memcpyChunkSize ); address += memcpyChunkSize; } // Finally fill in the tail. long tailCount = pageCount % metaDataEntriesPerChunk; clearMemorySimple( address, tailCount ); }
UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putLong( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putInt( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putShort( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putByte( toAddress, intermediary );
@Override public void clear() { if ( isByteUniform( defaultValue ) ) { UnsafeUtil.setMemory( address, length * itemSize, defaultValue[0] ); } else { long intermediary = UnsafeUtil.allocateMemory( itemSize, allocationTracker ); for ( int i = 0; i < defaultValue.length; i++ ) { UnsafeUtil.putByte( intermediary + i, defaultValue[i] ); } for ( long i = 0, adr = address; i < length; i++, adr += itemSize ) { UnsafeUtil.copyMemory( intermediary, adr, itemSize ); } UnsafeUtil.free( intermediary, itemSize, allocationTracker ); } }
private int copyToDirectByteBuffer( int sourceOffset, ByteBuffer buf ) { int pos = buf.position(); int bytesToCopy = Math.min( buf.limit() - pos, pageSize - sourceOffset ); long source = pointer + sourceOffset; if ( sourceOffset < getCurrentPageSize() & sourceOffset >= 0 ) { long target = UnsafeUtil.getDirectByteBufferAddress( buf ); UnsafeUtil.copyMemory( source, target + pos, bytesToCopy ); buf.position( pos + bytesToCopy ); } else { outOfBounds = true; } return bytesToCopy; }
@Override public Memory copy() { final MemoryBlock copy = blockAllocator.allocate( block.size, tracker ); copyMemory( block.addr, copy.addr, block.size ); return new OffHeapMemory( copy ); }
@Override public int copyTo( int sourceOffset, PageCursor targetCursor, int targetOffset, int lengthInBytes ) { int sourcePageSize = getCurrentPageSize(); int targetPageSize = targetCursor.getCurrentPageSize(); if ( targetCursor.getClass() != MuninnWritePageCursor.class ) { throw new IllegalArgumentException( "Target cursor must be writable" ); } if ( sourceOffset >= 0 & targetOffset >= 0 & sourceOffset < sourcePageSize & targetOffset < targetPageSize & lengthInBytes >= 0 ) { MuninnPageCursor cursor = (MuninnPageCursor) targetCursor; int remainingSource = sourcePageSize - sourceOffset; int remainingTarget = targetPageSize - targetOffset; int bytes = Math.min( lengthInBytes, Math.min( remainingSource, remainingTarget ) ); UnsafeUtil.copyMemory( pointer + sourceOffset, cursor.pointer + targetOffset, bytes ); return bytes; } outOfBounds = true; return 0; }
private void clearMemoryFast( long baseAddress, long pageCount, long memcpyChunkSize, long metaDataEntriesPerChunk ) { // Initialise one chunk worth of data. clearMemorySimple( baseAddress, metaDataEntriesPerChunk ); // Since all entries contain the same data, we can now copy this chunk over and over. long chunkCopies = pageCount / metaDataEntriesPerChunk - 1; long address = baseAddress + memcpyChunkSize; for ( int i = 0; i < chunkCopies; i++ ) { UnsafeUtil.copyMemory( baseAddress, address, memcpyChunkSize ); address += memcpyChunkSize; } // Finally fill in the tail. long tailCount = pageCount % metaDataEntriesPerChunk; clearMemorySimple( address, tailCount ); }
UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putLong( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putInt( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putShort( toAddress, intermediary ); UnsafeUtil.copyMemory( toAddress, fromAddress, chunkSize ); putByte( toAddress, intermediary );
@Override public void clear() { if ( isByteUniform( defaultValue ) ) { UnsafeUtil.setMemory( address, length * itemSize, defaultValue[0] ); } else { long intermediary = UnsafeUtil.allocateMemory( itemSize, allocationTracker ); for ( int i = 0; i < defaultValue.length; i++ ) { UnsafeUtil.putByte( intermediary + i, defaultValue[i] ); } for ( long i = 0, adr = address; i < length; i++, adr += itemSize ) { UnsafeUtil.copyMemory( intermediary, adr, itemSize ); } UnsafeUtil.free( intermediary, itemSize, allocationTracker ); } }