Revision: 5861
          http://jnode.svn.sourceforge.net/jnode/?rev=5861&view=rev
Author:   fduminy
Date:     2011-08-24 18:27:24 +0000 (Wed, 24 Aug 2011)
Log Message:
-----------
added class name filter to OnHeapCommand

Signed-off-by: Fabien DUMINY <fdum...@jnode.org>

Modified Paths:
--------------
    trunk/cli/descriptors/org.jnode.command.system.xml
    trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java
    trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java
    trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java
    trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java
    trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java
    trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java
    trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java

Added Paths:
-----------
    trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java
    trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java
    trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java

Modified: trunk/cli/descriptors/org.jnode.command.system.xml
===================================================================
--- trunk/cli/descriptors/org.jnode.command.system.xml  2011-08-24 18:26:16 UTC 
(rev 5860)
+++ trunk/cli/descriptors/org.jnode.command.system.xml  2011-08-24 18:27:24 UTC 
(rev 5861)
@@ -220,6 +220,7 @@
       <optionSet>
         <option argLabel="minCount"     longName="minCount"/>
         <option argLabel="minTotalSize" longName="minTotalSize"/>
+        <option argLabel="className"    longName="className"/>
       </optionSet>
     </syntax> 
     <syntax alias="page">

Modified: trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java
===================================================================
--- trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java  
2011-08-24 18:26:16 UTC (rev 5860)
+++ trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java  
2011-08-24 18:27:24 UTC (rev 5861)
@@ -27,7 +27,10 @@
 import org.jnode.shell.syntax.Argument;
 import org.jnode.shell.syntax.IntegerArgument;
 import org.jnode.shell.syntax.LongArgument;
+import org.jnode.shell.syntax.StringArgument;
 import org.jnode.vm.facade.HeapStatistics;
+import org.jnode.vm.facade.ObjectFilter;
+import org.jnode.vm.facade.SimpleObjectFilter;
 import org.jnode.vm.facade.VmUtils;
 
 /**
@@ -37,17 +40,20 @@
     
     private static final String help_inst = "the minimum instance count to 
show";
     private static final String help_size = "the minimum total size to show";
+    private static final String HELP_CLASSNAME = "the classname filter";
     private static final String help_super = "Show the number of instances on 
the heap with memory usage";
     private static final String str_on_heap = "On Heap:";
     
     private final IntegerArgument argMinInstanceCount;
     private final LongArgument argMinTotalSize;
+    private final StringArgument className;
 
     public OnHeapCommand() {
         super(help_super);
         argMinInstanceCount = new IntegerArgument("minCount", 
Argument.OPTIONAL, 1, Integer.MAX_VALUE, help_inst);
         argMinTotalSize     = new LongArgument("minTotalSize", 
Argument.OPTIONAL, 1L, Long.MAX_VALUE, help_size);
-        registerArguments(argMinInstanceCount, argMinTotalSize);
+        className           = new StringArgument("className", 
Argument.OPTIONAL | Argument.MULTIPLE, HELP_CLASSNAME);
+        registerArguments(argMinInstanceCount, argMinTotalSize, className);
     }
 
     public static void main(String[] args) throws Exception {
@@ -61,8 +67,16 @@
     public void execute() throws Exception {
         PrintWriter out = getOutput().getPrintWriter();
         out.println(str_on_heap);
-        final HeapStatistics stats = 
VmUtils.getVm().getHeapManager().getHeapStatistics();
         
+        ObjectFilter filter = null;
+        if (className.isSet()) {
+            SimpleObjectFilter f = new SimpleObjectFilter();
+            f.setClassName(className.getValues());
+            filter = f;
+        }
+        
+        final HeapStatistics stats = 
VmUtils.getVm().getHeapManager().getHeapStatistics(filter);
+        
         if (argMinInstanceCount.isSet()) {
             stats.setMinimumInstanceCount(argMinInstanceCount.getValue());
         }

Modified: trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java 2011-08-24 
18:26:16 UTC (rev 5860)
+++ trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java 2011-08-24 
18:27:24 UTC (rev 5861)
@@ -46,6 +46,14 @@
     void setMinimumTotalSize(long bytes);
 
     /**
+     * Sets the object filter. If the filter accept the object, 
+     * then it will be added to statistics.
+     * @param objectFilter
+     * 
+     */
+    void setObjectFilter(ObjectFilter objectFilter);
+
+    /**
      * Write the statistical data to an {@link Appendable}.
      * 
      * @param a

Added: trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java                 
        (rev 0)
+++ trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java 2011-08-24 
18:27:24 UTC (rev 5861)
@@ -0,0 +1,24 @@
+package org.jnode.vm.facade;
+
+/**
+ * An {@link ObjectFilter} that accepts all objects.
+ * Call {@link NoObjectFilter#INSTANCE} to get the singleton.  
+ * 
+ * @author Fabien DUMINY (fdum...@jnode.org)
+ *
+ */
+public class NoObjectFilter implements ObjectFilter {
+    public static final NoObjectFilter INSTANCE = new NoObjectFilter();
+    
+    private NoObjectFilter() {        
+    }
+    
+    /**
+     * {@inheritDoc}
+     * <br>This implementation always returns true.
+     */
+    @Override
+    public final boolean accept(String className) {
+        return true;
+    }
+}

