зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1240622 - Guard mCheckerboardEvent with a mutex to avoid races. r=botond
--HG-- extra : commitid : 9LLumoyfORc
This commit is contained in:
Родитель
e60fcbe3af
Коммит
2398798d67
|
@ -862,7 +862,8 @@ AsyncPanZoomController::AsyncPanZoomController(uint64_t aLayersId,
|
|||
mInputQueue(aInputQueue),
|
||||
mAPZCId(sAsyncPanZoomControllerCount++),
|
||||
mSharedLock(nullptr),
|
||||
mAsyncTransformAppliedToContent(false)
|
||||
mAsyncTransformAppliedToContent(false),
|
||||
mCheckerboardEventLock("APZCBELock")
|
||||
{
|
||||
if (aGestures == USE_GESTURE_DETECTOR) {
|
||||
mGestureEventListener = new GestureEventListener(this);
|
||||
|
@ -2871,6 +2872,8 @@ AsyncPanZoomController::RequestContentRepaint(const FrameMetrics& aFrameMetrics,
|
|||
}
|
||||
|
||||
APZC_LOG_FM(aFrameMetrics, "%p requesting content repaint", this);
|
||||
{ // scope lock
|
||||
MutexAutoLock lock(mCheckerboardEventLock);
|
||||
if (mCheckerboardEvent && mCheckerboardEvent->IsRecordingTrace()) {
|
||||
std::stringstream info;
|
||||
info << " velocity " << aVelocity;
|
||||
|
@ -2879,6 +2882,7 @@ AsyncPanZoomController::RequestContentRepaint(const FrameMetrics& aFrameMetrics,
|
|||
CheckerboardEvent::RequestedDisplayPort, GetDisplayPortRect(aFrameMetrics),
|
||||
str);
|
||||
}
|
||||
}
|
||||
|
||||
controller->RequestContentRepaint(aFrameMetrics);
|
||||
mExpectedGeckoMetrics = aFrameMetrics;
|
||||
|
@ -2981,6 +2985,8 @@ bool AsyncPanZoomController::AdvanceAnimations(const TimeStamp& aSampleTime)
|
|||
|
||||
requestAnimationFrame = UpdateAnimation(aSampleTime, &deferredTasks);
|
||||
|
||||
{ // scope lock
|
||||
MutexAutoLock lock(mCheckerboardEventLock);
|
||||
if (mCheckerboardEvent) {
|
||||
mCheckerboardEvent->UpdateRendertraceProperty(
|
||||
CheckerboardEvent::UserVisible,
|
||||
|
@ -2988,6 +2994,7 @@ bool AsyncPanZoomController::AdvanceAnimations(const TimeStamp& aSampleTime)
|
|||
mFrameMetrics.CalculateCompositedSizeInCssPixels()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Execute any deferred tasks queued up by mAnimation's Sample() (called by
|
||||
// UpdateAnimation()). This needs to be done after the monitor is released
|
||||
|
@ -3106,10 +3113,12 @@ AsyncPanZoomController::ReportCheckerboard(const TimeStamp& aSampleTime)
|
|||
|
||||
bool recordTrace = gfxPrefs::APZRecordCheckerboarding();
|
||||
bool forTelemetry = Telemetry::CanRecordExtended();
|
||||
uint32_t magnitude = GetCheckerboardMagnitude();
|
||||
|
||||
MutexAutoLock lock(mCheckerboardEventLock);
|
||||
if (!mCheckerboardEvent && (recordTrace || forTelemetry)) {
|
||||
mCheckerboardEvent = MakeUnique<CheckerboardEvent>(recordTrace);
|
||||
}
|
||||
uint32_t magnitude = GetCheckerboardMagnitude();
|
||||
if (magnitude) {
|
||||
mPotentialCheckerboardTracker.CheckerboardSeen();
|
||||
}
|
||||
|
@ -3168,6 +3177,8 @@ void AsyncPanZoomController::NotifyLayersUpdated(const FrameMetrics& aLayerMetri
|
|||
APZC_LOG_FM(aLayerMetrics, "%p got a NotifyLayersUpdated with aIsFirstPaint=%d, aThisLayerTreeUpdated=%d",
|
||||
this, aIsFirstPaint, aThisLayerTreeUpdated);
|
||||
|
||||
{ // scope lock
|
||||
MutexAutoLock lock(mCheckerboardEventLock);
|
||||
if (mCheckerboardEvent && mCheckerboardEvent->IsRecordingTrace()) {
|
||||
std::string str;
|
||||
if (aThisLayerTreeUpdated) {
|
||||
|
@ -3200,6 +3211,7 @@ void AsyncPanZoomController::NotifyLayersUpdated(const FrameMetrics& aLayerMetri
|
|||
aLayerMetrics.GetCriticalDisplayPort() + aLayerMetrics.GetScrollOffset());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool needContentRepaint = false;
|
||||
bool viewportUpdated = false;
|
||||
|
|
|
@ -1102,6 +1102,8 @@ private:
|
|||
* recording.
|
||||
*/
|
||||
private:
|
||||
// Mutex protecting mCheckerboardEvent
|
||||
Mutex mCheckerboardEventLock;
|
||||
// This is created when this APZC instance is first included as part of a
|
||||
// composite. If a checkerboard event takes place, this is destroyed at the
|
||||
// end of the event, and a new one is created on the next composite.
|
||||
|
|
Загрузка…
Ссылка в новой задаче