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 <tingna_sung@htc.com>
This commit is contained in:
tingna_sung
2014-10-25 21:32:40 +08:00
parent e06184e4b1
commit 33d8e73920
2 changed files with 17 additions and 9 deletions

View File

@@ -241,6 +241,7 @@ class DisplayContent {
mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE);
}
}
mTapDetector.setTouchExcludeRegion(mTouchExcludeRegion);
}
void switchUserStacks(int newUserId) {

View File

@@ -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);
}
}
}