Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(286)

Unified Diff: webrtc/base/thread_unittest.cc

Issue 2904543003: Revert of Fixing potential AsyncInvoker deadlock that occurs for "reentrant" invocations. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/asyncinvoker-inl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/base/thread_unittest.cc
diff --git a/webrtc/base/thread_unittest.cc b/webrtc/base/thread_unittest.cc
index c8f9e353210fcfa615012bbb1c09584edc84d063..c143120fbcceec8d7611b42156761989102213ff 100644
--- a/webrtc/base/thread_unittest.cc
+++ b/webrtc/base/thread_unittest.cc
@@ -104,7 +104,7 @@
Socket* socket_;
};
-class CustomThread : public Thread {
+class CustomThread : public rtc::Thread {
public:
CustomThread() {}
virtual ~CustomThread() { Stop(); }
@@ -150,7 +150,7 @@
// Using std::atomic<bool> or std::atomic_flag in C++11 is probably
// the right thing to do, but those features are not yet allowed. Or
-// AtomicInt, if/when that is added. Since the use isn't
+// rtc::AtomicInt, if/when that is added. Since the use isn't
// performance critical, use a plain critical section for the time
// being.
@@ -451,23 +451,27 @@
// executing, and then to wait for it to finish, ensuring the "EXPECT_FALSE"
// is run.
Event functor_started(false, false);
+ Event functor_continue(false, false);
Event functor_finished(false, false);
Thread thread;
thread.Start();
volatile bool invoker_destroyed = false;
{
- auto functor = [&functor_started, &functor_finished, &invoker_destroyed] {
- functor_started.Set();
- Thread::Current()->SleepMs(kWaitTimeout);
- EXPECT_FALSE(invoker_destroyed);
- functor_finished.Set();
- };
AsyncInvoker invoker;
- invoker.AsyncInvoke<void>(RTC_FROM_HERE, &thread, functor);
+ invoker.AsyncInvoke<void>(RTC_FROM_HERE, &thread,
+ [&functor_started, &functor_continue,
+ &functor_finished, &invoker_destroyed] {
+ functor_started.Set();
+ functor_continue.Wait(Event::kForever);
+ rtc::Thread::Current()->SleepMs(kWaitTimeout);
+ EXPECT_FALSE(invoker_destroyed);
+ functor_finished.Set();
+ });
functor_started.Wait(Event::kForever);
- // Destroy the invoker while the functor is still executing (doing
- // SleepMs).
+
+ // Allow the functor to continue and immediately destroy the invoker.
+ functor_continue.Set();
}
// If the destructor DIDN'T wait for the functor to finish executing, it will
@@ -475,35 +479,6 @@
// second.
invoker_destroyed = true;
functor_finished.Wait(Event::kForever);
-}
-
-// Variant of the above test where the async-invoked task calls AsyncInvoke
-// again, for the thread on which the AsyncInvoker is currently being
-// destroyed. This shouldn't deadlock or crash; this second invocation should
-// just be ignored.
-TEST_F(AsyncInvokeTest, KillInvokerDuringExecuteWithReentrantInvoke) {
- Event functor_started(false, false);
- bool reentrant_functor_run = false;
-
- Thread* main = Thread::Current();
- Thread thread;
- thread.Start();
- {
- AsyncInvoker invoker;
- auto reentrant_functor = [&reentrant_functor_run] {
- reentrant_functor_run = true;
- };
- auto functor = [&functor_started, &invoker, main, reentrant_functor] {
- functor_started.Set();
- Thread::Current()->SleepMs(kWaitTimeout);
- invoker.AsyncInvoke<void>(RTC_FROM_HERE, main, reentrant_functor);
- };
- // This queues a task on |thread| to sleep for |kWaitTimeout| then queue a
- // task on |main|. But this second queued task should never run.
- invoker.AsyncInvoke<void>(RTC_FROM_HERE, &thread, functor);
- functor_started.Wait(Event::kForever);
- }
- EXPECT_FALSE(reentrant_functor_run);
}
TEST_F(AsyncInvokeTest, Flush) {
« no previous file with comments | « webrtc/base/asyncinvoker-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698