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

Commit 7a97b64c authored by John Reck's avatar John Reck Committed by android-build-merger
Browse files

Merge "Revert "Revert "Fix lifecycle issue in CommonPool""" into qt-dev am: 8bffd47f

am: 69bedbb5

Change-Id: I4f05d02ab93812886f1191228a61cd9e024e05c2
parents 54489589 69bedbb5
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -136,3 +136,47 @@ TEST(CommonPool, fullQueue) {
        f.get();
    }
}

class ObjectTracker {
    static std::atomic_int sGlobalCount;

public:
    ObjectTracker() {
        sGlobalCount++;
    }
    ObjectTracker(const ObjectTracker&) {
        sGlobalCount++;
    }
    ObjectTracker(ObjectTracker&&) {
        sGlobalCount++;
    }
    ~ObjectTracker() {
        sGlobalCount--;
    }

    static int count() { return sGlobalCount.load(); }
};

std::atomic_int ObjectTracker::sGlobalCount{0};

TEST(CommonPool, asyncLifecycleCheck) {
    ASSERT_EQ(0, ObjectTracker::count());
    {
        ObjectTracker obj;
        ASSERT_EQ(1, ObjectTracker::count());
        EXPECT_LT(1, CommonPool::async([obj] { return ObjectTracker::count(); }).get());
    }
    CommonPool::waitForIdle();
    ASSERT_EQ(0, ObjectTracker::count());
}

TEST(CommonPool, syncLifecycleCheck) {
    ASSERT_EQ(0, ObjectTracker::count());
    {
        ObjectTracker obj;
        ASSERT_EQ(1, ObjectTracker::count());
        EXPECT_LT(1, CommonPool::runSync([obj] { return ObjectTracker::count(); }));
    }
    CommonPool::waitForIdle();
    ASSERT_EQ(0, ObjectTracker::count());
}
 No newline at end of file
+19 −2
Original line number Diff line number Diff line
@@ -49,9 +49,13 @@ CommonPool::CommonPool() {
    }
}

void CommonPool::post(Task&& task) {
CommonPool& CommonPool::instance() {
    static CommonPool pool;
    pool.enqueue(std::move(task));
    return pool;
}

void CommonPool::post(Task&& task) {
    instance().enqueue(std::move(task));
}

void CommonPool::enqueue(Task&& task) {
@@ -86,5 +90,18 @@ void CommonPool::workerLoop() {
    }
}

void CommonPool::waitForIdle() {
    instance().doWaitForIdle();
}

void CommonPool::doWaitForIdle() {
    std::unique_lock lock(mLock);
    while (mWaitingThreads != THREAD_COUNT) {
        lock.unlock();
        usleep(100);
        lock.lock();
    }
}

}  // namespace uirenderer
}  // namespace android
 No newline at end of file
+10 −2
Original line number Diff line number Diff line
@@ -57,11 +57,13 @@ public:
        mHead = newHead;
    }

    constexpr T&& pop() {
    constexpr T pop() {
        LOG_ALWAYS_FATAL_IF(mTail == mHead, "empty");
        int index = mTail;
        mTail = (mTail + 1) % SIZE;
        return std::move(mBuffer[index]);
        T ret = std::move(mBuffer[index]);
        mBuffer[index] = nullptr;
        return ret;
    }

private:
@@ -95,11 +97,17 @@ public:
        return task.get_future().get();
    };

    // For testing purposes only, blocks until all worker threads are parked.
    static void waitForIdle();

private:
    static CommonPool& instance();

    CommonPool();
    ~CommonPool() {}

    void enqueue(Task&&);
    void doWaitForIdle();

    void workerLoop();