Merge "Revert "Fix lifecycle issue in CommonPool"" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
da4d6e86a3
@@ -135,127 +135,4 @@ TEST(CommonPool, fullQueue) {
|
||||
for (auto& f : futures) {
|
||||
f.get();
|
||||
}
|
||||
}
|
||||
|
||||
struct DestructorObserver {
|
||||
DestructorObserver(int* destroyCount) : mDestroyCount(destroyCount) {}
|
||||
DestructorObserver(const DestructorObserver& other) : mDestroyCount(other.mDestroyCount) {}
|
||||
DestructorObserver(DestructorObserver&& other) {
|
||||
mDestroyCount = other.mDestroyCount;
|
||||
other.mDestroyCount = nullptr;
|
||||
}
|
||||
~DestructorObserver() {
|
||||
if (mDestroyCount) {
|
||||
(*mDestroyCount)++;
|
||||
}
|
||||
}
|
||||
DestructorObserver& operator=(DestructorObserver&& other) {
|
||||
mDestroyCount = other.mDestroyCount;
|
||||
other.mDestroyCount = nullptr;
|
||||
return *this;
|
||||
}
|
||||
int* mDestroyCount;
|
||||
};
|
||||
|
||||
struct CopyObserver {
|
||||
CopyObserver(int* copyCount) : mCopyCount(copyCount) {}
|
||||
CopyObserver(CopyObserver&& other) = default;
|
||||
CopyObserver& operator=(CopyObserver&& other) = default;
|
||||
|
||||
CopyObserver(const CopyObserver& other) {
|
||||
mCopyCount = other.mCopyCount;
|
||||
if (mCopyCount) {
|
||||
(*mCopyCount)++;
|
||||
}
|
||||
}
|
||||
|
||||
CopyObserver& operator=(const CopyObserver& other) {
|
||||
mCopyCount = other.mCopyCount;
|
||||
if (mCopyCount) {
|
||||
(*mCopyCount)++;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
int* mCopyCount;
|
||||
};
|
||||
|
||||
TEST(CommonPool, asyncLifecycleCheck) {
|
||||
std::vector<std::future<void>> mFrameFences;
|
||||
int destroyCount = 0;
|
||||
int runCount = 0;
|
||||
{
|
||||
DestructorObserver observer{&destroyCount};
|
||||
auto func = [observer = std::move(observer), count = &runCount]() {
|
||||
if (observer.mDestroyCount) {
|
||||
(*count)++;
|
||||
}
|
||||
};
|
||||
mFrameFences.push_back(CommonPool::async(std::move(func)));
|
||||
}
|
||||
for (auto& fence : mFrameFences) {
|
||||
EXPECT_TRUE(fence.valid());
|
||||
fence.get();
|
||||
EXPECT_FALSE(fence.valid());
|
||||
}
|
||||
mFrameFences.clear();
|
||||
EXPECT_EQ(1, runCount);
|
||||
EXPECT_EQ(1, destroyCount);
|
||||
}
|
||||
|
||||
TEST(CommonPool, asyncCopyCheck) {
|
||||
std::vector<std::future<void>> mFrameFences;
|
||||
int copyCount = 0;
|
||||
int runCount = 0;
|
||||
{
|
||||
CopyObserver observer{©Count};
|
||||
auto func = [observer = std::move(observer), count = &runCount]() {
|
||||
if (observer.mCopyCount) {
|
||||
(*count)++;
|
||||
}
|
||||
};
|
||||
mFrameFences.push_back(CommonPool::async(std::move(func)));
|
||||
}
|
||||
for (auto& fence : mFrameFences) {
|
||||
EXPECT_TRUE(fence.valid());
|
||||
fence.get();
|
||||
EXPECT_FALSE(fence.valid());
|
||||
}
|
||||
mFrameFences.clear();
|
||||
EXPECT_EQ(1, runCount);
|
||||
// We expect std::move all the way
|
||||
EXPECT_EQ(0, copyCount);
|
||||
}
|
||||
|
||||
TEST(CommonPool, syncLifecycleCheck) {
|
||||
int destroyCount = 0;
|
||||
int runCount = 0;
|
||||
{
|
||||
DestructorObserver observer{&destroyCount};
|
||||
auto func = [observer = std::move(observer), count = &runCount]() {
|
||||
if (observer.mDestroyCount) {
|
||||
(*count)++;
|
||||
}
|
||||
};
|
||||
CommonPool::runSync(std::move(func));
|
||||
}
|
||||
EXPECT_EQ(1, runCount);
|
||||
EXPECT_EQ(1, destroyCount);
|
||||
}
|
||||
|
||||
TEST(CommonPool, syncCopyCheck) {
|
||||
int copyCount = 0;
|
||||
int runCount = 0;
|
||||
{
|
||||
CopyObserver observer{©Count};
|
||||
auto func = [observer = std::move(observer), count = &runCount]() {
|
||||
if (observer.mCopyCount) {
|
||||
(*count)++;
|
||||
}
|
||||
};
|
||||
CommonPool::runSync(std::move(func));
|
||||
}
|
||||
EXPECT_EQ(1, runCount);
|
||||
// We expect std::move all the way
|
||||
EXPECT_EQ(0, copyCount);
|
||||
}
|
||||
@@ -57,13 +57,11 @@ public:
|
||||
mHead = newHead;
|
||||
}
|
||||
|
||||
constexpr T pop() {
|
||||
constexpr T&& pop() {
|
||||
LOG_ALWAYS_FATAL_IF(mTail == mHead, "empty");
|
||||
int index = mTail;
|
||||
mTail = (mTail + 1) % SIZE;
|
||||
T ret = std::move(mBuffer[index]);
|
||||
mBuffer[index] = nullptr;
|
||||
return ret;
|
||||
return std::move(mBuffer[index]);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user