Merge "Fix race condition of removing surface." into oc-dr1-dev

This commit is contained in:
Seigo Nonaka
2017-07-19 23:54:11 +00:00
committed by Android (Google) Code Review

View File

@@ -115,41 +115,6 @@ public class AppWindowContainerController
mListener.onWindowsGone();
};
private final Runnable mRemoveStartingWindow = () -> {
StartingSurface surface = null;
synchronized (mWindowMap) {
if (mContainer == null) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "mContainer was null while trying to"
+ " remove starting window");
return;
}
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer
+ ": startingWindow=" + mContainer.startingWindow
+ " startingView=" + mContainer.startingSurface);
if (mContainer.startingData != null) {
surface = mContainer.startingSurface;
mContainer.startingData = null;
mContainer.startingSurface = null;
mContainer.startingWindow = null;
mContainer.startingDisplayed = false;
if (surface == null && DEBUG_STARTING_WINDOW) {
Slog.v(TAG_WM, "startingWindow was set but startingSurface==null, couldn't "
+ "remove");
}
} else if (DEBUG_STARTING_WINDOW) {
Slog.v(TAG_WM, "Tried to remove starting window but startingWindow was null:"
+ mContainer);
}
}
if (surface != null) {
try {
surface.remove();
} catch (Exception e) {
Slog.w(TAG_WM, "Exception when removing starting window", e);
}
}
};
private final Runnable mAddStartingWindow = () -> {
final StartingData startingData;
final AppWindowToken container;
@@ -665,13 +630,6 @@ public class AppWindowContainerController
void removeStartingWindow() {
synchronized (mWindowMap) {
if (mHandler.hasCallbacks(mRemoveStartingWindow)) {
// Already scheduled.
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Trying to remove starting window but "
+ "already scheduled");
return;
}
if (mContainer.startingWindow == null) {
if (mContainer.startingData != null) {
// Starting window has not been added yet, but it is scheduled to be added.
@@ -683,12 +641,39 @@ public class AppWindowContainerController
return;
}
final StartingSurface surface;
if (mContainer.startingData != null) {
surface = mContainer.startingSurface;
mContainer.startingData = null;
mContainer.startingSurface = null;
mContainer.startingWindow = null;
mContainer.startingDisplayed = false;
if (surface == null && DEBUG_STARTING_WINDOW) {
Slog.v(TAG_WM, "startingWindow was set but startingSurface==null, couldn't "
+ "remove");
}
} else {
if (DEBUG_STARTING_WINDOW) {
Slog.v(TAG_WM, "Tried to remove starting window but startingWindow was null:"
+ mContainer);
}
return;
}
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Schedule remove starting " + mContainer
+ " startingWindow=" + mContainer.startingWindow);
+ " startingWindow=" + mContainer.startingWindow
+ " startingView=" + mContainer.startingSurface);
// Use the same thread to remove the window as we used to add it, as otherwise we end up
// with things in the view hierarchy being called from different threads.
mService.mAnimationHandler.post(mRemoveStartingWindow);
mHandler.post(() -> {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Removing startingView=" + surface);
try {
surface.remove();
} catch (Exception e) {
Slog.w(TAG_WM, "Exception when removing starting window", e);
}
});
}
}