]> source.dussan.org Git - vaadin-framework.git/commitdiff
Prevent MockVaadinSession from becomming GCed
authorLeif Åstrand <leif@vaadin.com>
Tue, 9 Dec 2014 18:57:16 +0000 (20:57 +0200)
committerVaadin Code Review <review@vaadin.com>
Thu, 5 Feb 2015 09:11:14 +0000 (09:11 +0000)
This fixes the issue discussed in #14595 for the framework's internal
tests (if they use MockVaadinSession).

Change-Id: I1956680ac065428be41b2ad43fbb80503351b366

server/tests/src/com/vaadin/server/MockVaadinSession.java

index 660767e0d4178e0f3f80c4cb0075b3e37ce3d340..e1def5bceecaa0051924968973dd74e48b5a6fd6 100644 (file)
@@ -23,6 +23,15 @@ import java.util.concurrent.locks.ReentrantLock;
  * @author Vaadin Ltd
  */
 public class MockVaadinSession extends VaadinSession {
+    /*
+     * Used to make sure there's at least one reference to the mock session
+     * while it's locked. This is used to prevent the session from being eaten
+     * by GC in tests where @Before creates a session and sets it as the current
+     * instance without keeping any direct reference to it. This pattern has a
+     * chance of leaking memory if the session is not unlocked in the right way,
+     * but it should be acceptable for testing use.
+     */
+    private static final ThreadLocal<MockVaadinSession> referenceKeeper = new ThreadLocal<MockVaadinSession>();
 
     public MockVaadinSession(VaadinService service) {
         super(service);
@@ -43,6 +52,18 @@ public class MockVaadinSession extends VaadinSession {
         return lock;
     }
 
+    @Override
+    public void lock() {
+        super.lock();
+        referenceKeeper.set(this);
+    }
+
+    @Override
+    public void unlock() {
+        super.unlock();
+        referenceKeeper.remove();
+    }
+
     private int closeCount;
 
     private ReentrantLock lock = new ReentrantLock();