public void enqueue(byte[] buffer) { BufferNode bufferNode = new BufferNode(buffer); if (headBufferNode == null) { headBufferNode = bufferNode; count = 1; return; } BufferNode previousBufferNode = null; BufferNode currentBufferNode = headBufferNode; while ((currentBufferNode != null) && (currentBufferNode.buffer.length > bufferNode.buffer.length)) { previousBufferNode = currentBufferNode; currentBufferNode = currentBufferNode.next; } if (previousBufferNode == null) { bufferNode.next = headBufferNode; headBufferNode = bufferNode; } else { bufferNode.next = currentBufferNode; previousBufferNode.next = bufferNode; } if (++count > THREADLOCAL_BUFFER_COUNT_LIMIT) { if (previousBufferNode == null) { previousBufferNode = headBufferNode; } currentBufferNode = previousBufferNode.next; while (currentBufferNode.next != null) { previousBufferNode = currentBufferNode; currentBufferNode = currentBufferNode.next; } // Dereference previousBufferNode.next = null; // Help GC currentBufferNode.buffer = null; currentBufferNode.next = null; } }