Merge "Prevent object of AudioEffect be deleted until construction finished" am: 637ee654cf am: 1b201ee707

am: e21535e728

Change-Id: I3a4e538c2e0b89be867f9d145acc0988fb697339
gugelfrei
haobo10173529 6 years ago committed by android-build-merger
commit b40f1cf06c

@ -52,6 +52,7 @@ AudioEffect::AudioEffect(const effect_uuid_t *type,
) )
: mStatus(NO_INIT), mOpPackageName(opPackageName) : mStatus(NO_INIT), mOpPackageName(opPackageName)
{ {
AutoMutex lock(mConstructLock);
mStatus = set(type, uuid, priority, cbf, user, sessionId, io); mStatus = set(type, uuid, priority, cbf, user, sessionId, io);
} }
@ -85,6 +86,7 @@ AudioEffect::AudioEffect(const char *typeStr,
} }
} }
AutoMutex lock(mConstructLock);
mStatus = set(pType, pUuid, priority, cbf, user, sessionId, io); mStatus = set(pType, pUuid, priority, cbf, user, sessionId, io);
} }

@ -494,6 +494,7 @@ protected:
effect_descriptor_t mDescriptor; // effect descriptor effect_descriptor_t mDescriptor; // effect descriptor
int32_t mId; // system wide unique effect engine instance ID int32_t mId; // system wide unique effect engine instance ID
Mutex mLock; // Mutex for mEnabled access Mutex mLock; // Mutex for mEnabled access
Mutex mConstructLock; // Mutex for integrality construction
String16 mOpPackageName; // The package name used for app op checks. String16 mOpPackageName; // The package name used for app op checks.
@ -520,12 +521,22 @@ private:
virtual void controlStatusChanged(bool controlGranted) { virtual void controlStatusChanged(bool controlGranted) {
sp<AudioEffect> effect = mEffect.promote(); sp<AudioEffect> effect = mEffect.promote();
if (effect != 0) { if (effect != 0) {
{
// Got the mConstructLock means the construction of AudioEffect
// has finished, we should release the mConstructLock immediately.
AutoMutex lock(effect->mConstructLock);
}
effect->controlStatusChanged(controlGranted); effect->controlStatusChanged(controlGranted);
} }
} }
virtual void enableStatusChanged(bool enabled) { virtual void enableStatusChanged(bool enabled) {
sp<AudioEffect> effect = mEffect.promote(); sp<AudioEffect> effect = mEffect.promote();
if (effect != 0) { if (effect != 0) {
{
// Got the mConstructLock means the construction of AudioEffect
// has finished, we should release the mConstructLock immediately.
AutoMutex lock(effect->mConstructLock);
}
effect->enableStatusChanged(enabled); effect->enableStatusChanged(enabled);
} }
} }
@ -536,6 +547,11 @@ private:
void *pReplyData) { void *pReplyData) {
sp<AudioEffect> effect = mEffect.promote(); sp<AudioEffect> effect = mEffect.promote();
if (effect != 0) { if (effect != 0) {
{
// Got the mConstructLock means the construction of AudioEffect
// has finished, we should release the mConstructLock immediately.
AutoMutex lock(effect->mConstructLock);
}
effect->commandExecuted( effect->commandExecuted(
cmdCode, cmdSize, pCmdData, replySize, pReplyData); cmdCode, cmdSize, pCmdData, replySize, pReplyData);
} }
@ -545,6 +561,11 @@ private:
virtual void binderDied(const wp<IBinder>& /*who*/) { virtual void binderDied(const wp<IBinder>& /*who*/) {
sp<AudioEffect> effect = mEffect.promote(); sp<AudioEffect> effect = mEffect.promote();
if (effect != 0) { if (effect != 0) {
{
// Got the mConstructLock means the construction of AudioEffect
// has finished, we should release the mConstructLock immediately.
AutoMutex lock(effect->mConstructLock);
}
effect->binderDied(); effect->binderDied();
} }
} }

Loading…
Cancel
Save