< prev index next >

src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2000, 2018, 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 --- 1,7 ---- /* ! * Copyright (c) 2000, 2019, 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
*** 27,36 **** --- 27,37 ---- package java.nio; import java.io.FileDescriptor; import java.lang.ref.Reference; + import java.util.Objects; import jdk.internal.misc.VM; import jdk.internal.ref.Cleaner; import sun.nio.ch.DirectBuffer;
*** 323,332 **** --- 324,368 ---- #else[rw] throw new ReadOnlyBufferException(); #end[rw] } + public $Type$Buffer get(int index, $type$[] dst, int offset, int length) { + //System.out.println("Direct absolute bulk get"); + #if[rw] + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, dst.length); + + long dstOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$); + try { + #if[!byte] + if (order() != ByteOrder.nativeOrder()) + UNSAFE.copySwapMemory(null, + ix(index), + dst, + dstOffset, + (long)length << $LG_BYTES_PER_VALUE$, + (long)1 << $LG_BYTES_PER_VALUE$); + else + #end[!byte] + UNSAFE.copyMemory(null, + ix(index), + dst, + dstOffset, + (long)length << $LG_BYTES_PER_VALUE$); + } finally { + Reference.reachabilityFence(this); + } + } else { + super.get(index, dst, offset, length); + } + return this; + #else[rw] + throw new ReadOnlyBufferException(); + #end[rw] + } #end[rw] public $Type$Buffer put($type$ x) { #if[rw] try {
*** 438,447 **** --- 474,549 ---- #else[rw] throw new ReadOnlyBufferException(); #end[rw] } + public $Type$Buffer put(int index, $type$[] src, int offset, int length) { + //System.out.println("Direct absolute bulk put array"); + #if[rw] + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_FROM_ARRAY_THRESHOLD) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, src.length); + + + long srcOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$); + try { + #if[!byte] + if (order() != ByteOrder.nativeOrder()) + UNSAFE.copySwapMemory(src, + srcOffset, + null, + ix(index), + (long)length << $LG_BYTES_PER_VALUE$, + (long)1 << $LG_BYTES_PER_VALUE$); + else + #end[!byte] + UNSAFE.copyMemory(src, + srcOffset, + null, + ix(index), + (long)length << $LG_BYTES_PER_VALUE$); + } finally { + Reference.reachabilityFence(this); + } + } else { + super.put(index, src, offset, length); + } + return this; + #else[rw] + throw new ReadOnlyBufferException(); + #end[rw] + } + + public $Type$Buffer put(int index, $Type$Buffer src, int srcIndex, + int length) { + //System.out.println("Direct absolute bulk buffer"); + #if[rw] + if (src instanceof Direct$Type$Buffer$BO$) { + Direct$Type$Buffer$RW$$BO$ sb = (Direct$Type$Buffer$RW$$BO$)src; + + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(srcIndex, length, sb.limit()); + try { + UNSAFE.copyMemory(sb.ix(srcIndex), ix(index), + (long)length << $LG_BYTES_PER_VALUE$); + } finally { + Reference.reachabilityFence(sb); + Reference.reachabilityFence(this); + } + } else if (src.hb != null) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(srcIndex, length, src.limit()); + put(index, src.hb, srcIndex, length); + } else { + super.put(index, src, srcIndex, length); + } + return this; + #else[rw] + throw new ReadOnlyBufferException(); + #end[rw] + } + public $Type$Buffer compact() { #if[rw] int pos = position(); int lim = limit(); assert (pos <= lim);
< prev index next >