diff options
author | Chih-Chung Chang <chihchung@google.com> | 2010-03-05 11:33:03 -0800 |
---|---|---|
committer | Chih-Chung Chang <chihchung@google.com> | 2010-03-05 15:21:02 -0800 |
commit | e86ae1bed1dfe7db8fadcdab8b39d60754063fc0 (patch) | |
tree | 4d2a3c8c23c3573aa8dc0fbeb8c76c1490fd929f /camera/libcameraservice | |
parent | 931bf89d327ecf07301231fd86b17deac535feaa (diff) | |
download | frameworks_base-e86ae1bed1dfe7db8fadcdab8b39d60754063fc0.zip frameworks_base-e86ae1bed1dfe7db8fadcdab8b39d60754063fc0.tar.gz frameworks_base-e86ae1bed1dfe7db8fadcdab8b39d60754063fc0.tar.bz2 |
Still do dump() if we cannot get mServiceLock for a while.
Diffstat (limited to 'camera/libcameraservice')
-rw-r--r-- | camera/libcameraservice/CameraService.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
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<ICameraClient>& 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<String16>& 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<String16>& 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<Client> currentClient = mClient.promote(); sprintf(buffer, "Client (%p) PID: %d\n", @@ -1317,6 +1341,8 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) result.append("No camera client yet.\n"); write(fd, result.string(), result.size()); } + + if (locked) mServiceLock.unlock(); } return NO_ERROR; } |