You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ad...@apache.org on 2004/02/05 04:24:26 UTC
cvs commit: incubator-geronimo/modules/remoting/src/java/org/apache/geronimo/remoting/transport/async Correlator.java
adc 2004/02/04 19:24:26
Modified: modules/remoting/src/java/org/apache/geronimo/remoting/transport/async
Correlator.java
Log:
Removed strong references to keys
Revision Changes Path
1.2 +40 -12 incubator-geronimo/modules/remoting/src/java/org/apache/geronimo/remoting/transport/async/Correlator.java
Index: Correlator.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/remoting/src/java/org/apache/geronimo/remoting/transport/async/Correlator.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Correlator.java 16 Nov 2003 05:27:33 -0000 1.1
+++ Correlator.java 5 Feb 2004 03:24:26 -0000 1.2
@@ -56,22 +56,26 @@
*/
package org.apache.geronimo.remoting.transport.async;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
import java.util.Map;
-import java.util.WeakHashMap;
+
+import EDU.oswego.cs.dl.util.concurrent.Slot;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import EDU.oswego.cs.dl.util.concurrent.Slot;
/**
* Allows you to create a request to which
- * you can at a later time wait for the response to
+ * you can at a later time wait for the response to
* arrive asynchrously.
- *
+ *
* @version $Revision$ $Date$
*/
public class Correlator {
+ private final ReferenceQueue queue = new ReferenceQueue();
static public class FutureResult extends Slot {
private final HashKey key;
@@ -89,8 +93,8 @@
/**
* Since a incrementing int is used as a key to a HashMap,
- * this class is used to calculate a hashCode that is more
- * spred to get better hashing.
+ * this class is used to calculate a hashCode that is more
+ * spred to get better hashing.
*/
private static class HashKey {
final int value;
@@ -104,20 +108,31 @@
rc *= Integer.MAX_VALUE / 7;
hashCode = (int) (rc % Integer.MAX_VALUE);
}
+
/**
* Not a very proper equals since it takes
* shortcuts, but since this class is not used
- * in a general case, it's ok.
+ * in a general case, it's ok.
*/
public boolean equals(Object obj) {
return ((HashKey) obj).value == value;
}
+
public int hashCode() {
return hashCode;
}
}
- private Map slots = new WeakHashMap(100);
+ private class SlotReference extends WeakReference {
+ private final Object key;
+
+ public SlotReference(Object key, Object lock) {
+ super(lock, queue);
+ this.key = key;
+ }
+ }
+
+ private Map slots = new HashMap(100);
private int nextFutureResultID = 0;
private Object nextFutureResultIDLock = new Object();
@@ -131,7 +146,7 @@
HashKey key = new HashKey(getNextFutureResultID());
FutureResult s = new FutureResult(key);
synchronized (slots) {
- slots.put(key, s);
+ slots.put(key, new SlotReference(key, s));
}
if (log.isTraceEnabled())
log.trace("Created Request: " + key.value);
@@ -142,9 +157,13 @@
if (log.isTraceEnabled())
log.trace("Received resposne for request: " + id);
- FutureResult s;
+ FutureResult s = null;
synchronized (slots) {
- s = (FutureResult) slots.get(new HashKey(id));
+ processQueue();
+ SlotReference ref = (SlotReference) slots.get(new HashKey(id));
+ if (ref != null) {
+ s = (FutureResult) ref.get();
+ }
}
if (s != null) {
try {
@@ -156,5 +175,14 @@
log.trace("The request may have timed out. Request slot was not found");
}
+ }
+
+ private void processQueue() {
+ SlotReference slotRef;
+ while ((slotRef = (SlotReference) queue.poll()) != null) {
+ synchronized (slots) {
+ slots.remove(slotRef.key);
+ }
+ }
}
}