summaryrefslogtreecommitdiffstats
path: root/camera/libcameraservice
diff options
context:
space:
mode:
authorChih-Chung Chang <chihchung@google.com>2010-03-05 11:33:03 -0800
committerChih-Chung Chang <chihchung@google.com>2010-03-05 15:21:02 -0800
commite86ae1bed1dfe7db8fadcdab8b39d60754063fc0 (patch)
tree4d2a3c8c23c3573aa8dc0fbeb8c76c1490fd929f /camera/libcameraservice
parent931bf89d327ecf07301231fd86b17deac535feaa (diff)
downloadframeworks_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.cpp28
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;
}