libaudiohal: Make effect descriptors cache thread-safe
Due to legacy reasons, the code in the audio server assumes that
querying all effect descriptors is a cheap operation (stems from
pre-Treble times). Thus, the HIDL shim code needs to cache the
list of descriptors. It was assumed that the audio server code
queries effect descriptors under a lock, however recently it was
observed that it's not always the case (or it's not always the
same lock). To prevent races, access to the cache has been
serialized.
Bug: 243877224
Test: atest android.media.audio.cts.AudioEffectTest
Merged-In: Id5f3615074e540afca33a83d53d2b84634df89cf
Change-Id: Id5f3615074e540afca33a83d53d2b84634df89cf
diff --git a/media/libaudiohal/impl/EffectsFactoryHalHidl.h b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
index e1882e1..7ccddc6 100644
--- a/media/libaudiohal/impl/EffectsFactoryHalHidl.h
+++ b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
@@ -17,6 +17,8 @@
#ifndef ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
+#include <memory>
+
#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
#include <media/audiohal/EffectsFactoryHalInterface.h>
@@ -28,6 +30,8 @@
using ::android::hardware::hidl_vec;
using namespace ::android::hardware::audio::effect::CPP_VERSION;
+class EffectDescriptorCache;
+
class EffectsFactoryHalHidl : public EffectsFactoryHalInterface, public EffectConversionHelperHidl
{
public:
@@ -63,9 +67,7 @@
private:
sp<IEffectsFactory> mEffectsFactory;
- hidl_vec<EffectDescriptor> mLastDescriptors;
-
- status_t queryAllDescriptors();
+ std::unique_ptr<EffectDescriptorCache> mCache;
};
} // namespace effect