From 33d8e739206b7a5ed99cf9bf73d63f9b6c0d2a4e Mon Sep 17 00:00:00 2001 From: tingna_sung Date: Sat, 25 Oct 2014 21:32:40 +0800 Subject: [PATCH] Fix racing condition of mTouchExcludeRegion Copy region from DisplayContent.mTouchExcludeRegion instead of directly refer to the same object of DisplayContent, and able to protect it by lock of self class, don't have to lock out mWindowMap on every tap. This fix is to avoid racing condition of mTouchExcludeRegion. Change-Id: I7401968167c2e539b4da2afe71e3020038fbfcbf Signed-off-by: tingna_sung --- .../com/android/server/wm/DisplayContent.java | 1 + .../wm/StackTapPointerEventListener.java | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 30589b1c27a01..c6c26663adcae 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -241,6 +241,7 @@ class DisplayContent { mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE); } } + mTapDetector.setTouchExcludeRegion(mTouchExcludeRegion); } void switchUserStacks(int newUserId) { diff --git a/services/core/java/com/android/server/wm/StackTapPointerEventListener.java b/services/core/java/com/android/server/wm/StackTapPointerEventListener.java index 80eb453cdfeab..1a85993b69af6 100644 --- a/services/core/java/com/android/server/wm/StackTapPointerEventListener.java +++ b/services/core/java/com/android/server/wm/StackTapPointerEventListener.java @@ -31,7 +31,7 @@ public class StackTapPointerEventListener implements PointerEventListener { private float mDownX; private float mDownY; private int mPointerId; - final private Region mTouchExcludeRegion; + final private Region mTouchExcludeRegion = new Region(); private final WindowManagerService mService; private final DisplayContent mDisplayContent; @@ -39,7 +39,6 @@ public class StackTapPointerEventListener implements PointerEventListener { DisplayContent displayContent) { mService = service; mDisplayContent = displayContent; - mTouchExcludeRegion = displayContent.mTouchExcludeRegion; DisplayInfo info = displayContent.getDisplayInfo(); mMotionSlop = (int)(info.logicalDensityDpi * TAP_MOTION_SLOP_INCHES); } @@ -72,13 +71,15 @@ public class StackTapPointerEventListener implements PointerEventListener { if (mPointerId == motionEvent.getPointerId(index)) { final int x = (int)motionEvent.getX(index); final int y = (int)motionEvent.getY(index); - if ((motionEvent.getEventTime() - motionEvent.getDownTime()) - < TAP_TIMEOUT_MSEC - && Math.abs(x - mDownX) < mMotionSlop - && Math.abs(y - mDownY) < mMotionSlop - && !mTouchExcludeRegion.contains(x, y)) { - mService.mH.obtainMessage(H.TAP_OUTSIDE_STACK, x, y, - mDisplayContent).sendToTarget(); + synchronized(this) { + if ((motionEvent.getEventTime() - motionEvent.getDownTime()) + < TAP_TIMEOUT_MSEC + && Math.abs(x - mDownX) < mMotionSlop + && Math.abs(y - mDownY) < mMotionSlop + && !mTouchExcludeRegion.contains(x, y)) { + mService.mH.obtainMessage(H.TAP_OUTSIDE_STACK, x, y, + mDisplayContent).sendToTarget(); + } } mPointerId = -1; } @@ -86,4 +87,10 @@ public class StackTapPointerEventListener implements PointerEventListener { } } } + + void setTouchExcludeRegion(Region newRegion) { + synchronized (this) { + mTouchExcludeRegion.set(newRegion); + } + } }