Merge change 5199 into donut

* changes:
  Only remove client after the hardware is teared down, so a new client is rejected before old client is done.
This commit is contained in:
Android (Google) Code Review
2009-06-24 20:33:11 -07:00
2 changed files with 11 additions and 11 deletions

View File

@ -98,7 +98,7 @@ sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient)
LOGD("CameraService::connect E (pid %d, client %p)", callingPid,
cameraClient->asBinder().get());
Mutex::Autolock lock(mLock);
Mutex::Autolock lock(mServiceLock);
sp<Client> client;
if (mClient != 0) {
sp<Client> currentClient = mClient.promote();
@ -125,13 +125,14 @@ sp<ICamera> CameraService::connect(const sp<ICameraClient>& 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<ICameraClient>& cameraClient)
// destructor won't be called with the lock held.
sp<Client> 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> CameraService::Client::getClientFromCookie(void* user)
sp<Client> client = 0;
CameraService *service = static_cast<CameraService*>(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<String16>& args)
result.append(buffer);
write(fd, result.string(), result.size());
} else {
AutoMutex lock(&mLock);
AutoMutex lock(&mServiceLock);
if (mClient != 0) {
sp<Client> currentClient = mClient.promote();
sprintf(buffer, "Client (%p) PID: %d\n",

View File

@ -199,7 +199,7 @@ private:
virtual void incUsers();
virtual void decUsers();
mutable Mutex mLock;
mutable Mutex mServiceLock;
wp<Client> mClient;
#if DEBUG_HEAP_LEAKS