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

Commit f0063973 authored by Frederick Mayle's avatar Frederick Mayle Committed by Gerrit Code Review
Browse files

Merge "fix race in ProcessState::getThreadPoolMaxTotalThreadCount" into main

parents e1c075b7 908b09ce
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -429,8 +429,17 @@ status_t ProcessState::setThreadPoolMaxThreadCount(size_t maxThreads) {
}

size_t ProcessState::getThreadPoolMaxTotalThreadCount() const {
    if (mThreadPoolStarted) {
    // Need to read `mKernelStartedThreads` before `mThreadPoolStarted` (with
    // non-relaxed memory ordering) to avoid a race like the following:
    //
    // thread A: if (mThreadPoolStarted) { // evaluates false
    // thread B: mThreadPoolStarted = true;
    // thread B: mKernelStartedThreads++;
    // thread A: size_t kernelStarted = mKernelStartedThreads;
    // thread A: LOG_ALWAYS_FATAL_IF(kernelStarted != 0, ...);
    size_t kernelStarted = mKernelStartedThreads;

    if (mThreadPoolStarted) {
        size_t max = mMaxThreads;
        size_t current = mCurrentThreads;

@@ -460,7 +469,6 @@ size_t ProcessState::getThreadPoolMaxTotalThreadCount() const {

    // must not be initialized or maybe has poll thread setup, we
    // currently don't track this in libbinder
    size_t kernelStarted = mKernelStartedThreads;
    LOG_ALWAYS_FATAL_IF(kernelStarted != 0, "Expecting 0 kernel started threads but have %zu",
                        kernelStarted);
    return mCurrentThreads;
+1 −1
Original line number Diff line number Diff line
@@ -188,7 +188,7 @@ private:
    Vector<handle_entry> mHandleToObject;

    bool mForked;
    bool mThreadPoolStarted;
    std::atomic_bool mThreadPoolStarted;
    volatile int32_t mThreadPoolSeq;

    CallRestriction mCallRestriction;