Mercurial > hg > release > icedtea8-forest-3.0 > jdk
changeset 1744:023063a403ed
6882654: Remove dependency on java.util.concurrent from KeepAlive implementaion
Reviewed-by: michaelm
author | chegar |
---|---|
date | Tue, 22 Sep 2009 14:42:07 +0100 |
parents | 81dffe63c913 |
children | 44ccaa4bb8a0 |
files | src/share/classes/sun/net/www/http/KeepAliveCache.java src/share/classes/sun/net/www/http/KeepAliveStream.java src/share/classes/sun/net/www/http/KeepAliveStreamCleaner.java |
diffstat | 3 files changed, 73 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/sun/net/www/http/KeepAliveCache.java Tue Sep 22 10:01:32 2009 +0800 +++ b/src/share/classes/sun/net/www/http/KeepAliveCache.java Tue Sep 22 14:42:07 2009 +0100 @@ -25,12 +25,11 @@ package sun.net.www.http; -import java.io.InputStream; import java.io.IOException; import java.io.NotSerializableException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; import java.net.URL; -import java.util.concurrent.ConcurrentHashMap; /** * A class that implements a cache of idle Http connections for keep-alive @@ -39,7 +38,7 @@ * @author Dave Brown */ public class KeepAliveCache - extends ConcurrentHashMap<KeepAliveKey, ClientVector> + extends HashMap<KeepAliveKey, ClientVector> implements Runnable { private static final long serialVersionUID = -2937172892064557949L; @@ -163,8 +162,8 @@ * Errs on the side of caution (leave connections idle for a relatively * short time). */ + @Override public void run() { - int total_cache; do { try { Thread.sleep(LIFETIME); @@ -311,6 +310,7 @@ /** * Determine whether or not two objects of this type are equal */ + @Override public boolean equals(Object obj) { if ((obj instanceof KeepAliveKey) == false) return false; @@ -325,6 +325,7 @@ * The hashCode() for this object is the string hashCode() of * concatenation of the protocol, host name and port. */ + @Override public int hashCode() { String str = protocol+host+port; return this.obj == null? str.hashCode() :
--- a/src/share/classes/sun/net/www/http/KeepAliveStream.java Tue Sep 22 10:01:32 2009 +0800 +++ b/src/share/classes/sun/net/www/http/KeepAliveStream.java Tue Sep 22 14:42:07 2009 +0100 @@ -25,10 +25,7 @@ package sun.net.www.http; -import java.net.URL; -import java.net.HttpURLConnection; import java.io.*; -import java.util.StringTokenizer; import sun.net.ProgressSource; import sun.net.www.MeteredStream; @@ -50,9 +47,8 @@ // has this KeepAliveStream been put on the queue for asynchronous cleanup. protected boolean queuedForCleanup = false; - private static KeepAliveStreamCleaner queue = new KeepAliveStreamCleaner(); - private static Thread cleanerThread = null; - private static boolean startCleanupThread; + private static final KeepAliveStreamCleaner queue = new KeepAliveStreamCleaner(); + private static Thread cleanerThread; // null /** * Constructor @@ -155,43 +151,46 @@ } } - private static synchronized void queueForCleanup(KeepAliveCleanerEntry kace) { - if(queue != null && !kace.getQueuedForCleanup()) { - if (!queue.offer(kace)) { - kace.getHttpClient().closeServer(); - return; + private static void queueForCleanup(KeepAliveCleanerEntry kace) { + synchronized(queue) { + if(!kace.getQueuedForCleanup()) { + if (!queue.offer(kace)) { + kace.getHttpClient().closeServer(); + return; + } + + kace.setQueuedForCleanup(); + queue.notifyAll(); + } + + boolean startCleanupThread = (cleanerThread == null); + if (!startCleanupThread) { + if (!cleanerThread.isAlive()) { + startCleanupThread = true; + } } - kace.setQueuedForCleanup(); - } - - startCleanupThread = (cleanerThread == null); - if (!startCleanupThread) { - if (!cleanerThread.isAlive()) { - startCleanupThread = true; - } - } + if (startCleanupThread) { + java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction<Void>() { + public Void run() { + // We want to create the Keep-Alive-SocketCleaner in the + // system threadgroup + ThreadGroup grp = Thread.currentThread().getThreadGroup(); + ThreadGroup parent = null; + while ((parent = grp.getParent()) != null) { + grp = parent; + } - if (startCleanupThread) { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction<Void>() { - public Void run() { - // We want to create the Keep-Alive-SocketCleaner in the - // system threadgroup - ThreadGroup grp = Thread.currentThread().getThreadGroup(); - ThreadGroup parent = null; - while ((parent = grp.getParent()) != null) { - grp = parent; + cleanerThread = new Thread(grp, queue, "Keep-Alive-SocketCleaner"); + cleanerThread.setDaemon(true); + cleanerThread.setPriority(Thread.MAX_PRIORITY - 2); + cleanerThread.start(); + return null; } - - cleanerThread = new Thread(grp, queue, "Keep-Alive-SocketCleaner"); - cleanerThread.setDaemon(true); - cleanerThread.setPriority(Thread.MAX_PRIORITY - 2); - cleanerThread.start(); - return null; - } - }); - } + }); + } + } // queue } protected long remainingToRead() {
--- a/src/share/classes/sun/net/www/http/KeepAliveStreamCleaner.java Tue Sep 22 10:01:32 2009 +0800 +++ b/src/share/classes/sun/net/www/http/KeepAliveStreamCleaner.java Tue Sep 22 14:42:07 2009 +0100 @@ -25,9 +25,8 @@ package sun.net.www.http; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; import java.io.IOException; +import java.util.LinkedList; import sun.net.NetProperties; import java.security.AccessController; import java.security.PrivilegedAction; @@ -44,7 +43,9 @@ */ @SuppressWarnings("serial") // never serialized -public class KeepAliveStreamCleaner extends LinkedBlockingQueue<KeepAliveCleanerEntry> implements Runnable +class KeepAliveStreamCleaner + extends LinkedList<KeepAliveCleanerEntry> + implements Runnable { // maximum amount of remaining data that we will try to cleanup protected static int MAX_DATA_REMAINING = 512; @@ -78,23 +79,39 @@ } - public KeepAliveStreamCleaner() - { - super(MAX_CAPACITY); + @Override + public boolean offer(KeepAliveCleanerEntry e) { + if (size() >= MAX_CAPACITY) + return false; + + return super.offer(e); } - public KeepAliveStreamCleaner(int capacity) - { - super(capacity); - } - + @Override public void run() { KeepAliveCleanerEntry kace = null; do { try { - kace = poll((long)TIMEOUT, TimeUnit.MILLISECONDS); + synchronized(this) { + long before = System.currentTimeMillis(); + long timeout = TIMEOUT; + while ((kace = poll()) == null) { + this.wait(timeout); + + long after = System.currentTimeMillis(); + long elapsed = after - before; + if (elapsed > timeout) { + /* one last try */ + kace = poll(); + break; + } + before = after; + timeout -= elapsed; + } + } + if(kace == null) break;