Merge "Fix starting window leak when adding/removing quickly" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-05-23 20:32:26 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 12 deletions

View File

@@ -107,7 +107,7 @@ public class AppWindowContainerController
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer
+ ": startingWindow=" + mContainer.startingWindow + ": startingWindow=" + mContainer.startingWindow
+ " startingView=" + mContainer.startingSurface); + " startingView=" + mContainer.startingSurface);
if (mContainer.startingWindow != null) { if (mContainer.startingData != null) {
surface = mContainer.startingSurface; surface = mContainer.startingSurface;
mContainer.startingData = null; mContainer.startingData = null;
mContainer.startingSurface = null; mContainer.startingSurface = null;
@@ -164,18 +164,16 @@ public class AppWindowContainerController
if (surface != null) { if (surface != null) {
boolean abort = false; boolean abort = false;
synchronized(mWindowMap) { synchronized(mWindowMap) {
// If the window was successfully added, then
// we need to remove it.
if (container.removed || container.startingData == null) { if (container.removed || container.startingData == null) {
// If the window was successfully added, then if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
// we need to remove it. "Aborted starting " + container
if (container.startingWindow != null) { + ": removed=" + container.removed
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, + " startingData=" + container.startingData);
"Aborted starting " + container container.startingWindow = null;
+ ": removed=" + container.removed container.startingData = null;
+ " startingData=" + container.startingData); abort = true;
container.startingWindow = null;
container.startingData = null;
abort = true;
}
} else { } else {
container.startingSurface = surface; container.startingSurface = surface;
} }

View File

@@ -19,18 +19,24 @@ package com.android.server.wm;
import org.junit.Test; import org.junit.Test;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.SecurityTest;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4; import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.res.Configuration.EMPTY; import static android.content.res.Configuration.EMPTY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import java.util.function.Consumer;
/** /**
* Test class for {@link AppWindowContainerController}. * Test class for {@link AppWindowContainerController}.
* *
@@ -90,6 +96,9 @@ public class AppWindowContainerControllerTests extends WindowTestsBase {
assertNull(atoken.startingSurface); assertNull(atoken.startingSurface);
assertNull(atoken.startingWindow); assertNull(atoken.startingWindow);
assertNull(atoken.startingData); assertNull(atoken.startingData);
atoken.forAllWindows(windowState -> {
assertFalse(windowState.getBaseType() == TYPE_APPLICATION_STARTING);
}, true);
} }
@Test @Test
@@ -107,6 +116,22 @@ public class AppWindowContainerControllerTests extends WindowTestsBase {
assertNoStartingWindow(atoken); assertNoStartingWindow(atoken);
} }
@Test
public void testAddRemoveRace() throws Exception {
// There was once a race condition between adding and removing starting windows
for (int i = 0; i < 1000; i++) {
final WindowTestUtils.TestAppWindowContainerController controller =
createAppWindowController();
controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,
false);
controller.removeStartingWindow();
waitUntilHandlersIdle();
assertNoStartingWindow(controller.getAppWindowToken(mDisplayContent));
}
}
@Test @Test
public void testTransferStartingWindow() throws Exception { public void testTransferStartingWindow() throws Exception {
final WindowTestUtils.TestAppWindowContainerController controller1 = final WindowTestUtils.TestAppWindowContainerController controller1 =