audioflinger: Fix thread fields locking for dumps
Previously, ThreadBase::mLock was only acquired inside
ThreadBase::dumpBase method. That means, dumping of fields of
descendant classes, tracks, and effect chains was performed
without holding ThreadBase::mLock.
This patch changes the way of how dumping is driven. Now only
ThreadBase has a public 'dump' method which is non-virtual.
This method takes the lock and dumps all the fields, tracks, and
effect chains. It calls virtual methods for dumping the contents
of descendant classes.
Bug: 118842894
Test: compare audioflinger dumps A/B
Change-Id: Iaafc75d13935a6a92ca37f9567b7ac7c31374b3e
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index e5abce7..18cb361 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -43,9 +43,6 @@
virtual status_t readyToRun();
- void dumpBase(int fd, const Vector<String16>& args);
- void dumpEffectChains(int fd, const Vector<String16>& args);
-
void clearPowerManager();
// base for record and playback
@@ -418,7 +415,7 @@
bool isMsdDevice() const { return mIsMsdDevice; }
- virtual void dump(int fd, const Vector<String16>& args) = 0;
+ void dump(int fd, const Vector<String16>& args);
// deliver stats to mediametrics.
void sendStatistics(bool force);
@@ -470,6 +467,11 @@
return INVALID_OPERATION;
}
+ virtual void dumpInternals_l(int fd __unused, const Vector<String16>& args __unused)
+ { }
+ virtual void dumpTracks_l(int fd __unused, const Vector<String16>& args __unused) { }
+
+
friend class AudioFlinger; // for mEffectChains
const type_t mType;
@@ -657,6 +659,10 @@
};
SimpleLog mLocalLog;
+
+private:
+ void dumpBase_l(int fd, const Vector<String16>& args);
+ void dumpEffectChains_l(int fd, const Vector<String16>& args);
};
class VolumeInterface {
@@ -709,8 +715,6 @@
audio_io_handle_t id, audio_devices_t device, type_t type, bool systemReady);
virtual ~PlaybackThread();
- void dump(int fd, const Vector<String16>& args) override;
-
// Thread virtuals
virtual bool threadLoop();
@@ -760,6 +764,9 @@
mActiveTracks.updatePowerState(this, true /* force */);
}
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
+ void dumpTracks_l(int fd, const Vector<String16>& args) override;
+
public:
virtual status_t initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; }
@@ -1009,9 +1016,6 @@
void updateMetadata_l() final;
virtual void sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata& metadata);
- virtual void dumpInternals(int fd, const Vector<String16>& args);
- void dumpTracks(int fd, const Vector<String16>& args);
-
// The Tracks class manages tracks added and removed from the Thread.
template <typename T>
class Tracks {
@@ -1166,7 +1170,6 @@
virtual bool checkForNewParameter_l(const String8& keyValuePair,
status_t& status);
- virtual void dumpInternals(int fd, const Vector<String16>& args);
virtual bool isTrackAllowed_l(
audio_channel_mask_t channelMask, audio_format_t format,
@@ -1185,6 +1188,8 @@
}
}
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
+
// threadLoop snippets
virtual ssize_t threadLoop_write();
virtual void threadLoop_standby();
@@ -1266,8 +1271,6 @@
virtual bool checkForNewParameter_l(const String8& keyValuePair,
status_t& status);
- void dumpInternals(int fd, const Vector<String16>& args) override;
-
virtual void flushHw_l();
void setMasterBalance(float balance) override;
@@ -1278,6 +1281,8 @@
virtual uint32_t suspendSleepTimeUs() const;
virtual void cacheParameters_l();
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
+
// threadLoop snippets
virtual mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
virtual void threadLoop_mix();
@@ -1397,8 +1402,6 @@
virtual ~DuplicatingThread();
// Thread virtuals
- virtual void dumpInternals(int fd, const Vector<String16>& args) override;
-
void addOutputTrack(MixerThread* thread);
void removeOutputTrack(MixerThread* thread);
uint32_t waitTimeMs() const { return mWaitTimeMs; }
@@ -1407,6 +1410,7 @@
const StreamOutHalInterface::SourceMetadata& metadata) override;
protected:
virtual uint32_t activeSleepTimeUs() const;
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
private:
bool outputsReady(const SortedVector< sp<OutputTrack> > &outputTracks);
@@ -1512,9 +1516,6 @@
void destroyTrack_l(const sp<RecordTrack>& track);
void removeTrack_l(const sp<RecordTrack>& track);
- void dumpInternals(int fd, const Vector<String16>& args);
- void dumpTracks(int fd, const Vector<String16>& args);
-
// Thread virtuals
virtual bool threadLoop();
virtual void preExit();
@@ -1551,7 +1552,6 @@
// return true if the caller should then do it's part of the stopping process
bool stop(RecordTrack* recordTrack);
- void dump(int fd, const Vector<String16>& args) override;
AudioStreamIn* clearInput();
virtual sp<StreamHalInterface> stream() const;
@@ -1619,6 +1619,11 @@
return audio_is_input_device(
mInDevice & mTimestampCorrectedDevices);
}
+
+protected:
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
+ void dumpTracks_l(int fd, const Vector<String16>& args) override;
+
private:
// Enter standby if not already in standby, and set mStandby flag
void standbyIfNotAlreadyInStandby();
@@ -1768,11 +1773,9 @@
// Sets the UID records silence
virtual void setRecordSilenced(uid_t uid __unused, bool silenced __unused) {}
- void dump(int fd, const Vector<String16>& args) override;
- virtual void dumpInternals(int fd, const Vector<String16>& args);
- void dumpTracks(int fd, const Vector<String16>& args);
-
protected:
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
+ void dumpTracks_l(int fd, const Vector<String16>& args) override;
audio_attributes_t mAttr;
audio_session_t mSessionId;
@@ -1822,8 +1825,6 @@
virtual void checkSilentMode_l();
void processVolume_l() override;
- virtual void dumpInternals(int fd, const Vector<String16>& args);
-
virtual bool isOutput() const override { return true; }
void updateMetadata_l() override;
@@ -1831,6 +1832,7 @@
virtual void toAudioPortConfig(struct audio_port_config *config);
protected:
+ void dumpInternals_l(int fd, const Vector<String16>& args) override;
audio_stream_type_t mStreamType;
float mMasterVolume;