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

Commit d96c5724 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Don't call virtual methods in destructor

The result of calling virtual methods from a destructor is undefined.

Change-Id: I0fd4a19626e5ae564a60b753315b5f6c4b8d1f2c
parent dcda3b32
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -246,14 +246,13 @@ void AudioFlinger::onFirstRef()

AudioFlinger::~AudioFlinger()
{

    while (!mRecordThreads.isEmpty()) {
        // closeInput() will remove first entry from mRecordThreads
        closeInput(mRecordThreads.keyAt(0));
        closeInput_nonvirtual(mRecordThreads.keyAt(0));
    }
    while (!mPlaybackThreads.isEmpty()) {
        // closeOutput() will remove first entry from mPlaybackThreads
        closeOutput(mPlaybackThreads.keyAt(0));
        closeOutput_nonvirtual(mPlaybackThreads.keyAt(0));
    }

    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
@@ -5863,7 +5862,7 @@ AudioFlinger::RecordHandle::RecordHandle(const sp<AudioFlinger::RecordThread::Re
}

AudioFlinger::RecordHandle::~RecordHandle() {
    stop();
    stop_nonvirtual();
}

sp<IMemory> AudioFlinger::RecordHandle::getCblk() const {
@@ -5876,6 +5875,10 @@ status_t AudioFlinger::RecordHandle::start(int event, int triggerSession) {
}

void AudioFlinger::RecordHandle::stop() {
    stop_nonvirtual();
}

void AudioFlinger::RecordHandle::stop_nonvirtual() {
    ALOGV("RecordHandle::stop()");
    mRecordTrack->stop();
}
@@ -6846,6 +6849,11 @@ audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1,
}

status_t AudioFlinger::closeOutput(audio_io_handle_t output)
{
    return closeOutput_nonvirtual(output);
}

status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output)
{
    // keep strong reference on the playback thread so that
    // it is not destroyed while exit() is executed
@@ -6997,6 +7005,11 @@ audio_io_handle_t AudioFlinger::openInput(audio_module_handle_t module,
}

status_t AudioFlinger::closeInput(audio_io_handle_t input)
{
    return closeInput_nonvirtual(input);
}

status_t AudioFlinger::closeInput_nonvirtual(audio_io_handle_t input)
{
    // keep strong reference on the record thread so that
    // it is not destroyed while exit() is executed
+8 −2
Original line number Diff line number Diff line
@@ -844,7 +844,7 @@ private:
                                         int frameCount,
                                         const sp<IMemory>& sharedBuffer,
                                         int sessionId);
            ~TimedTrack();
            virtual ~TimedTrack();

            class TimedBuffer {
              public:
@@ -1494,6 +1494,9 @@ private:
            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
    private:
        const sp<RecordThread::RecordTrack> mRecordTrack;

        // for use from destructor
        void                stop_nonvirtual();
    };

    //--- Audio Effect Management
@@ -1887,7 +1890,7 @@ mutable Mutex mLock; // mutex for process, commands and handl
    public:
        AudioHwDevice(const char *moduleName, audio_hw_device_t *hwDevice) :
            mModuleName(strdup(moduleName)), mHwDevice(hwDevice){}
        ~AudioHwDevice() { free((void *)mModuleName); }
        /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); }

        const char *moduleName() const { return mModuleName; }
        audio_hw_device_t *hwDevice() const { return mHwDevice; }
@@ -1964,6 +1967,9 @@ mutable Mutex mLock; // mutex for process, commands and handl
private:
    sp<Client>  registerPid_l(pid_t pid);    // always returns non-0

    // for use from destructor
    status_t    closeOutput_nonvirtual(audio_io_handle_t output);
    status_t    closeInput_nonvirtual(audio_io_handle_t input);
};