}
}
- bool enabled = enabled_;
int display = display_;
std::shared_ptr<VsyncCallback> callback(callback_);
Unlock();
- if (!enabled)
- return;
-
DrmCrtc *crtc = drm_->GetCrtcForDisplay(display);
if (!crtc) {
ALOGE("Failed to get crtc for display");
}
/*
+ * VSync could be disabled during routine execution so it could potentially
+ * lead to crash since callback's inner hook could be invalid anymore. We have
+ * no control over lifetime of this hook, therefore we can't rely that it'll
+ * be valid after vsync disabling.
+ *
+ * Blocking VSyncControl to wait until routine
+ * will finish execution is logically correct way to fix this issue, but it
+ * creates visible lags and stutters, so we have to resort to other ways of
+ * mitigating this issue.
+ *
+ * Doing check before attempt to invoke callback drastically shortens the
+ * window when such situation could happen and that allows us to practically
+ * avoid this issue.
+ *
+ * Please note that issue described below is different one and it is related
+ * to RegisterCallback, not to disabling vsync via VSyncControl.
+ */
+ if (!enabled_)
+ return;
+ /*
* There's a race here where a change in callback_ will not take effect until
* the next subsequent requested vsync. This is unavoidable since we can't
* call the vsync hook while holding the thread lock.