Reduce object creation for for unwrap/wrap if no ByteBuffer[] is used.

Motivation:

Often unwrap(...), wrap(...) is used with a single ByteBuffer and not with a ByteBuffer[]. We should reduce the array creations in this case.

Modifications:

Reuse ByteBuffer[1] for dst/src ByteBuffer.

Result:

Less object creation and so less GC
This commit is contained in:
Norman Maurer 2015-09-29 13:29:02 +02:00
parent 845a1a526a
commit 80de5fa9c9

View File

@ -169,6 +169,8 @@ public final class OpenSslEngine extends SSLEngine {
private final boolean rejectRemoteInitiatedRenegation; private final boolean rejectRemoteInitiatedRenegation;
private final OpenSslSession session; private final OpenSslSession session;
private final java.security.cert.Certificate[] localCerts; private final java.security.cert.Certificate[] localCerts;
private final ByteBuffer[] singleSrcBuffer = new ByteBuffer[1];
private final ByteBuffer[] singleDstBuffer = new ByteBuffer[1];
// This is package-private as we set it from OpenSslContext if an exception is thrown during // This is package-private as we set it from OpenSslContext if an exception is thrown during
// the verification step. // the verification step.
@ -577,7 +579,7 @@ public final class OpenSslEngine extends SSLEngine {
return CLOSED_NOT_HANDSHAKING; return CLOSED_NOT_HANDSHAKING;
} }
// Throw requried runtime exceptions // Throw required runtime exceptions
if (srcs == null) { if (srcs == null) {
throw new NullPointerException("srcs"); throw new NullPointerException("srcs");
} }
@ -786,10 +788,60 @@ public final class OpenSslEngine extends SSLEngine {
return unwrap(srcs, 0, srcs.length, dsts, 0, dsts.length); return unwrap(srcs, 0, srcs.length, dsts, 0, dsts.length);
} }
private ByteBuffer[] singleSrcBuffer(ByteBuffer src) {
singleSrcBuffer[0] = src;
return singleSrcBuffer;
}
private void resetSingleSrcBuffer() {
singleSrcBuffer[0] = null;
}
private ByteBuffer[] singleDstBuffer(ByteBuffer src) {
singleDstBuffer[0] = src;
return singleDstBuffer;
}
private void resetSingleDstBuffer() {
singleDstBuffer[0] = null;
}
@Override @Override
public SSLEngineResult unwrap( public synchronized SSLEngineResult unwrap(
final ByteBuffer src, final ByteBuffer[] dsts, final int offset, final int length) throws SSLException { final ByteBuffer src, final ByteBuffer[] dsts, final int offset, final int length) throws SSLException {
return unwrap(new ByteBuffer[] { src }, 0, 1, dsts, offset, length); try {
return unwrap(singleSrcBuffer(src), 0, 1, dsts, offset, length);
} finally {
resetSingleSrcBuffer();
}
}
@Override
public synchronized SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst) throws SSLException {
try {
return wrap(singleSrcBuffer(src), dst);
} finally {
resetSingleSrcBuffer();
}
}
@Override
public synchronized SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException {
try {
return unwrap(singleSrcBuffer(src), singleDstBuffer(dst));
} finally {
resetSingleSrcBuffer();
resetSingleDstBuffer();
}
}
@Override
public synchronized SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts) throws SSLException {
try {
return unwrap(singleSrcBuffer(src), dsts);
} finally {
resetSingleSrcBuffer();
}
} }
@Override @Override