From e86ae1bed1dfe7db8fadcdab8b39d60754063fc0 Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Fri, 5 Mar 2010 11:33:03 -0800 Subject: Still do dump() if we cannot get mServiceLock for a while. --- camera/libcameraservice/CameraService.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'camera/libcameraservice') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 7e81e90..00bd54e 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -1291,8 +1291,26 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(const sp& client->dataCallback(CAMERA_MSG_PREVIEW_FRAME, frame); } +static const int kDumpLockRetries = 50; +static const int kDumpLockSleep = 60000; + +static bool tryLock(Mutex& mutex) +{ + bool locked = false; + for (int i = 0; i < kDumpLockRetries; ++i) { + if (mutex.tryLock() == NO_ERROR) { + locked = true; + break; + } + usleep(kDumpLockSleep); + } + return locked; +} + status_t CameraService::dump(int fd, const Vector& args) { + static const char* kDeadlockedString = "CameraService may be deadlocked\n"; + const size_t SIZE = 256; char buffer[SIZE]; String8 result; @@ -1304,7 +1322,13 @@ status_t CameraService::dump(int fd, const Vector& args) result.append(buffer); write(fd, result.string(), result.size()); } else { - AutoMutex lock(&mServiceLock); + bool locked = tryLock(mServiceLock); + // failed to lock - CameraService is probably deadlocked + if (!locked) { + String8 result(kDeadlockedString); + write(fd, result.string(), result.size()); + } + if (mClient != 0) { sp currentClient = mClient.promote(); sprintf(buffer, "Client (%p) PID: %d\n", @@ -1317,6 +1341,8 @@ status_t CameraService::dump(int fd, const Vector& args) result.append("No camera client yet.\n"); write(fd, result.string(), result.size()); } + + if (locked) mServiceLock.unlock(); } return NO_ERROR; } -- cgit v1.1