private ByteBuffer combine(ByteBuffer cachedToProcessLaterData, ByteBuffer encryptedData) { int size = cachedToProcessLaterData.remaining()+encryptedData.remaining(); ByteBuffer nextBuffer = pool.nextBuffer(size); nextBuffer.put(cachedToProcessLaterData); nextBuffer.put(encryptedData); nextBuffer.flip(); pool.releaseBuffer(cachedToProcessLaterData); pool.releaseBuffer(encryptedData); return nextBuffer; }
private synchronized List<CompletableFuture<Void>> failAllWritesInQueue() { List<CompletableFuture<Void>> copy = new ArrayList<>(); while(!dataToBeWritten.isEmpty()) { WriteInfo runnable = dataToBeWritten.remove(); ByteBuffer buffer = runnable.getBuffer(); buffer.position(buffer.limit()); //mark buffer read before releasing it pool.releaseBuffer(buffer); copy.add(runnable.getPromise()); } waitingBytesCounter = 0; return copy; }
pool.releaseBuffer(buffer);
@Override public CompletableFuture<Void> write(ByteBuffer b) { if(b.remaining() == 0) throw new IllegalArgumentException("buffer has no data"); else if(!selMgr.isRunning()) throw new IllegalStateException(this+"ChannelManager must be running and is stopped"); else if(channelState == ChannelState.CLOSED) { if(isRemoteEndInitiateClose) throw new NioClosedChannelException(this+"Client cannot write after the remote end closed the socket"); else throw new NioClosedChannelException(this+"Your Application cannot write after YOUR Application closed the socket"); } else if(channelState != ChannelState.CONNECTED) { throw new NioException("The Channel is not connected yet"); } apiLog.trace(()->this+"Basic.write"); return writeSynchronized(b) .thenApply(v -> { pool.releaseBuffer(b); return null; }); }
newBuf.put(b); newBuf.flip(); pool.releaseBuffer(b); //release b that is now in the newBuf pool.releaseBuffer(cachedBuffer); //release cached buffer that is now in newBuf b = newBuf;
pool.releaseBuffer(encryptedData);