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

Commit a42e6cc9 authored by Lajos Molnar's avatar Lajos Molnar
Browse files

media: release mediaplayerservice lock while dumping services

Do not hold the global mediaplayerservice lock while dumping services,
as some services may need to add components during this time jsut before
they would be dumped resulting in a dead-lock.

Bug: 191202684
Bug: 230139976
Test: atest MediaRecorderStressTest && adb shell dumpsys media.player
Change-Id: I6b3a96012cb834255b25c5e53d19fce0d9c0dc4e
parent 03ad8074
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -611,26 +611,39 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)
                IPCThreadState::self()->getCallingUid());
        result.append(buffer);
    } else {
        {
            // capture clients under lock
            Mutex::Autolock lock(mLock);
            for (int i = 0, n = mClients.size(); i < n; ++i) {
                sp<Client> c = mClients[i].promote();
            if (c != 0) c->dump(fd, args);
                if (c != nullptr) {
                    clients.add(c);
                }
        if (mMediaRecorderClients.size() == 0) {
                result.append(" No media recorder client\n\n");
        } else {
            }

            for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) {
                sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote();
                if (c != 0) {
                if (c != nullptr) {
                    mediaRecorderClients.add(c);
                }
            }
        }

        // dump clients outside of lock
        for (const sp<Client> &c : clients) {
            c->dump(fd, args);
        }
        if (mediaRecorderClients.size() == 0) {
            result.append(" No media recorder client\n\n");
        } else {
            for (const sp<MediaRecorderClient> &c : mediaRecorderClients) {
                snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n",
                        c->mAttributionSource.pid);
                result.append(buffer);
                write(fd, result.string(), result.size());
                result = "\n";
                c->dump(fd, args);
                    mediaRecorderClients.add(c);
                }

            }
        }