diff options
author | Jani Laakso <jani.laakso@itmill.com> | 2007-05-15 20:14:06 +0000 |
---|---|---|
committer | Jani Laakso <jani.laakso@itmill.com> | 2007-05-15 20:14:06 +0000 |
commit | 6ceef3011b2e25abb555cea9484e5392b28e6eb5 (patch) | |
tree | aa36f6b4284c4f86deb4d48d943ea3a4eccf1aab /src | |
parent | 7eaa7200451495cf4a662a61352163847ac68266 (diff) | |
download | vaadin-framework-6ceef3011b2e25abb555cea9484e5392b28e6eb5.tar.gz vaadin-framework-6ceef3011b2e25abb555cea9484e5392b28e6eb5.zip |
Fixed #723 (Critical memory leak)
svn changeset:1440/svn branch:trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/com/itmill/toolkit/terminal/web/ApplicationServlet.java | 35 | ||||
-rw-r--r-- | src/com/itmill/toolkit/terminal/web/ThemeFunctionLibrary.java | 6 |
2 files changed, 22 insertions, 19 deletions
diff --git a/src/com/itmill/toolkit/terminal/web/ApplicationServlet.java b/src/com/itmill/toolkit/terminal/web/ApplicationServlet.java index 3d93114c18..99c315e5c9 100644 --- a/src/com/itmill/toolkit/terminal/web/ApplicationServlet.java +++ b/src/com/itmill/toolkit/terminal/web/ApplicationServlet.java @@ -44,7 +44,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Enumeration; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -523,7 +522,7 @@ public class ApplicationServlet extends HttpServlet implements UIDLTransformer transformer = null; HttpVariableMap variableMap = null; OutputStream out = response.getOutputStream(); - HashSet currentlyDirtyWindowsForThisApplication = new HashSet(); + WeakHashMap currentlyDirtyWindowsForThisApplication = new WeakHashMap(); Application application = null; try { @@ -755,15 +754,16 @@ public class ApplicationServlet extends HttpServlet implements paintTarget.close(); // For exception handling, memorize the current dirty status - Collection dirtyWindows = (Collection) applicationToDirtyWindowSetMap + WeakHashMap dirtyWindows = (WeakHashMap) applicationToDirtyWindowSetMap .get(application); + if (dirtyWindows == null) { - dirtyWindows = new HashSet(); + dirtyWindows = new WeakHashMap(); applicationToDirtyWindowSetMap.put(application, dirtyWindows); } currentlyDirtyWindowsForThisApplication - .addAll(dirtyWindows); + .putAll((Map) dirtyWindows); // Window is now painted windowPainted(application, window); @@ -823,7 +823,7 @@ public class ApplicationServlet extends HttpServlet implements // to make sure that eventually they are repainted Application currentApplication = getApplication(request); for (Iterator iter = currentlyDirtyWindowsForThisApplication - .iterator(); iter.hasNext();) { + .keySet().iterator(); iter.hasNext();) { Window dirtyWindow = (Window) iter.next(); addDirtyWindow(currentApplication, dirtyWindow); } @@ -1712,13 +1712,13 @@ public class ApplicationServlet extends HttpServlet implements */ protected void addDirtyWindow(Application application, Window window) { synchronized (applicationToDirtyWindowSetMap) { - HashSet dirtyWindows = (HashSet) applicationToDirtyWindowSetMap + WeakHashMap dirtyWindows = (WeakHashMap) applicationToDirtyWindowSetMap .get(application); if (dirtyWindows == null) { - dirtyWindows = new HashSet(); + dirtyWindows = new WeakHashMap(); applicationToDirtyWindowSetMap.put(application, dirtyWindows); } - dirtyWindows.add(window); + dirtyWindows.put(window, Boolean.TRUE); } } @@ -1729,7 +1729,7 @@ public class ApplicationServlet extends HttpServlet implements */ protected void removeDirtyWindow(Application application, Window window) { synchronized (applicationToDirtyWindowSetMap) { - HashSet dirtyWindows = (HashSet) applicationToDirtyWindowSetMap + WeakHashMap dirtyWindows = (WeakHashMap) applicationToDirtyWindowSetMap .get(application); if (dirtyWindows != null) dirtyWindows.remove(window); @@ -1791,12 +1791,13 @@ public class ApplicationServlet extends HttpServlet implements * @param app * @return */ - protected Set getDirtyWindows(Application app) { - HashSet dirtyWindows; + protected Map getDirtyWindows(Application app) { + WeakHashMap dirtyWindows; synchronized (applicationToDirtyWindowSetMap) { - dirtyWindows = (HashSet) applicationToDirtyWindowSetMap.get(app); + dirtyWindows = (WeakHashMap) applicationToDirtyWindowSetMap + .get(app); } - return dirtyWindows; + return (Map) dirtyWindows; } /** @@ -1875,13 +1876,14 @@ public class ApplicationServlet extends HttpServlet implements } else { // Application still alive - keep updating windows - Set dws = getDirtyWindows(application); + Map dws = getDirtyWindows(application); if (dws != null && !dws.isEmpty()) { // For one of the dirty windows (in each // application) // request redraw - Window win = (Window) dws.iterator().next(); + Window win = (Window) dws.keySet().iterator() + .next(); w .println("<script>\n" + ThemeFunctionLibrary @@ -1906,6 +1908,7 @@ public class ApplicationServlet extends HttpServlet implements // Sends the generated commands and newline immediately to // browser + // TODO why space in here? why not plain ln? w.println(" "); w.flush(); response.flushBuffer(); diff --git a/src/com/itmill/toolkit/terminal/web/ThemeFunctionLibrary.java b/src/com/itmill/toolkit/terminal/web/ThemeFunctionLibrary.java index a7b62af8d7..e03f6b3d91 100644 --- a/src/com/itmill/toolkit/terminal/web/ThemeFunctionLibrary.java +++ b/src/com/itmill/toolkit/terminal/web/ThemeFunctionLibrary.java @@ -39,7 +39,7 @@ import java.util.Collection; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.LinkedList; -import java.util.Set; +import java.util.Map; import java.util.Vector; import javax.servlet.http.HttpSession; @@ -226,9 +226,9 @@ public class ThemeFunctionLibrary { LinkedList update = new LinkedList(); // Adds all the windows needto update list - Set dirtyWindows = wa != null ? wa.getDirtyWindows(app) : null; + Map dirtyWindows = wa != null ? wa.getDirtyWindows(app) : null; if (dirtyWindows != null) - for (Iterator i = dirtyWindows.iterator(); i.hasNext();) { + for (Iterator i = dirtyWindows.keySet().iterator(); i.hasNext();) { Window w = (Window) i.next(); if (w != window) { if (w instanceof FrameWindow) |