From b5b33c734ab2a178f07c667a8c1daf8beab837aa Mon Sep 17 00:00:00 2001 From: Patrick Scott Date: Fri, 15 May 2009 13:47:17 -0400 Subject: Order high priority requests in the same order they are requested. Use a class to hold the high priority requests and low priority requests. Each request is appended to the correct list in the order received. If a request needs to be requeued after an error, it is placed at the head of the corresponding list. --- core/java/android/net/http/RequestQueue.java | 73 ++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/core/java/android/net/http/RequestQueue.java b/core/java/android/net/http/RequestQueue.java index 66d5722..54a1cce 100644 --- a/core/java/android/net/http/RequestQueue.java +++ b/core/java/android/net/http/RequestQueue.java @@ -52,10 +52,44 @@ public class RequestQueue implements RequestFeeder { private Context mContext; + private static class RequestSet { + private final LinkedList mHighPriority; + private final LinkedList mLowPriority; + + RequestSet() { + mHighPriority = new LinkedList(); + mLowPriority = new LinkedList(); + } + + void add(Request req, boolean head) { + LinkedList l = mLowPriority; + if (req.mHighPriority) { + l = mHighPriority; + } + if (head) { + l.addFirst(req); + } else { + l.add(req); + } + } + + Request removeFirst() { + if (!mHighPriority.isEmpty()) { + return mHighPriority.removeFirst(); + } else if (!mLowPriority.isEmpty()) { + return mLowPriority.removeFirst(); + } + return null; + } + + boolean isEmpty() { + return mHighPriority.isEmpty() && mLowPriority.isEmpty(); + } + }; /** * Requests, indexed by HttpHost (scheme, host, port) */ - private LinkedHashMap> mPending; + private LinkedHashMap mPending; /* Support for notifying a client when queue is empty */ private boolean mClientWaiting = false; @@ -344,7 +378,7 @@ public class RequestQueue implements RequestFeeder { public RequestQueue(Context context, int connectionCount) { mContext = context; - mPending = new LinkedHashMap>(32); + mPending = new LinkedHashMap(32); mActivePool = new ActivePool(connectionCount); mActivePool.startup(); @@ -480,7 +514,7 @@ public class RequestQueue implements RequestFeeder { req = new Request(method, httpHost, mProxyHost, uri.mPath, bodyProvider, bodyLength, eventHandler, headers, highPriority); - queueRequest(req, highPriority); + queueRequest(req, false); mActivePool.mTotalRequest++; @@ -520,19 +554,24 @@ public class RequestQueue implements RequestFeeder { HttpLog.v("dump()"); StringBuilder dump = new StringBuilder(); int count = 0; - Iterator>> iter; + Iterator> iter; // mActivePool.log(dump); if (!mPending.isEmpty()) { iter = mPending.entrySet().iterator(); while (iter.hasNext()) { - Map.Entry> entry = iter.next(); + Map.Entry entry = iter.next(); String hostName = entry.getKey().getHostName(); StringBuilder line = new StringBuilder("p" + count++ + " " + hostName + " "); - LinkedList reqList = entry.getValue(); - ListIterator reqIter = reqList.listIterator(0); + RequestSet reqList = entry.getValue(); + ListIterator reqIter = reqList.mHighPriority.listIterator(0); + while (iter.hasNext()) { + Request request = (Request)iter.next(); + line.append(request + " "); + } + reqIter = reqList.mLowPriority.listIterator(0); while (iter.hasNext()) { Request request = (Request)iter.next(); line.append(request + " "); @@ -564,7 +603,7 @@ public class RequestQueue implements RequestFeeder { Request ret = null; if (mNetworkConnected && mPending.containsKey(host)) { - LinkedList reqList = mPending.get(host); + RequestSet reqList = mPending.get(host); ret = reqList.removeFirst(); if (reqList.isEmpty()) { mPending.remove(host); @@ -597,18 +636,14 @@ public class RequestQueue implements RequestFeeder { protected synchronized void queueRequest(Request request, boolean head) { HttpHost host = request.mProxyHost == null ? request.mHost : request.mProxyHost; - LinkedList reqList; + RequestSet reqList; if (mPending.containsKey(host)) { reqList = mPending.get(host); } else { - reqList = new LinkedList(); + reqList = new RequestSet(); mPending.put(host, reqList); } - if (head) { - reqList.addFirst(request); - } else { - reqList.add(request); - } + reqList.add(request, head); } @@ -621,12 +656,12 @@ public class RequestQueue implements RequestFeeder { } /* helper */ - private Request removeFirst(LinkedHashMap> requestQueue) { + private Request removeFirst(LinkedHashMap requestQueue) { Request ret = null; - Iterator>> iter = requestQueue.entrySet().iterator(); + Iterator> iter = requestQueue.entrySet().iterator(); if (iter.hasNext()) { - Map.Entry> entry = iter.next(); - LinkedList reqList = entry.getValue(); + Map.Entry entry = iter.next(); + RequestSet reqList = entry.getValue(); ret = reqList.removeFirst(); if (reqList.isEmpty()) { requestQueue.remove(entry.getKey()); -- cgit v1.1