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

Commit f655acf1 authored by Eric Laurent's avatar Eric Laurent Committed by Android Git Automerger
Browse files

am 8fb04d47: Merge "Fix memory leak when filtering commands in insertCommand_l()"

* commit '8fb04d47':
  Fix memory leak when filtering commands in insertCommand_l()
parents bc4bf532 8fb04d47
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -678,6 +678,10 @@ AudioPolicyService::AudioCommandThread::~AudioCommandThread()
    if (!mAudioCommands.isEmpty()) {
        release_wake_lock(mName.string());
    }
    for (size_t k=0; k < mAudioCommands.size(); k++) {
        delete mAudioCommands[k]->mParam;
        delete mAudioCommands[k];
    }
    mAudioCommands.clear();
    delete mpToneGenerator;
}
@@ -849,7 +853,7 @@ void AudioPolicyService::AudioCommandThread::startToneCommand(ToneGenerator::ton
    ToneData *data = new ToneData();
    data->mType = type;
    data->mStream = stream;
    command->mParam = (void *)data;
    command->mParam = data;
    Mutex::Autolock _l(mLock);
    insertCommand_l(command);
    ALOGV("AudioCommandThread() adding tone start type %d, stream %d", type, stream);
@@ -950,7 +954,7 @@ void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t
    data->mIO = output;
    data->mStream = stream;
    data->mSession = session;
    command->mParam = (void *)data;
    command->mParam = data;
    Mutex::Autolock _l(mLock);
    insertCommand_l(command);
    ALOGV("AudioCommandThread() adding stop output %d", output);
@@ -963,7 +967,7 @@ void AudioPolicyService::AudioCommandThread::releaseOutputCommand(audio_io_handl
    command->mCommand = RELEASE_OUTPUT;
    ReleaseOutputData *data = new ReleaseOutputData();
    data->mIO = output;
    command->mParam = (void *)data;
    command->mParam = data;
    Mutex::Autolock _l(mLock);
    insertCommand_l(command);
    ALOGV("AudioCommandThread() adding release output %d", output);
@@ -1052,6 +1056,10 @@ void AudioPolicyService::AudioCommandThread::insertCommand_l(AudioCommand *comma
        for (size_t k = i + 1; k < mAudioCommands.size(); k++) {
            if (mAudioCommands[k] == removedCommands[j]) {
                ALOGV("suppressing command: %d", mAudioCommands[k]->mCommand);
                // for commands that are not filtered,
                // command->mParam is deleted in threadLoop
                delete mAudioCommands[k]->mParam;
                delete mAudioCommands[k];
                mAudioCommands.removeAt(k);
                break;
            }
+16 −7
Original line number Diff line number Diff line
@@ -197,6 +197,8 @@ private:
                    void        insertCommand_l(AudioCommand *command, int delayMs = 0);

    private:
        class AudioCommandData;

        // descriptor for requested tone playback event
        class AudioCommand {

@@ -211,41 +213,48 @@ private:
            Condition mCond; // condition for status return
            status_t mStatus; // command status
            bool mWaitStatus; // true if caller is waiting for status
            void *mParam;     // command parameter (ToneData, VolumeData, ParametersData)
            AudioCommandData *mParam;     // command specific parameter data
        };

        class AudioCommandData {
        public:
            virtual ~AudioCommandData() {}
        protected:
            AudioCommandData() {}
        };

        class ToneData {
        class ToneData : public AudioCommandData {
        public:
            ToneGenerator::tone_type mType; // tone type (START_TONE only)
            audio_stream_type_t mStream;    // stream type (START_TONE only)
        };

        class VolumeData {
        class VolumeData : public AudioCommandData {
        public:
            audio_stream_type_t mStream;
            float mVolume;
            audio_io_handle_t mIO;
        };

        class ParametersData {
        class ParametersData : public AudioCommandData {
        public:
            audio_io_handle_t mIO;
            String8 mKeyValuePairs;
        };

        class VoiceVolumeData {
        class VoiceVolumeData : public AudioCommandData {
        public:
            float mVolume;
        };

        class StopOutputData {
        class StopOutputData : public AudioCommandData {
        public:
            audio_io_handle_t mIO;
            audio_stream_type_t mStream;
            int mSession;
        };

        class ReleaseOutputData {
        class ReleaseOutputData : public AudioCommandData {
        public:
            audio_io_handle_t mIO;
        };