xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Wagener <peter.wage...@hypoluxo.com>
Subject Cleaning up JSVGCanvas Memory
Date Fri, 02 Jun 2006 22:42:52 GMT
Hi All,

I've recently updated my application from using the released Batik  
1.6 to a nightly build (from a week ago or so).  Most things work  
well, and it cleared up one of my more annoying issues:  previously  
having more than one JSVGCanvas instance would consistently render  
the document off-center... the nightly build apparently fixed that  
for me.

The only issue I'm having now is with cleaning up my JSVGCanvas  
instances when I want to release all the memory associated with  
them.  Here is the code I was using with the 1.6 release; my custom  
extension of JSVGCanvas includes these methods:

<code>
     void destroyCanvas() {
         ToolTipManager ttipman = ToolTipManager.sharedInstance();
         ttipman.unregisterComponent(this);
         releaseRenderingReferences();

         stopProcessing();
         removeUpdateManager();

         removeAllNodes();
         removeAll();

         bridgeContext = null;
         listener = null;
         listenerList = null;
     }

     private void removeUpdateManager() {
         if (updateManager != null) {
             updateManager.getBridgeContext().dispose();
             updateManager = null;
         }
     }

     private void removeAllNodes() {

         SVGDocument document = getSVGDocument();
         if (document != null) {
             SVGSVGElement s = document.getRootElement();
             removeNodes(s);
         }

         System.gc();
     }

     private void removeNodes(Node n) {
         Node childNode;
         Node prevChildNode;

         for (childNode = n.getLastChild(); childNode != null;) {
             if (childNode.hasChildNodes()) {
                 removeNodes(childNode);
             }
             prevChildNode = childNode.getPreviousSibling();
             if (!(childNode instanceof SVGOMPathElement)) {
                 n.removeChild(childNode);
             }

             childNode = prevChildNode;
         }
     }
</code>


The updated nightly code, however, hits a NullPointerException when  
attempting to fire an event listener after removing a child node:

java.lang.NullPointerException
	at org.apache.batik.dom.events.EventSupport.fireEventListeners 
(Unknown Source)
	at org.apache.batik.dom.events.EventSupport.fireEventListeners 
(Unknown Source)
	at org.apache.batik.dom.events.EventSupport.dispatchEvent(Unknown  
Source)
	at org.apache.batik.dom.AbstractNode.dispatchEvent(Unknown Source)
	at org.apache.batik.dom.AbstractParentNode.fireDOMNodeRemovedEvent 
(Unknown Source)
	at org.apache.batik.dom.AbstractParentNode.removeChild(Unknown Source)
	at com.W7Optics.AppClient.LMSView.shelf.ShelfViewCanvas.removeNodes 
(ShelfViewCanvas.java:71)
	at  
com.W7Optics.AppClient.LMSView.shelf.ShelfViewCanvas.removeAllNodes 
(ShelfViewCanvas.java:55)
	at com.W7Optics.AppClient.LMSView.shelf.ShelfViewCanvas.destroyCanvas 
(ShelfViewCanvas.java:35)
         ....

Interestingly, this only happens with the second instance of  
JSVGCanvas -- the first instance appears to clean itself up just  
fine.  Before I go hopping through the code myself, does anyone have  
any suggestions?


Many Thanks,

Peter

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org


Mime
View raw message