AudioFlinger: add mutex order to constructor
Used for mutex debug tracking.
Test: validated through dynamic mutex order checking on CTS tests
Bug: 306277363
Bug: 307629326
Change-Id: I0df5218b2c6426479bb16688b42f1cc16ff46028
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 6af8015..68878e8 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -423,7 +423,8 @@
// for as long as possible. The memory is only freed when it is needed for another log writer.
Vector< sp<NBLog::Writer> > mUnregisteredWriters;
audio_utils::mutex& unregisteredWritersMutex() const { return mUnregisteredWritersMutex; }
- mutable audio_utils::mutex mUnregisteredWritersMutex;
+ mutable audio_utils::mutex mUnregisteredWritersMutex{
+ audio_utils::MutexOrder::kAudioFlinger_UnregisteredWritersMutex};
AudioFlinger() ANDROID_API;
~AudioFlinger() override;
@@ -495,7 +496,7 @@
bool mPendingRequests;
// Mutex and condition variable around mPendingRequests' value
- audio_utils::mutex mMutex;
+ audio_utils::mutex mMutex{audio_utils::MutexOrder::kMediaLogNotifier_Mutex};
audio_utils::condition_variable mCondition;
// Duration of the sleep period after a processed request
@@ -604,18 +605,19 @@
int mCnt;
};
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioFlinger_Mutex};
// protects mClients and mNotificationClients.
// must be locked after mutex() and ThreadBase::mutex() if both must be locked
// avoids acquiring AudioFlinger::mutex() from inside thread loop.
- mutable audio_utils::mutex mClientMutex;
+ mutable audio_utils::mutex mClientMutex{audio_utils::MutexOrder::kAudioFlinger_ClientMutex};
DefaultKeyedVector<pid_t, wp<Client>> mClients GUARDED_BY(clientMutex()); // see ~Client()
audio_utils::mutex& hardwareMutex() const { return mHardwareMutex; }
- mutable audio_utils::mutex mHardwareMutex;
+ mutable audio_utils::mutex mHardwareMutex{
+ audio_utils::MutexOrder::kAudioFlinger_HardwareMutex};
// NOTE: If both mMutex and mHardwareMutex mutexes must be held,
// always take mMutex before mHardwareMutex
diff --git a/services/audioflinger/DeviceEffectManager.h b/services/audioflinger/DeviceEffectManager.h
index faba806..7045c8b 100644
--- a/services/audioflinger/DeviceEffectManager.h
+++ b/services/audioflinger/DeviceEffectManager.h
@@ -85,7 +85,7 @@
audio_utils::mutex& mutex() const RETURN_CAPABILITY(audio_utils::DeviceEffectManager_Mutex) {
return mMutex;
}
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kDeviceEffectManager_Mutex};
const sp<IAfDeviceEffectManagerCallback> mAfDeviceEffectManagerCallback;
const sp<DeviceEffectManagerCallback> mMyCallback;
std::map<AudioDeviceTypeAddr, std::vector<sp<IAfDeviceEffectProxy>>>
diff --git a/services/audioflinger/Effects.h b/services/audioflinger/Effects.h
index 2ece5dc..9208c88 100644
--- a/services/audioflinger/Effects.h
+++ b/services/audioflinger/Effects.h
@@ -135,7 +135,7 @@
DISALLOW_COPY_AND_ASSIGN(EffectBase);
// mutex for process, commands and handles list protection
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectBase_Mutex};
mediautils::atomic_sp<EffectCallbackInterface> mCallback; // parent effect chain
const int mId; // this instance unique ID
const audio_session_t mSessionId; // audio session ID
@@ -151,7 +151,7 @@
// Mutex protecting transactions with audio policy manager as mutex() cannot
// be held to avoid cross deadlocks with audio policy mutex
audio_utils::mutex& policyMutex() const { return mPolicyMutex; }
- mutable audio_utils::mutex mPolicyMutex;
+ mutable audio_utils::mutex mPolicyMutex{audio_utils::MutexOrder::kEffectBase_PolicyMutex};
// Effect is registered in APM or not
bool mPolicyRegistered = false;
// Effect enabled state communicated to APM. Enabled state corresponds to
@@ -367,7 +367,8 @@
DISALLOW_COPY_AND_ASSIGN(EffectHandle);
audio_utils::mutex& mutex() const { return mMutex; }
- mutable audio_utils::mutex mMutex; // protects IEffect method calls
+ // protects IEffect method calls
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectHandle_Mutex};
const wp<IAfEffectBase> mEffect; // pointer to controlled EffectModule
const sp<media::IEffectClient> mEffectClient; // callback interface for client notifications
/*const*/ sp<Client> mClient; // client for shared memory allocation, see
@@ -625,7 +626,8 @@
std::optional<size_t> findVolumeControl_l(size_t from, size_t to) const;
- mutable audio_utils::mutex mMutex; // mutex protecting effect list
+ // mutex protecting effect list
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectChain_Mutex};
Vector<sp<IAfEffectModule>> mEffects; // list of effect modules
audio_session_t mSessionId; // audio session ID
sp<EffectBufferHalInterface> mInBuffer; // chain input buffer
@@ -764,7 +766,8 @@
const sp<ProxyCallback> mMyCallback;
audio_utils::mutex& proxyMutex() const { return mProxyMutex; }
- mutable audio_utils::mutex mProxyMutex;
+ mutable audio_utils::mutex mProxyMutex{
+ audio_utils::MutexOrder::kDeviceEffectProxy_ProxyMutex};
std::map<audio_patch_handle_t, sp<IAfEffectHandle>> mEffectHandles; // protected by mProxyMutex
sp<IAfEffectModule> mHalEffect; // protected by mProxyMutex
struct audio_port_config mDevicePort = { .id = AUDIO_PORT_HANDLE_NONE };
diff --git a/services/audioflinger/MelReporter.h b/services/audioflinger/MelReporter.h
index bf4f390..235dd11 100644
--- a/services/audioflinger/MelReporter.h
+++ b/services/audioflinger/MelReporter.h
@@ -138,7 +138,7 @@
* Lock for protecting the active mel patches. Do not mix with the AudioFlinger lock.
* Locking order AudioFlinger::mutex() -> PatchCommandThread::mutex() -> MelReporter::mutex().
*/
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kMelReporter_Mutex};
std::unordered_map<audio_patch_handle_t, ActiveMelPatch> mActiveMelPatches
GUARDED_BY(mutex());
std::unordered_map<audio_port_handle_t, int> mActiveDevices GUARDED_BY(mutex());
diff --git a/services/audioflinger/PatchCommandThread.h b/services/audioflinger/PatchCommandThread.h
index f491e8a..c316d8a 100644
--- a/services/audioflinger/PatchCommandThread.h
+++ b/services/audioflinger/PatchCommandThread.h
@@ -130,11 +130,12 @@
return mListenerMutex;
}
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kPatchCommandThread_Mutex};
audio_utils::condition_variable mWaitWorkCV;
std::deque<sp<Command>> mCommands GUARDED_BY(mutex()); // list of pending commands
- mutable audio_utils::mutex mListenerMutex;
+ mutable audio_utils::mutex mListenerMutex{
+ audio_utils::MutexOrder::kPatchCommandThread_ListenerMutex};
std::vector<wp<PatchCommandListener>> mListeners GUARDED_BY(listenerMutex());
};
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 078ae12..4a1948c 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -470,7 +470,8 @@
SourceMetadatas mTrackMetadatas;
/** Protects mTrackMetadatas against concurrent access. */
audio_utils::mutex& trackMetadataMutex() const { return mTrackMetadataMutex; }
- mutable audio_utils::mutex mTrackMetadataMutex;
+ mutable audio_utils::mutex mTrackMetadataMutex{
+ audio_utils::MutexOrder::kOutputTrack_TrackMetadataMutex};
}; // end of OutputTrack
// playback track, used by PatchPanel
diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h
index 8d3de38..3de9968 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -221,7 +221,8 @@
std::unique_ptr<void, decltype(free)*> mSinkBuffer; // frame size aligned continuous buffer
std::unique_ptr<void, decltype(free)*> mStubBuffer; // buffer used for AudioBufferProvider
size_t mUnconsumedFrames = 0;
- mutable audio_utils::mutex mReadMutex;
+ mutable audio_utils::mutex mReadMutex{
+ audio_utils::MutexOrder::kPassthruPatchRecord_ReadMutex};
audio_utils::condition_variable mReadCV;
size_t mReadBytes = 0; // GUARDED_BY(readMutex())
status_t mReadError = NO_ERROR; // GUARDED_BY(readMutex())
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 6a4add4..a5afdd8 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -112,7 +112,8 @@
return mMutex;
}
const int mType; // event type e.g. CFG_EVENT_IO
- mutable audio_utils::mutex mMutex; // mutex associated with mCondition
+ // mutex associated with mCondition
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kConfigEvent_Mutex};
audio_utils::condition_variable mCondition; // condition for status return
// NO_THREAD_SAFETY_ANALYSIS Can we add GUARDED_BY?
@@ -537,7 +538,7 @@
audio_utils::mutex& mutex() const final RETURN_CAPABILITY(audio_utils::ThreadBase_Mutex) {
return mMutex;
}
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kThreadBase_Mutex};
void onEffectEnable(const sp<IAfEffectModule>& effect) final EXCLUDES_ThreadBase_Mutex;
void onEffectDisable() final EXCLUDES_ThreadBase_Mutex;
@@ -1454,7 +1455,8 @@
sp<AsyncCallbackThread> mCallbackThread;
audio_utils::mutex& audioTrackCbMutex() const { return mAudioTrackCbMutex; }
- mutable audio_utils::mutex mAudioTrackCbMutex;
+ mutable audio_utils::mutex mAudioTrackCbMutex{
+ audio_utils::MutexOrder::kPlaybackThread_AudioTrackCbMutex};
// Record of IAudioTrackCallback
std::map<sp<IAfTrack>, sp<media::IAudioTrackCallback>> mAudioTrackCallbacks;
@@ -1809,7 +1811,7 @@
// to indicate that the callback has been received via resetDraining()
uint32_t mDrainSequence;
audio_utils::condition_variable mWaitWorkCV;
- mutable audio_utils::mutex mMutex;
+ mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAsyncCallbackThread_Mutex};
bool mAsyncError;
audio_utils::mutex& mutex() const RETURN_CAPABILITY(audio_utils::AsyncCallbackThread_Mutex) {