// single pass attempt to copy if any can not accept the data then they are skipped // and true will be returned instead of false. private static boolean doingCopy( TapeWriteStage ss, int byteTailPos, int primaryTailPos, int totalPrimaryCopy, int totalBytesCopy) { IntBuffer primaryInts = RingBuffer.wrappedStructuredLayoutRingBuffer(ss.source); ByteBuffer secondaryBytes = RingBuffer.wrappedUnstructuredLayoutRingBufferA(ss.source); primaryInts.position(primaryTailPos); primaryInts.limit( primaryTailPos + totalPrimaryCopy); // TODO: AA, this will not work on the wrap, we must mask and do // muliple copies secondaryBytes.position(byteTailPos); secondaryBytes.limit(byteTailPos + totalBytesCopy); ss.header.clear(); ss.headerAsInts.put(totalBytesCopy + (totalPrimaryCopy << 2)); ss.headerAsInts.put(totalPrimaryCopy << 2); // TODO: must return false if there is no room to write. // TODO: BB, this creates a bit of garbage for the map, perhaps we should map larger blocks // expecting to use them for multiple writes. MappedByteBuffer mapped; try { mapped = ss.fileChannel.map( MapMode.READ_WRITE, ss.fileChannel.position(), 8 + totalBytesCopy + (totalPrimaryCopy << 2)); mapped.put(ss.header); IntBuffer asIntBuffer = mapped.asIntBuffer(); asIntBuffer.position(2); asIntBuffer.put(primaryInts); mapped.position(mapped.position() + (totalPrimaryCopy << 2)); mapped.put(secondaryBytes); } catch (IOException e) { throw new RuntimeException(e); } return true; }