Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0767064 authored by Android (Google) Code Review's avatar Android (Google) Code Review Committed by The Android Open Source Project
Browse files

am c6a482e7: Merge change 5199 into donut

Merge commit 'c6a482e7'

* commit 'c6a482e7':
  Only remove client after the hardware is teared down, so a new client
parents 8e5916b2 c6a482e7
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -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,12 +125,13 @@ 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;
    }
        }
    }

    // create a new Client object
    client = new Client(this, cameraClient, callingPid);
@@ -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",
+1 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ private:
    virtual     void                        incUsers();
    virtual     void                        decUsers();

    mutable     Mutex                       mLock;
    mutable     Mutex                       mServiceLock;
                wp<Client>                  mClient;

#if DEBUG_HEAP_LEAKS