From 0f78c6b28dbc0c9caa555ce89ce91b0f08c510ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Mon, 20 May 2019 11:15:24 +0200 Subject: [PATCH] Delete NO_MAIN_THREAD_WRAPPING preprocessor define. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since many tests rely on rtc::Thread::Current(), add an explicit rtc::AutoThread in the main() function used by tests. Bug: webrtc:9714 Change-Id: Id82121967c9621fe1c2945846009c48139fa57da Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/39680 Reviewed-by: Kári Helgason Reviewed-by: Karl Wiberg Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#28000} --- rtc_base/BUILD.gn | 5 ----- rtc_base/message_queue_unittest.cc | 14 -------------- rtc_base/thread.cc | 22 ++++++---------------- rtc_base/thread.h | 5 ----- rtc_base/thread_unittest.cc | 21 ++++++++++++--------- rtc_base/unittest_main.cc | 3 +++ sdk/BUILD.gn | 2 ++ sdk/objc/unittests/main.mm | 3 +++ test/BUILD.gn | 1 + test/ios/test_support.mm | 3 +++ 10 files changed, 30 insertions(+), 49 deletions(-) diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 72b7229473..418af60113 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -15,10 +15,6 @@ if (is_android) { import("//build/config/android/rules.gni") } -config("rtc_base_chromium_config") { - defines = [ "NO_MAIN_THREAD_WRAPPING" ] -} - config("rtc_base_all_dependent_config") { if (is_ios) { libs = [ @@ -903,7 +899,6 @@ rtc_static_library("rtc_base") { if (build_with_chromium) { include_dirs = [ "../../boringssl/src/include" ] - public_configs += [ ":rtc_base_chromium_config" ] } else { sources += [ "callback.h", diff --git a/rtc_base/message_queue_unittest.cc b/rtc_base/message_queue_unittest.cc index b7c32e32b0..b31ea6c1b2 100644 --- a/rtc_base/message_queue_unittest.cc +++ b/rtc_base/message_queue_unittest.cc @@ -121,20 +121,6 @@ TEST_F(MessageQueueTest, DiposeHandlerWithPostedMessagePending) { EXPECT_TRUE(deleted); } -struct UnwrapMainThreadScope { - UnwrapMainThreadScope() : rewrap_(Thread::Current() != nullptr) { - if (rewrap_) - ThreadManager::Instance()->UnwrapCurrentThread(); - } - ~UnwrapMainThreadScope() { - if (rewrap_) - ThreadManager::Instance()->WrapCurrentThread(); - } - - private: - bool rewrap_; -}; - // Ensure that ProcessAllMessageQueues does its essential function; process // all messages (both delayed and non delayed) up until the current time, on // all registered message queues. diff --git a/rtc_base/thread.cc b/rtc_base/thread.cc index be0d15da4a..0caa856990 100644 --- a/rtc_base/thread.cc +++ b/rtc_base/thread.cc @@ -78,19 +78,11 @@ Thread* Thread::Current() { ThreadManager* manager = ThreadManager::Instance(); Thread* thread = manager->CurrentThread(); -#ifndef NO_MAIN_THREAD_WRAPPING - // Only autowrap the thread which instantiated the ThreadManager. - if (!thread && manager->IsMainThread()) { - thread = new Thread(SocketServer::CreateDefault()); - thread->WrapCurrentWithThreadManager(manager, true); - } -#endif - return thread; } #if defined(WEBRTC_POSIX) -ThreadManager::ThreadManager() : main_thread_ref_(CurrentThreadRef()) { +ThreadManager::ThreadManager() { #if defined(WEBRTC_MAC) InitCocoaMultiThreading(); #endif @@ -112,8 +104,7 @@ void ThreadManager::SetCurrentThread(Thread* thread) { #endif #if defined(WEBRTC_WIN) -ThreadManager::ThreadManager() - : key_(TlsAlloc()), main_thread_ref_(CurrentThreadRef()) {} +ThreadManager::ThreadManager() : key_(TlsAlloc()) {} Thread* ThreadManager::CurrentThread() { return static_cast(TlsGetValue(key_)); @@ -142,10 +133,6 @@ void ThreadManager::UnwrapCurrentThread() { } } -bool ThreadManager::IsMainThread() { - return IsThreadRefEqual(CurrentThreadRef(), main_thread_ref_); -} - Thread::ScopedDisallowBlockingCalls::ScopedDisallowBlockingCalls() : thread_(Thread::Current()), previous_state_(thread_->SetAllowBlockingCalls(false)) {} @@ -574,8 +561,11 @@ bool Thread::IsRunning() { AutoThread::AutoThread() : Thread(SocketServer::CreateDefault(), /*do_init=*/false) { - DoInit(); if (!ThreadManager::Instance()->CurrentThread()) { + // DoInit registers with MessageQueueManager. Do that only if we intend to + // be rtc::Thread::Current(), otherwise ProcessAllMessageQueuesInternal will + // post a message to a queue that no running thread is serving. + DoInit(); ThreadManager::Instance()->SetCurrentThread(this); } } diff --git a/rtc_base/thread.h b/rtc_base/thread.h index 2b4d0203ba..6b5bdf4805 100644 --- a/rtc_base/thread.h +++ b/rtc_base/thread.h @@ -102,8 +102,6 @@ class ThreadManager { Thread* WrapCurrentThread(); void UnwrapCurrentThread(); - bool IsMainThread(); - private: ThreadManager(); ~ThreadManager(); @@ -116,9 +114,6 @@ class ThreadManager { const DWORD key_; #endif - // The thread to potentially autowrap. - const PlatformThreadRef main_thread_ref_; - RTC_DISALLOW_COPY_AND_ASSIGN(ThreadManager); }; diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc index c4b6143ee0..55a0e2d553 100644 --- a/rtc_base/thread_unittest.cc +++ b/rtc_base/thread_unittest.cc @@ -267,15 +267,18 @@ TEST(ThreadTest, Names) { TEST(ThreadTest, Wrap) { Thread* current_thread = Thread::Current(); - current_thread->UnwrapCurrent(); - CustomThread* cthread = new CustomThread(); - EXPECT_TRUE(cthread->WrapCurrent()); - EXPECT_TRUE(cthread->RunningForTest()); - EXPECT_FALSE(cthread->IsOwned()); - cthread->UnwrapCurrent(); - EXPECT_FALSE(cthread->RunningForTest()); - delete cthread; - current_thread->WrapCurrent(); + ThreadManager::Instance()->SetCurrentThread(nullptr); + + { + CustomThread cthread; + EXPECT_TRUE(cthread.WrapCurrent()); + EXPECT_EQ(&cthread, Thread::Current()); + EXPECT_TRUE(cthread.RunningForTest()); + EXPECT_FALSE(cthread.IsOwned()); + cthread.UnwrapCurrent(); + EXPECT_FALSE(cthread.RunningForTest()); + } + ThreadManager::Instance()->SetCurrentThread(current_thread); } TEST(ThreadTest, Invoke) { diff --git a/rtc_base/unittest_main.cc b/rtc_base/unittest_main.cc index fe3e9e49db..8cc1e9670b 100644 --- a/rtc_base/unittest_main.cc +++ b/rtc_base/unittest_main.cc @@ -18,6 +18,7 @@ #include "rtc_base/logging.h" #include "rtc_base/ssl_adapter.h" #include "rtc_base/ssl_stream_adapter.h" +#include "rtc_base/thread.h" #include "system_wrappers/include/field_trial.h" #include "system_wrappers/include/metrics.h" #include "test/field_trial.h" @@ -123,6 +124,8 @@ int main(int argc, char* argv[]) { rtc::test::InitTestSuite(RUN_ALL_TESTS, argc, argv, false); rtc::test::RunTestsFromIOSApp(); #endif + + rtc::AutoThread main_thread; const int res = RUN_ALL_TESTS(); rtc::CleanupSSL(); diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 4cd3783143..c694ec6a24 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -1118,6 +1118,7 @@ if (is_ios || is_mac) { ":peerconnectionfactory_base_objc", ":sdk_unittests_bundle_data", ":sdk_unittests_sources", + "../rtc_base", "//test:test_support", ] ldflags = [ "-all_load" ] @@ -1136,6 +1137,7 @@ if (is_ios || is_mac) { deps = [ ":framework_objc+link", ":ios_framework_bundle", + "../rtc_base", "//test:test_support", ] } diff --git a/sdk/objc/unittests/main.mm b/sdk/objc/unittests/main.mm index 77a88a64d3..9c513762c1 100644 --- a/sdk/objc/unittests/main.mm +++ b/sdk/objc/unittests/main.mm @@ -10,11 +10,14 @@ #import #import +#include "rtc_base/thread.h" #include "test/ios/coverage_util_ios.h" int main(int argc, char* argv[]) { rtc::test::ConfigureCoverageReportPath(); + rtc::AutoThread main_thread; + @autoreleasepool { return UIApplicationMain(argc, argv, nil, nil); } diff --git a/test/BUILD.gn b/test/BUILD.gn index d4706b8ff1..ee3c57c7be 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -181,6 +181,7 @@ if (is_ios) { ] deps = [ ":perf_test", + "../rtc_base", "../sdk:helpers_objc", ] configs += [ ":test_support_objc_config" ] diff --git a/test/ios/test_support.mm b/test/ios/test_support.mm index 86005974fb..d034bfef11 100644 --- a/test/ios/test_support.mm +++ b/test/ios/test_support.mm @@ -10,6 +10,7 @@ #import +#include "rtc_base/thread.h" #include "test/ios/coverage_util_ios.h" #include "test/ios/test_support.h" #include "test/testsupport/perf_test.h" @@ -73,6 +74,8 @@ static bool g_save_chartjson_result; - (void)runTests { rtc::test::ConfigureCoverageReportPath(); + rtc::AutoThread main_thread; + int exitStatus = g_test_suite(); if (g_save_chartjson_result) {