[#2577] ChannelOutboundBuffer.addFlush() unnecessary loop through all entries on multiple calls
Motivation: If ChannelOutboundBuffer.addFlush() is called multiple times and flushed != unflushed it will still loop through all entries that are not flushed yet even if it is not needed anymore as these were marked uncancellable before. Modifications: Check if new messages were added since addFlush() was called and only if this was the case loop through all entries and try to mark the uncancellable. Result: Less overhead when ChannelOuboundBuffer.addFlush() is called multiple times without new messages been added.
This commit is contained in:
parent
b8a7881588
commit
b627824b18
@ -173,18 +173,24 @@ public final class ChannelOutboundBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void addFlush() {
|
void addFlush() {
|
||||||
unflushed = tail;
|
// There is no need to process all entries if there was already a flush before and no new messages
|
||||||
|
// where added in the meantime.
|
||||||
|
//
|
||||||
|
// See https://github.com/netty/netty/issues/2577
|
||||||
|
if (unflushed != tail) {
|
||||||
|
unflushed = tail;
|
||||||
|
|
||||||
final int mask = buffer.length - 1;
|
final int mask = buffer.length - 1;
|
||||||
int i = flushed;
|
int i = flushed;
|
||||||
while (i != unflushed && buffer[i].msg != null) {
|
while (i != unflushed && buffer[i].msg != null) {
|
||||||
Entry entry = buffer[i];
|
Entry entry = buffer[i];
|
||||||
if (!entry.promise.setUncancellable()) {
|
if (!entry.promise.setUncancellable()) {
|
||||||
// Was cancelled so make sure we free up memory and notify about the freed bytes
|
// Was cancelled so make sure we free up memory and notify about the freed bytes
|
||||||
int pending = entry.cancel();
|
int pending = entry.cancel();
|
||||||
decrementPendingOutboundBytes(pending);
|
decrementPendingOutboundBytes(pending);
|
||||||
|
}
|
||||||
|
i = i + 1 & mask;
|
||||||
}
|
}
|
||||||
i = i + 1 & mask;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user