SoundPool: Fix StreamManager JavaThread shutdown
std::future destructor only blocks for ready when created by std::async, so do a wait in the JavaThread destructor. Do not signal that the thread is closed until we really are finished with all member variable access. This fixes a rare race condition. Test: SoundPool stress test Test: SoundPoolAacTest SoundPoolHapticTest SoundPoolMidiTest SoundPoolOggTest Bug: 150517918 Change-Id: I412143726956ee100069f711dd39b1d59ac100b0
This commit is contained in:
@@ -52,6 +52,12 @@ public:
|
||||
|
||||
JavaThread(JavaThread &&) = delete; // uses "this" ptr, not moveable.
|
||||
|
||||
~JavaThread() {
|
||||
join(); // manually block until the future is ready as std::future
|
||||
// destructor doesn't block unless it comes from std::async
|
||||
// and it is the last reference to shared state.
|
||||
}
|
||||
|
||||
void join() const {
|
||||
mFuture.wait();
|
||||
}
|
||||
@@ -64,8 +70,9 @@ private:
|
||||
static int staticFunction(void *data) {
|
||||
JavaThread *jt = static_cast<JavaThread *>(data);
|
||||
jt->mF();
|
||||
jt->mIsClosed = true;
|
||||
jt->mPromise.set_value();
|
||||
jt->mIsClosed = true; // publicly inform that we are closed
|
||||
// after we have accessed all variables.
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user