Minor simplifications/optimizations to AbstractByteBuf methods (#9845)
Motivation While working on other changes I noticed some opportunities to streamline a few things in AbstractByteBuf. Modifications - Avoid duplicate ensureAccessible() checks in discard(Some)ReadBytes() and ensureWritable0(int) methods - Simplify ensureWritable0(int) logic - Make some conditional checks more concise Result Cleaner, possibly faster code
This commit is contained in:
parent
6211d19503
commit
4a5712f8d9
@ -183,8 +183,8 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuf discardReadBytes() {
|
public ByteBuf discardReadBytes() {
|
||||||
ensureAccessible();
|
|
||||||
if (readerIndex == 0) {
|
if (readerIndex == 0) {
|
||||||
|
ensureAccessible();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +193,7 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
writerIndex -= readerIndex;
|
writerIndex -= readerIndex;
|
||||||
readerIndex = 0;
|
readerIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
|
ensureAccessible();
|
||||||
writerIndex = readerIndex = 0;
|
writerIndex = readerIndex = 0;
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@ -200,21 +201,21 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuf discardSomeReadBytes() {
|
public ByteBuf discardSomeReadBytes() {
|
||||||
|
if (readerIndex > 0) {
|
||||||
|
if (readerIndex == writerIndex) {
|
||||||
|
ensureAccessible();
|
||||||
|
writerIndex = readerIndex = 0;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readerIndex >= capacity() >>> 1) {
|
||||||
|
setBytes(0, this, readerIndex, writerIndex - readerIndex);
|
||||||
|
writerIndex -= readerIndex;
|
||||||
|
readerIndex = 0;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
ensureAccessible();
|
ensureAccessible();
|
||||||
if (readerIndex == 0) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (readerIndex == writerIndex) {
|
|
||||||
writerIndex = readerIndex = 0;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (readerIndex >= capacity() >>> 1) {
|
|
||||||
setBytes(0, this, readerIndex, writerIndex - readerIndex);
|
|
||||||
writerIndex -= readerIndex;
|
|
||||||
readerIndex = 0;
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,34 +228,28 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuf ensureWritable(int minWritableBytes) {
|
public ByteBuf ensureWritable(int minWritableBytes) {
|
||||||
checkPositiveOrZero(minWritableBytes, "minWritableBytes");
|
ensureWritable0(checkPositiveOrZero(minWritableBytes, "minWritableBytes"));
|
||||||
ensureWritable0(minWritableBytes);
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
final void ensureWritable0(int minWritableBytes) {
|
final void ensureWritable0(int minWritableBytes) {
|
||||||
ensureAccessible();
|
final int writerIndex = writerIndex();
|
||||||
if (minWritableBytes <= writableBytes()) {
|
final int targetCapacity = writerIndex + minWritableBytes;
|
||||||
|
if (targetCapacity <= capacity()) {
|
||||||
|
ensureAccessible();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final int writerIndex = writerIndex();
|
if (checkBounds && targetCapacity > maxCapacity) {
|
||||||
if (checkBounds) {
|
ensureAccessible();
|
||||||
if (minWritableBytes > maxCapacity - writerIndex) {
|
throw new IndexOutOfBoundsException(String.format(
|
||||||
throw new IndexOutOfBoundsException(String.format(
|
"writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",
|
||||||
"writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",
|
writerIndex, minWritableBytes, maxCapacity, this));
|
||||||
writerIndex, minWritableBytes, maxCapacity, this));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize the current capacity to the power of 2.
|
// Normalize the target capacity to the power of 2.
|
||||||
int minNewCapacity = writerIndex + minWritableBytes;
|
final int fastWritable = maxFastWritableBytes();
|
||||||
int newCapacity = alloc().calculateNewCapacity(minNewCapacity, maxCapacity);
|
int newCapacity = fastWritable >= minWritableBytes ? writerIndex + fastWritable
|
||||||
|
: alloc().calculateNewCapacity(targetCapacity, maxCapacity);
|
||||||
int fastCapacity = writerIndex + maxFastWritableBytes();
|
|
||||||
// Grow by a smaller amount if it will avoid reallocation
|
|
||||||
if (newCapacity > fastCapacity && minNewCapacity <= fastCapacity) {
|
|
||||||
newCapacity = fastCapacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust to the new capacity.
|
// Adjust to the new capacity.
|
||||||
capacity(newCapacity);
|
capacity(newCapacity);
|
||||||
@ -280,15 +275,9 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize the current capacity to the power of 2.
|
int fastWritable = maxFastWritableBytes();
|
||||||
int minNewCapacity = writerIndex + minWritableBytes;
|
int newCapacity = fastWritable >= minWritableBytes ? writerIndex + fastWritable
|
||||||
int newCapacity = alloc().calculateNewCapacity(minNewCapacity, maxCapacity);
|
: alloc().calculateNewCapacity(writerIndex + minWritableBytes, maxCapacity);
|
||||||
|
|
||||||
int fastCapacity = writerIndex + maxFastWritableBytes();
|
|
||||||
// Grow by a smaller amount if it will avoid reallocation
|
|
||||||
if (newCapacity > fastCapacity && minNewCapacity <= fastCapacity) {
|
|
||||||
newCapacity = fastCapacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust to the new capacity.
|
// Adjust to the new capacity.
|
||||||
capacity(newCapacity);
|
capacity(newCapacity);
|
||||||
@ -1420,28 +1409,23 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
|||||||
* than the specified value.
|
* than the specified value.
|
||||||
*/
|
*/
|
||||||
protected final void checkReadableBytes(int minimumReadableBytes) {
|
protected final void checkReadableBytes(int minimumReadableBytes) {
|
||||||
checkPositiveOrZero(minimumReadableBytes, "minimumReadableBytes");
|
checkReadableBytes0(checkPositiveOrZero(minimumReadableBytes, "minimumReadableBytes"));
|
||||||
checkReadableBytes0(minimumReadableBytes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void checkNewCapacity(int newCapacity) {
|
protected final void checkNewCapacity(int newCapacity) {
|
||||||
ensureAccessible();
|
ensureAccessible();
|
||||||
if (checkBounds) {
|
if (checkBounds && (newCapacity < 0 || newCapacity > maxCapacity())) {
|
||||||
if (newCapacity < 0 || newCapacity > maxCapacity()) {
|
throw new IllegalArgumentException("newCapacity: " + newCapacity +
|
||||||
throw new IllegalArgumentException("newCapacity: " + newCapacity +
|
" (expected: 0-" + maxCapacity() + ')');
|
||||||
" (expected: 0-" + maxCapacity() + ')');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkReadableBytes0(int minimumReadableBytes) {
|
private void checkReadableBytes0(int minimumReadableBytes) {
|
||||||
ensureAccessible();
|
ensureAccessible();
|
||||||
if (checkBounds) {
|
if (checkBounds && readerIndex > writerIndex - minimumReadableBytes) {
|
||||||
if (readerIndex > writerIndex - minimumReadableBytes) {
|
throw new IndexOutOfBoundsException(String.format(
|
||||||
throw new IndexOutOfBoundsException(String.format(
|
"readerIndex(%d) + length(%d) exceeds writerIndex(%d): %s",
|
||||||
"readerIndex(%d) + length(%d) exceeds writerIndex(%d): %s",
|
readerIndex, minimumReadableBytes, writerIndex, this));
|
||||||
readerIndex, minimumReadableBytes, writerIndex, this));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user