Prepare for deletion of the NO_MAIN_THREAD_WRAPPING preprocessor define

This is a partial reland of
https://webrtc-review.googlesource.com/c/src/+/39680,
including only the (hopefully) non-problematic parts of it, but
postponing actual deletion of automatic thread wrapping.

Bug: webrtc:9714
Change-Id: I9b79dd073f0e945cbb62f3b54cff05eaaea9b06c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/141664
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28265}
diff --git a/rtc_base/message_queue_unittest.cc b/rtc_base/message_queue_unittest.cc
index b7c32e3..b31ea6c 100644
--- a/rtc_base/message_queue_unittest.cc
+++ b/rtc_base/message_queue_unittest.cc
@@ -121,20 +121,6 @@
   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 5c4749d..5df5ede 100644
--- a/rtc_base/thread.cc
+++ b/rtc_base/thread.cc
@@ -567,8 +567,11 @@
 
 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_unittest.cc b/rtc_base/thread_unittest.cc
index c4b6143..55a0e2d 100644
--- a/rtc_base/thread_unittest.cc
+++ b/rtc_base/thread_unittest.cc
@@ -267,15 +267,18 @@
 
 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/sdk/BUILD.gn b/sdk/BUILD.gn
index 60be6db8..6036a4d 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1125,6 +1125,7 @@
             ":peerconnectionfactory_base_objc",
             ":sdk_unittests_bundle_data",
             ":sdk_unittests_sources",
+            "../rtc_base",
             "//test:test_support",
           ]
           ldflags = [ "-all_load" ]
@@ -1143,6 +1144,7 @@
           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 77a88a6..9c51376 100644
--- a/sdk/objc/unittests/main.mm
+++ b/sdk/objc/unittests/main.mm
@@ -10,11 +10,14 @@
 
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
+#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);
   }