summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Sparks <davidsparks@android.com> 2009-10-07 19:18:20 -0700
committer Dave Sparks <davidsparks@android.com> 2009-10-07 19:22:02 -0700
commit587f7830a1cb5a49ab413239aaeb8b111738bdd9 (patch)
treeb89ebcd42ab78585b72a14de06c8f18f3b40d0cf
parentb4055a63dc71f2c522dbcbd22af9c75823c00488 (diff)
Retry overlay create if it fails. Bug 2153980.
Occasionally we see references to the overlay hanging around long enough to cause problems in applications when they tried to destroy the overlay and re-create it. This patch causes the camera HAL to retry the overlay creation call if it fails every 20ms up to 50 times before it gives up.
-rw-r--r--camera/libcameraservice/CameraService.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp
index 8279914f97..b63e97fdc4 100644
--- a/camera/libcameraservice/CameraService.cpp
+++ b/camera/libcameraservice/CameraService.cpp
@@ -563,7 +563,19 @@ status_t CameraService::Client::setOverlay()
status_t ret = NO_ERROR;
if (mSurface != 0) {
if (mOverlayRef.get() == NULL) {
- mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT);
+
+ // FIXME:
+ // Surfaceflinger may hold onto the previous overlay reference for some
+ // time after we try to destroy it. retry a few times. In the future, we
+ // should make the destroy call block, or possibly specify that we can
+ // wait in the createOverlay call if the previous overlay is in the
+ // process of being destroyed.
+ for (int retry = 0; retry < 50; ++retry) {
+ mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT);
+ if (mOverlayRef != NULL) break;
+ LOGD("Overlay create failed - retrying");
+ usleep(20000);
+ }
if ( mOverlayRef.get() == NULL )
{
LOGE("Overlay Creation Failed!");