diff --git a/components/net/sf/briar/transport/IncomingReliabilityLayerImpl.java b/components/net/sf/briar/transport/IncomingReliabilityLayerImpl.java
index 174dee5ba..5ed04342e 100644
--- a/components/net/sf/briar/transport/IncomingReliabilityLayerImpl.java
+++ b/components/net/sf/briar/transport/IncomingReliabilityLayerImpl.java
@@ -2,8 +2,8 @@ package net.sf.briar.transport;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.ListIterator;
+import java.util.SortedMap;
+import java.util.TreeMap;
/** A reliability layer that reorders out-of-order frames. */
class IncomingReliabilityLayerImpl implements IncomingReliabilityLayer {
@@ -11,7 +11,7 @@ class IncomingReliabilityLayerImpl implements IncomingReliabilityLayer {
private final IncomingAuthenticationLayer in;
private final int maxFrameLength;
private final FrameWindow window;
- private final LinkedList frames; // Ordered by frame number
+ private final SortedMap frames;
private final ArrayList freeFrames;
private long nextFrameNumber = 0L;
@@ -20,7 +20,7 @@ class IncomingReliabilityLayerImpl implements IncomingReliabilityLayer {
this.in = in;
maxFrameLength = in.getMaxFrameLength();
window = new FrameWindowImpl();
- frames = new LinkedList();
+ frames = new TreeMap();
freeFrames = new ArrayList();
}
@@ -28,8 +28,7 @@ class IncomingReliabilityLayerImpl implements IncomingReliabilityLayer {
InvalidDataException {
freeFrames.add(f);
// Read frames until there's an in-order frame to return
- Frame next = frames.peek();
- while(next == null || next.getFrameNumber() > nextFrameNumber) {
+ while(frames.isEmpty() || frames.firstKey() > nextFrameNumber) {
// Grab a free frame, or allocate one if necessary
int free = freeFrames.size();
if(free == 0) f = new Frame(maxFrameLength);
@@ -44,29 +43,12 @@ class IncomingReliabilityLayerImpl implements IncomingReliabilityLayer {
nextFrameNumber++;
return f;
}
- // Insert the frame into the list
- if(next == null || next.getFrameNumber() > frameNumber) {
- frames.push(f);
- } else {
- boolean inserted = false;
- ListIterator it = frames.listIterator();
- while(it.hasNext()) {
- if(it.next().getFrameNumber() > frameNumber) {
- // Insert the frame before the one just examined
- it.previous();
- it.add(f);
- inserted = true;
- break;
- }
- }
- if(!inserted) frames.add(f);
- }
- next = frames.peek();
+ // Insert the frame into the map
+ frames.put(frameNumber, f);
}
- frames.poll();
if(!window.remove(nextFrameNumber)) throw new IllegalStateException();
nextFrameNumber++;
- return next;
+ return frames.remove(frames.firstKey());
}
public int getMaxFrameLength() {