Browse Source

Make restoreInstances clear value when previous value was gc:ed (#17603)

Change-Id: I61992c04cac578dc1158efd9c76484eacc8a6b6a
tags/7.4.5
Leif Åstrand 9 years ago
parent
commit
47335336ad

+ 2
- 3
server/src/com/vaadin/util/CurrentInstance.java View File

* unless it respects null values, will just leave the wrong UI * unless it respects null values, will just leave the wrong UI
* instance registered. * instance registered.
*/ */
set(c, null, ci.inheritable);
} else {
set(c, v, ci.inheritable);
v = null;
} }
set(c, v, ci.inheritable);
} }


if (removeStale) { if (removeStale) {

+ 45
- 0
server/tests/src/com/vaadin/util/CurrentInstanceTest.java View File



import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;


import java.lang.ref.WeakReference;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
assertNull(CurrentInstance.get(VaadinSession.class)); assertNull(CurrentInstance.get(VaadinSession.class));
assertNull(CurrentInstance.get(VaadinService.class)); assertNull(CurrentInstance.get(VaadinService.class));
} }

@Test
public void testRestoreWithGarbageCollectedValue()
throws InterruptedException {
VaadinSession session1 = new VaadinSession(null) {
@Override
public String toString() {
return "First session";
}
};
VaadinSession session2 = new VaadinSession(null) {
@Override
public String toString() {
return "Second session";
}
};

VaadinSession.setCurrent(session1);
Map<Class<?>, CurrentInstance> previous = CurrentInstance
.setCurrent(session2);

// Use weak ref to verify object is collected
WeakReference<VaadinSession> ref = new WeakReference<VaadinSession>(
session1);

session1 = null;
waitUntilGarbageCollected(ref);

CurrentInstance.restoreInstances(previous);

Assert.assertNull(VaadinSession.getCurrent());
}

private static void waitUntilGarbageCollected(WeakReference<?> ref)
throws InterruptedException {
for (int i = 0; i < 50; i++) {
System.gc();
if (ref.get() == null) {
return;
}
Thread.sleep(100);
}
Assert.fail("Value was not garbage collected.");
}
} }

Loading…
Cancel
Save