Revision: 1039
Author: heuermh
Date: Fri Aug 6 08:50:49 2010
Log: Issue 185 ; applying patch from atdixon with minor changes, list of
activities is cleared after activities are processed
http://code.google.com/p/piccolo2d/source/detail?r=1039
Added:
/piccolo2d.java/branches/release-1.3/examples/src/main/java/edu/umd/cs/piccolo/examples/ActivityMemoryLeakBugExample.java
Modified:
/piccolo2d.java/branches/release-1.3/core/src/main/java/edu/umd/cs/piccolo/activities/PActivityScheduler.java
/piccolo2d.java/branches/release-1.3/parent/pom.xml
=======================================
--- /dev/null
+++
/piccolo2d.java/branches/release-1.3/examples/src/main/java/edu/umd/cs/piccolo/examples/ActivityMemoryLeakBugExample.java
Fri Aug 6 08:50:49 2010
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2008-2010, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolo.examples;
+
+import edu.umd.cs.piccolo.PLayer;
+import edu.umd.cs.piccolo.PNode;
+import edu.umd.cs.piccolo.activities.PActivity;
+import edu.umd.cs.piccolo.nodes.PPath;
+import edu.umd.cs.piccolox.PFrame;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.lang.ref.WeakReference;
+
+/**
+ * Example that demonstrates the memory leak in Issue 185.
+ * <p>
+ * Memory leak - PActivityScheduler keeps processed activities in
reference<br/>
+ * {...@link http://code.google.com/p/piccolo2d/issues/detail?id=185}
+ * </p>
+ */
+public class ActivityMemoryLeakBugExample extends PFrame {
+
+ public static void main(String[] args) {
+ new ActivityMemoryLeakBugExample();
+ }
+
+ /** {...@inheritdoc} */
+ public void initialize() {
+ final PLayer layer = getCanvas().getLayer();
+ // Create the node that we expect to get garbage collected.
+ PNode node = PPath.createEllipse(20, 20, 20, 20);
+ layer.addChild(node);
+ // Create a WeakReference to the node so we can detect if it is
gc'd.
+ final WeakReference ref = new WeakReference(layer.getChild(0));
+ // Create and execute an activity.
+ ((PNode) ref.get()).animateToPositionScaleRotation(0, 0, 5.0, 0,
1000);
+ // Create a Timer that will start after the activity and repeat.
+ new Timer(2000, new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ // Remove our reference to the node.
+ layer.removeAllChildren();
+ // Force garbage collection.
+ System.gc();
+ // This should print null if the node was successfully
gc'd. (IT never does.)
+ System.out.println(ref.get());
+ // This prints 0 as expected.
+
System.out.println(layer.getRoot().getActivityScheduler().getActivitiesReference().size());
+ }
+ }).start();
+ // This will cause any previous activity references to clear.
+ forceCleanupOfPriorActivities(layer);
+ }
+
+ private void forceCleanupOfPriorActivities(final PLayer layer) {
+ new Thread() {
+ /** {...@inheritdoc} */
+ public void run() {
+ // Wait 6 seconds before doing the cleanup so the bug can
be witnessed.
+ try {
+ Thread.sleep(6000);
+ }
+ catch (InterruptedException e) {
+ // empty
+ }
+
+ PActivity a = new PActivity(-1) {
+ /** {...@inheritdoc} */
+ protected void activityStep(final long
elapsedTime) {
+ System.out.println("cleanup activity");
+ terminate();
+ }
+ };
+ layer.getRoot().addActivity(a);
+ }
+ }.start();
+ }
+}
=======================================
---
/piccolo2d.java/branches/release-1.3/core/src/main/java/edu/umd/cs/piccolo/activities/PActivityScheduler.java
Mon Jan 18 16:07:38 2010
+++
/piccolo2d.java/branches/release-1.3/core/src/main/java/edu/umd/cs/piccolo/activities/PActivityScheduler.java
Fri Aug 6 08:50:49 2010
@@ -175,6 +175,7 @@
final PActivity each = (PActivity)
processingActivities.get(i);
each.processStep(currentTime);
}
+ processingActivities.clear();
}
}
=======================================
--- /piccolo2d.java/branches/release-1.3/parent/pom.xml Tue Mar 30 19:17:33
2010
+++ /piccolo2d.java/branches/release-1.3/parent/pom.xml Fri Aug 6 08:50:49
2010
@@ -211,6 +211,14 @@
</roles>
<timezone>+2</timezone>
</contributor>
+ <contributor>
+ <name>Aaron Dixon</name>
+ <email>atdi...@gmail.com</email>
+ <roles>
+ <role>developer</role>
+ </roles>
+ <timezone>-6</timezone>
+ </contributor>
</contributors>
<build>
<pluginManagement>
--
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en