You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2008/04/14 08:57:11 UTC
svn commit: r647674 -
/mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java
Author: trustin
Date: Sun Apr 13 23:57:07 2008
New Revision: 647674
URL: http://svn.apache.org/viewvc?rev=647674&view=rev
Log:
Improved DefaultIoEventSizeEstimator to understand WriteRequest
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java?rev=647674&r1=647673&r2=647674&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/executor/DefaultIoEventSizeEstimator.java Sun Apr 13 23:57:07 2008
@@ -28,6 +28,7 @@
import org.apache.mina.common.IoBuffer;
import org.apache.mina.common.IoEvent;
+import org.apache.mina.common.WriteRequest;
/**
* A default {@link IoEventSizeEstimator} implementation.
@@ -39,14 +40,14 @@
* (default: 64).
* <p>
* All the estimated sizes of classes are cached for performance improvement.
- *
+ *
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev$, $Date$
*/
public class DefaultIoEventSizeEstimator implements IoEventSizeEstimator {
private final ConcurrentMap<Class<?>, Integer> class2size = new ConcurrentHashMap<Class<?>, Integer>();
-
+
public DefaultIoEventSizeEstimator() {
class2size.put(boolean.class, 4); // Probably an integer.
class2size.put(byte.class, 1);
@@ -58,20 +59,22 @@
class2size.put(double.class, 8);
class2size.put(void.class, 0);
}
-
+
public int estimateSize(IoEvent event) {
return estimateSize((Object) event) + estimateSize(event.getParameter());
}
-
+
public int estimateSize(Object message) {
if (message == null) {
return 8;
}
int answer = 8 + estimateSize(message.getClass(), null);
-
+
if (message instanceof IoBuffer) {
answer += ((IoBuffer) message).remaining();
+ } else if (message instanceof WriteRequest) {
+ answer += estimateSize(((WriteRequest) message).getMessage());
} else if (message instanceof CharSequence) {
answer += ((CharSequence) message).length() << 1;
} else if (message instanceof Iterable) {
@@ -79,16 +82,16 @@
answer += estimateSize(m);
}
}
-
+
return align(answer);
}
-
+
private int estimateSize(Class<?> clazz, Set<Class<?>> visitedClasses) {
Integer objectSize = class2size.get(clazz);
if (objectSize != null) {
return objectSize;
}
-
+
if (visitedClasses != null) {
if (visitedClasses.contains(clazz)) {
return 0;
@@ -96,9 +99,9 @@
} else {
visitedClasses = new HashSet<Class<?>>();
}
-
+
visitedClasses.add(clazz);
-
+
int answer = 8; // Basic overhead.
for (Class<?> c = clazz; c != null; c = c.getSuperclass()) {
Field[] fields = c.getDeclaredFields();
@@ -107,21 +110,21 @@
// Ignore static fields.
continue;
}
-
+
answer += estimateSize(f.getType(), visitedClasses);
}
}
-
+
visitedClasses.remove(clazz);
-
+
// Some alignment.
answer = align(answer);
-
+
// Put the final answer.
class2size.putIfAbsent(clazz, answer);
return answer;
}
-
+
private static int align(int size) {
if (size % 8 != 0) {
size /= 8;