Added: trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java                   
        (rev 0)
+++ trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java   2011-08-24 
18:27:24 UTC (rev 5861)
@@ -0,0 +1,16 @@
+package org.jnode.vm.facade;
+
+/**
+ * This interface is used to filter objects founds on heap.
+ * 
+ * @author Fabien DUMINY (fdum...@jnode.org)
+ *
+ */
+public interface ObjectFilter {
+    /**
+     * Does this filter accept the provided class ?
+     * @param className The class of the object.
+     * @return true if the filter accept the provided class.
+     */
+    boolean accept(String className);
+}

Added: trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java             
                (rev 0)
+++ trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java     
2011-08-24 18:27:24 UTC (rev 5861)
@@ -0,0 +1,42 @@
+package org.jnode.vm.facade;
+
+
+/**
+ * An {@link ObjectFilter} that accepts objects whose class name contains
+ * the string given by {@link #className}.
+ * 
+ * @author Fabien DUMINY (fdum...@jnode.org)
+ *
+ */
+public class SimpleObjectFilter implements ObjectFilter {
+    private String[] className = null;
+
+    /**
+     * Sets the className filter. Any class whose full name contains a value
+     * from <code>classNameFilter</code> array will be accepted. Other classes
+     * will be ignored and no statistics will be computed and displayed for
+     * them.
+     * @param className
+     */
+    public void setClassName(String[] className) {
+        this.className = ((className != null) && (className.length > 0)) ? 
className : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean accept(String className) {
+        if (className == null) {
+            return true;
+        }
+        
+        for (String f : this.className) {
+            if (className.contains(f)) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
+}

Modified: trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java  2011-08-24 
18:26:16 UTC (rev 5860)
+++ trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java  2011-08-24 
18:27:24 UTC (rev 5861)
@@ -91,10 +91,10 @@
 
     /**
      * Get this heap's statistics.
-     *
+     * @param objectFilter The optional filter to apply to objects found on 
heap. 
      * @return the heap statistics
      */
-    HeapStatistics getHeapStatistics();
+    HeapStatistics getHeapStatistics(ObjectFilter objectFilter);
 
     /**
      * Get this heap GC's statistics.

Modified: trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java  2011-08-24 
18:26:16 UTC (rev 5860)
+++ trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java  2011-08-24 
18:27:24 UTC (rev 5861)
@@ -35,6 +35,7 @@
 import org.jnode.vm.classmgr.VmType;
 import org.jnode.vm.facade.GCStatistics;
 import org.jnode.vm.facade.HeapStatistics;
+import org.jnode.vm.facade.ObjectFilter;
 import org.jnode.vm.facade.VmProcessor;
 import org.jnode.vm.facade.VmWriteBarrier;
 import org.jnode.vm.objects.VmSystemObject;
@@ -321,7 +322,7 @@
     /**
      * {@inheritDoc}
      */
-    public abstract HeapStatistics getHeapStatistics();
+    public abstract HeapStatistics getHeapStatistics(ObjectFilter 
objectFilter);
 
     /**
      * {@inheritDoc}

Modified: trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java  
2011-08-24 18:26:16 UTC (rev 5860)
+++ trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java  
2011-08-24 18:27:24 UTC (rev 5861)
@@ -25,6 +25,8 @@
 
 import org.jnode.util.NumberUtils;
 import org.jnode.vm.facade.HeapStatistics;
+import org.jnode.vm.facade.NoObjectFilter;
+import org.jnode.vm.facade.ObjectFilter;
 import org.jnode.vm.objects.VmSystemObject;
 
 /**
@@ -35,25 +37,28 @@
 
     private int minInstanceCount = 0;
     private long minTotalSize = 0;
+    private ObjectFilter objectFilter = NoObjectFilter.INSTANCE;
     private final TreeMap<String, HeapCounter> countData = new TreeMap<String, 
HeapCounter>();
 
     private static final char newline = '\n';
 
     public boolean contains(String classname) {
-        return countData.containsKey(classname);
+       // If we don't accept this class, we pretend to have it already to 
(maybe) avoid unnecessary work
+       // and memory allocation (we also hope to avoid a call to add(String, 
int)).
+        return !objectFilter.accept(classname) || 
countData.containsKey(classname);
     }
 
     public void add(String className, int size) {
-        HeapCounter count = (HeapCounter) countData.get(className);
-
-        if (count == null) {
-            count = new HeapCounter(className, size);
-            countData.put(className, count);
-        }
-
-        count.inc();
-
-        count = null;
+       if (objectFilter.accept(className)) {           
+               HeapCounter count = (HeapCounter) countData.get(className);
+       
+               if (count == null) {
+                   count = new HeapCounter(className, size);
+                   countData.put(className, count);
+               }
+       
+               count.inc();
+       }
     }
 
     /**
@@ -75,22 +80,34 @@
     public void setMinimumTotalSize(long bytes) {
         this.minTotalSize = bytes;
     }
-
+    
     /**
      * {@inheritDoc}
+     */
+    @Override
+    public void setObjectFilter(ObjectFilter objectFilter) {
+        this.objectFilter = (objectFilter == null) ? NoObjectFilter.INSTANCE : 
objectFilter;
+    }
+    
+    /**
+     * {@inheritDoc}
      * @throws IOException 
      */
     public void writeTo(Appendable a) throws IOException {
         boolean first = true;
 
-        for (HeapCounter c : countData.values()) {
-            if ((c.getInstanceCount() >= minInstanceCount) && 
(c.getTotalSize() >= minTotalSize)) {
-                if (first) {
-                    first = false;
-                } else {
-                    a.append(newline);
+        if (countData.isEmpty()) {
+            a.append("No object is matching criteria");
+        } else {
+            for (HeapCounter c : countData.values()) {
+                if ((c.getInstanceCount() >= minInstanceCount) && 
(c.getTotalSize() >= minTotalSize)) {
+                    if (first) {
+                        first = false;
+                    } else {
+                        a.append(newline);
+                    }
+                    c.append(a);
                 }
-                c.append(a);
             }
         }
         a.append(newline);

Modified: trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java 
2011-08-24 18:26:16 UTC (rev 5860)
+++ trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java 
2011-08-24 18:27:24 UTC (rev 5861)
@@ -35,6 +35,7 @@
 import org.jnode.vm.classmgr.VmType;
 import org.jnode.vm.facade.GCStatistics;
 import org.jnode.vm.facade.HeapStatistics;
+import org.jnode.vm.facade.ObjectFilter;
 import org.jnode.vm.facade.ObjectVisitor;
 import org.jnode.vm.facade.VmProcessor;
 import org.jnode.vm.memmgr.HeapHelper;
@@ -447,8 +448,12 @@
         return gcManager.getStatistics();
     }
 
-    public HeapStatistics getHeapStatistics() {
+    /**
+     * {@inheritDoc}
+     */
+    public HeapStatistics getHeapStatistics(ObjectFilter objectFilter) {
         final DefHeapStatistics heapStatistics = new DefHeapStatistics();
+        heapStatistics.setObjectFilter(objectFilter);
         final HeapStatisticsVisitor heapStatisticsVisitor = new 
HeapStatisticsVisitor(
             heapStatistics);
 

Modified: 
trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java
===================================================================
--- trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java    
2011-08-24 18:26:16 UTC (rev 5860)
+++ trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java    
2011-08-24 18:27:24 UTC (rev 5861)
@@ -40,6 +40,7 @@
 import org.jnode.vm.classmgr.VmNormalClass;
 import org.jnode.vm.classmgr.VmType;
 import org.jnode.vm.facade.HeapStatistics;
+import org.jnode.vm.facade.ObjectFilter;
 import org.jnode.vm.facade.VmArchitecture;
 import org.jnode.vm.facade.VmProcessor;
 import org.jnode.vm.facade.VmUtils;
@@ -179,7 +180,10 @@
         return BasePlan.freeMemory().toLong();
     }
 
-    public HeapStatistics getHeapStatistics() {
+    /**
+     * {@inheritDoc}
+     */
+    public HeapStatistics getHeapStatistics(ObjectFilter objectFilter) {
         return null;
     }
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management 
Up to 160% more powerful than alternatives and 25% more efficient. 
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to