Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eaeced33 authored by Andy Hung's avatar Andy Hung
Browse files

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
parent ee47af62
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -52,6 +52,12 @@ public:


    JavaThread(JavaThread &&) = delete; // uses "this" ptr, not moveable.
    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 {
    void join() const {
        mFuture.wait();
        mFuture.wait();
    }
    }
@@ -64,8 +70,9 @@ private:
    static int staticFunction(void *data) {
    static int staticFunction(void *data) {
        JavaThread *jt = static_cast<JavaThread *>(data);
        JavaThread *jt = static_cast<JavaThread *>(data);
        jt->mF();
        jt->mF();
        jt->mIsClosed = true;
        jt->mPromise.set_value();
        jt->mPromise.set_value();
        jt->mIsClosed = true;  // publicly inform that we are closed
                               // after we have accessed all variables.
        return 0;
        return 0;
    }
    }