Race-condition in SoundPool during release
There is race between SoundPoolThread and SoundPool / AudioManager threads during releasing SoundPool. AudioManager deletes a global reference before setting SoundPool callback to NULL. If, at that time, a call to the SoundPool::notify fuction happens then mCallback is valid but mUserData is not. The following log will show up to indicate the problem: JNI ERROR (app bug): accessed deleted global reference 0xXXXXXXXX This fix is to clear the SoundPool's callback before releasing global reference. Change-Id: I5e6d647edc0444340db879428048e2c0a068a8b4
This commit is contained in:
committed by
John Eckerdal
parent
71f83672f2
commit
ed86e19af2
@@ -231,14 +231,14 @@ android_media_SoundPool_SoundPoolImpl_release(JNIEnv *env, jobject thiz)
|
||||
SoundPool *ap = MusterSoundPool(env, thiz);
|
||||
if (ap != NULL) {
|
||||
|
||||
// release weak reference
|
||||
// release weak reference and clear callback
|
||||
jobject weakRef = (jobject) ap->getUserData();
|
||||
ap->setCallback(NULL, NULL);
|
||||
if (weakRef != NULL) {
|
||||
env->DeleteGlobalRef(weakRef);
|
||||
}
|
||||
|
||||
// clear callback and native context
|
||||
ap->setCallback(NULL, NULL);
|
||||
// clear native context
|
||||
env->SetLongField(thiz, fields.mNativeContext, 0);
|
||||
delete ap;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user