From c07d631b484e8f3b4657f0e9d2445ffb54bf77ab Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Wed, 12 Jul 2023 13:20:09 -0500 Subject: [PATCH] threadsafeFreelist error reporting aug: get total and free values gtest consumer lock prevention rev2- timeout baiilout --- .../threads/test/threadSafeDequeTest.cpp | 33 +++++++++++-------- .../platform/threads/threadSafeFreeList.h | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Engine/source/platform/threads/test/threadSafeDequeTest.cpp b/Engine/source/platform/threads/test/threadSafeDequeTest.cpp index 3559ebd13..d434bf4d9 100644 --- a/Engine/source/platform/threads/test/threadSafeDequeTest.cpp +++ b/Engine/source/platform/threads/test/threadSafeDequeTest.cpp @@ -91,18 +91,6 @@ public: ValueRef val = new Value(i, tick); mDeque.pushBack(val); } - - // WORKAROUND: due to a bug in the Deque, we lose an item, and thus the test will loop forever. We currently - // don't have a timeout solution, so instead push som extra elements just to make sure Consumer - // doesn't get stuck. - for(U32 i = mValues.size(); i < mValues.size() + 5; i++) - { - U32 tick = Platform::getRealMilliseconds(); - - ValueRef val = new Value(i, tick); - - mDeque.pushBack(val); - } } }; @@ -115,10 +103,27 @@ public: virtual void run(void*) { - for(U32 i = 0; i < mValues.size(); i++) + S32 timeOut = mValues.size() * 32; + U32 endTime = Platform::getRealMilliseconds() + timeOut; + + for (U32 i = 0; i < mValues.size(); i++) { ValueRef value; - while(!mDeque.tryPopFront(value)); + bool timedOut = false; + while (!mDeque.tryPopFront(value)) + { + if (timeOut && Platform::getRealMilliseconds() >= endTime) + { + timedOut = true; + break; + } + }; + + ASSERT_FALSE(timedOut) + << "consumer thread timed out!"; + + if (timedOut) return; + EXPECT_EQ(i, value->mIndex); EXPECT_EQ(value->mTick, mValues[i]); } diff --git a/Engine/source/platform/threads/threadSafeFreeList.h b/Engine/source/platform/threads/threadSafeFreeList.h index bb34e6bbe..c657b9847 100644 --- a/Engine/source/platform/threads/threadSafeFreeList.h +++ b/Engine/source/platform/threads/threadSafeFreeList.h @@ -85,7 +85,7 @@ class ThreadSafeFreeList { #ifdef TORQUE_DEBUG AssertWarn( mNumNodesTotal == mNumNodesFree, - "ThreadSafeFreeList::~ThreadSafeFreeList() - still got live instances" ); + avar("ThreadSafeFreeList::~ThreadSafeFreeList() - still got live instances:[%i/%i]", mNumNodesTotal,mNumNodesFree) ); #endif // Destroy remaining nodes. Not synchronized. We assume all