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

This commit is contained in:
TreeHugger Robot
2017-08-18 00:40:55 +00:00
committed by Android (Google) Code Review

View File

@@ -115,41 +115,6 @@ public class AppWindowContainerController
mListener.onWindowsGone(); 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 = () -> { private final Runnable mAddStartingWindow = () -> {
final StartingData startingData; final StartingData startingData;
final AppWindowToken container; final AppWindowToken container;
@@ -649,13 +614,6 @@ public class AppWindowContainerController
public void removeStartingWindow() { public void removeStartingWindow() {
synchronized (mWindowMap) { 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.startingWindow == null) {
if (mContainer.startingData != null) { if (mContainer.startingData != null) {
// Starting window has not been added yet, but it is scheduled to be added. // Starting window has not been added yet, but it is scheduled to be added.
@@ -667,9 +625,36 @@ public class AppWindowContainerController
return; 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 if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Schedule remove starting " + mContainer
+ " startingWindow=" + mContainer.startingWindow); + " startingWindow=" + mContainer.startingWindow
mHandler.post(mRemoveStartingWindow); + " startingView=" + mContainer.startingSurface);
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);
}
});
} }
} }