Don't call virtual methods in destructor
The result of calling virtual methods from a destructor is undefined.
Change-Id: I0fd4a19626e5ae564a60b753315b5f6c4b8d1f2c
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index e2b29f7..0c86e20 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -246,14 +246,13 @@
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() {
- stop();
+ stop_nonvirtual();
}
sp<IMemory> AudioFlinger::RecordHandle::getCblk() const {
@@ -5876,6 +5875,10 @@
}
void AudioFlinger::RecordHandle::stop() {
+ stop_nonvirtual();
+}
+
+void AudioFlinger::RecordHandle::stop_nonvirtual() {
ALOGV("RecordHandle::stop()");
mRecordTrack->stop();
}
@@ -6847,6 +6850,11 @@
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
sp<PlaybackThread> thread;
@@ -6998,6 +7006,11 @@
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
sp<RecordThread> thread;
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index a6fd0a0..fa1ad93 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -844,7 +844,7 @@
int frameCount,
const sp<IMemory>& sharedBuffer,
int sessionId);
- ~TimedTrack();
+ virtual ~TimedTrack();
class TimedBuffer {
public:
@@ -1494,6 +1494,9 @@
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 @@
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 @@
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);
};