0e021ea4d1db86708ec6ae5eafb661f1e8b7d631
Task-Number: QTBUG-22779 Some pulseaudio callback may happen after SoundEffect was deleted, thus the userdata(SoundEffect point) we passed previously may result in potential crash with QMetaObject::invokeMethod to queue some event. To solve this problem, the release mehtod is added to SoundEffectPrivate, and instead of calling d->deleteLater in SoundEffect::dtor, d->release is called. So SoundEffectPrivate will no when it is going to be deleted soon rather than handle everything in SoundEffectPrivate::dtor which may be too late. class RefObject is also added to be able to track the SoundEffectPrivate status by pulseaduio callbacks. I thought this could be avoided by checking the connection state of pulse stream. However, that doesn't work as expected, stream state remains Ready when checked in callbacks even after disconnect stream has been called. So RefObject is used instead and its lifecycle is managed by an internal reference count. When release is invoked, m_ref->onDeleted is called first, this will mark SoundEffectPrivate as dead. and then unloadPulseStream is called. After those two invocations, we can be asured that: 1. if some pulse callbacks has been called without knowing SoundEffectPrivate dead, the queued invocation on SoundEffectPrivate would be safe, since SoundEffectPrivate::deleteLater would be called after them. 2. Since on pulse callbacks would be executed when unloadPulseStream is called, then at this moment if some pulse callbacks is called again, it would certainly knows that SoundEffectPrivate is marked as dead and would not queue and event on SoundEffectPrivate. Now, the deleteLater can be safely called. Change-Id: I807f29cddb677d1f4bc078fd306ed0d83d6f7dc4 Reviewed-by: Ling Hu <ling.hu@nokia.com>
Description
No description provided
Languages
C++
90.5%
Objective-C++
5.8%
QMake
1%
Objective-C
0.9%
QML
0.5%
Other
1%