From d5d1ebd7682aaf09cd54243910437da43f12295e Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Wed, 24 Jun 2009 19:59:31 +0800 Subject: Only remove client after the hardware is teared down, so a new client is rejected before old client is done. Also check mUsers in all cases to make sure there are no existing client. --- camera/libcameraservice/CameraService.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index e945056..105d4d2 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -98,7 +98,7 @@ sp CameraService::connect(const sp& cameraClient) LOGD("CameraService::connect E (pid %d, client %p)", callingPid, cameraClient->asBinder().get()); - Mutex::Autolock lock(mLock); + Mutex::Autolock lock(mServiceLock); sp client; if (mClient != 0) { sp currentClient = mClient.promote(); @@ -125,13 +125,14 @@ sp CameraService::connect(const sp& cameraClient) LOGD("New client (pid %d) connecting, old reference was dangling...", callingPid); mClient.clear(); - if (mUsers > 0) { - LOGD("Still have client, rejected"); - return client; - } } } + if (mUsers > 0) { + LOGD("Still have client, rejected"); + return client; + } + // create a new Client object client = new Client(this, cameraClient, callingPid); mClient = client; @@ -152,7 +153,7 @@ void CameraService::removeClient(const sp& cameraClient) // destructor won't be called with the lock held. sp client; - Mutex::Autolock lock(mLock); + Mutex::Autolock lock(mServiceLock); if (mClient == 0) { // This happens when we have already disconnected. @@ -390,8 +391,6 @@ void CameraService::Client::disconnect() // from the user directly, or called by the destructor. if (mHardware == 0) return; - mCameraService->removeClient(mCameraClient); - LOGD("hardware teardown"); // Before destroying mHardware, we must make sure it's in the // idle state. @@ -402,6 +401,7 @@ void CameraService::Client::disconnect() mHardware->release(); mHardware.clear(); + mCameraService->removeClient(mCameraClient); mCameraService->decUsers(); LOGD("Client::disconnect() X (pid %d)", callingPid); @@ -661,7 +661,7 @@ sp CameraService::Client::getClientFromCookie(void* user) sp client = 0; CameraService *service = static_cast(user); if (service != NULL) { - Mutex::Autolock ourLock(service->mLock); + Mutex::Autolock ourLock(service->mServiceLock); if (service->mClient != 0) { client = service->mClient.promote(); if (client == 0) { @@ -1104,7 +1104,7 @@ status_t CameraService::dump(int fd, const Vector& args) result.append(buffer); write(fd, result.string(), result.size()); } else { - AutoMutex lock(&mLock); + AutoMutex lock(&mServiceLock); if (mClient != 0) { sp currentClient = mClient.promote(); sprintf(buffer, "Client (%p) PID: %d\n", -- cgit v1.1