Revert "Use AsyncInvoker in PeerConnection instead of MessageHandler"

This reverts commit bb19276a325a5f9fce4afa245aa14ec2a4b1a41d.

Reason for revert: breaks downstream project

Original change's description:
> Use AsyncInvoker in PeerConnection instead of MessageHandler
> 
> Bug: webrtc:9702
> Change-Id: I89d66d1165a096601aed37b8febad60620073899
> Reviewed-on: https://webrtc-review.googlesource.com/97180
> Reviewed-by: Seth Hampson <shampson@webrtc.org>
> Commit-Queue: Steve Anton <steveanton@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#24515}

TBR=steveanton@webrtc.org,shampson@webrtc.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: webrtc:9702
Change-Id: Ibfe507cd1593f7000e11f9a17313a016307381cb
Reviewed-on: https://webrtc-review.googlesource.com/98302
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24591}
diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc
index 4b6eb17..6c543f9 100644
--- a/pc/peerconnection.cc
+++ b/pc/peerconnection.cc
@@ -100,8 +100,43 @@
 // The length of RTCP CNAMEs.
 static const int kRtcpCnameLength = 16;
 
+enum {
+  MSG_SET_SESSIONDESCRIPTION_SUCCESS = 0,
+  MSG_SET_SESSIONDESCRIPTION_FAILED,
+  MSG_CREATE_SESSIONDESCRIPTION_FAILED,
+  MSG_GETSTATS,
+  MSG_FREE_DATACHANNELS,
+  MSG_REPORT_USAGE_PATTERN,
+};
+
 static const int REPORT_USAGE_PATTERN_DELAY_MS = 60000;
 
+struct SetSessionDescriptionMsg : public rtc::MessageData {
+  explicit SetSessionDescriptionMsg(
+      webrtc::SetSessionDescriptionObserver* observer)
+      : observer(observer) {}
+
+  rtc::scoped_refptr<webrtc::SetSessionDescriptionObserver> observer;
+  RTCError error;
+};
+
+struct CreateSessionDescriptionMsg : public rtc::MessageData {
+  explicit CreateSessionDescriptionMsg(
+      webrtc::CreateSessionDescriptionObserver* observer)
+      : observer(observer) {}
+
+  rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer;
+  RTCError error;
+};
+
+struct GetStatsMsg : public rtc::MessageData {
+  GetStatsMsg(webrtc::StatsObserver* observer,
+              webrtc::MediaStreamTrackInterface* track)
+      : observer(observer), track(track) {}
+  rtc::scoped_refptr<webrtc::StatsObserver> observer;
+  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track;
+};
+
 // Check if we can send |new_stream| on a PeerConnection.
 bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams,
                             webrtc::MediaStreamInterface* new_stream) {
@@ -992,9 +1027,8 @@
   }
   int delay_ms =
       return_histogram_very_quickly_ ? 0 : REPORT_USAGE_PATTERN_DELAY_MS;
-  async_invoker_.AsyncInvokeDelayed<void>(RTC_FROM_HERE, signaling_thread(),
-                                          [this] { ReportUsagePattern(); },
-                                          delay_ms);
+  signaling_thread()->PostDelayed(RTC_FROM_HERE, delay_ms, this,
+                                  MSG_REPORT_USAGE_PATTERN, nullptr);
   return true;
 }
 
@@ -1547,16 +1581,8 @@
                         << track->id();
     return false;
   }
-  // Need to capture |observer| and |track| in scoped_refptrs to ensure they
-  // live long enough.
-  rtc::scoped_refptr<StatsObserver> observer_refptr(observer);
-  rtc::scoped_refptr<MediaStreamTrackInterface> track_refptr(track);
-  async_invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread(),
-                                   [this, observer_refptr, track_refptr] {
-                                     StatsReports reports;
-                                     stats_->GetStats(track_refptr, &reports);
-                                     observer_refptr->OnComplete(reports);
-                                   });
+  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_GETSTATS,
+                           new GetStatsMsg(observer, track));
   return true;
 }
 
@@ -1885,9 +1911,9 @@
 
   PostSetSessionDescriptionSuccess(observer);
 
-  // MaybeStartGathering needs to be called after posting OnSuccess to the
-  // SetSessionDescriptionObserver so that we don't signal any candidates before
-  // signaling that SetLocalDescription completed.
+  // MaybeStartGathering needs to be called after posting
+  // MSG_SET_SESSIONDESCRIPTION_SUCCESS, so that we don't signal any candidates
+  // before signaling that SetLocalDescription completed.
   transport_controller_->MaybeStartGathering();
 
   if (local_description()->GetType() == SdpType::kAnswer) {
@@ -3210,6 +3236,51 @@
   observer_ = nullptr;
 }
 
+void PeerConnection::OnMessage(rtc::Message* msg) {
+  switch (msg->message_id) {
+    case MSG_SET_SESSIONDESCRIPTION_SUCCESS: {
+      SetSessionDescriptionMsg* param =
+          static_cast<SetSessionDescriptionMsg*>(msg->pdata);
+      param->observer->OnSuccess();
+      delete param;
+      break;
+    }
+    case MSG_SET_SESSIONDESCRIPTION_FAILED: {
+      SetSessionDescriptionMsg* param =
+          static_cast<SetSessionDescriptionMsg*>(msg->pdata);
+      param->observer->OnFailure(std::move(param->error));
+      delete param;
+      break;
+    }
+    case MSG_CREATE_SESSIONDESCRIPTION_FAILED: {
+      CreateSessionDescriptionMsg* param =
+          static_cast<CreateSessionDescriptionMsg*>(msg->pdata);
+      param->observer->OnFailure(std::move(param->error));
+      delete param;
+      break;
+    }
+    case MSG_GETSTATS: {
+      GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata);
+      StatsReports reports;
+      stats_->GetStats(param->track, &reports);
+      param->observer->OnComplete(reports);
+      delete param;
+      break;
+    }
+    case MSG_FREE_DATACHANNELS: {
+      sctp_data_channels_to_free_.clear();
+      break;
+    }
+    case MSG_REPORT_USAGE_PATTERN: {
+      ReportUsagePattern();
+      break;
+    }
+    default:
+      RTC_NOTREACHED() << "Not implemented";
+      break;
+  }
+}
+
 cricket::VoiceMediaChannel* PeerConnection::voice_media_channel() const {
   RTC_DCHECK(!IsUnifiedPlan());
   auto* voice_channel = static_cast<cricket::VoiceChannel*>(
@@ -3482,37 +3553,29 @@
 
 void PeerConnection::PostSetSessionDescriptionSuccess(
     SetSessionDescriptionObserver* observer) {
-  async_invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread(),
-      rtc::Bind(&SetSessionDescriptionObserver::OnSuccess, observer));
+  SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer);
+  signaling_thread()->Post(RTC_FROM_HERE, this,
+                           MSG_SET_SESSIONDESCRIPTION_SUCCESS, msg);
 }
 
 void PeerConnection::PostSetSessionDescriptionFailure(
     SetSessionDescriptionObserver* observer,
-    RTCError error) {
+    RTCError&& error) {
   RTC_DCHECK(!error.ok());
-  // TODO(steveanton): In C++14 this can be done with a lambda.
-  struct Functor {
-    void operator()() { observer->OnFailure(std::move(error)); }
-    rtc::scoped_refptr<SetSessionDescriptionObserver> observer;
-    RTCError error;
-  };
-  async_invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread(),
-                                   Functor{observer, std::move(error)});
+  SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer);
+  msg->error = std::move(error);
+  signaling_thread()->Post(RTC_FROM_HERE, this,
+                           MSG_SET_SESSIONDESCRIPTION_FAILED, msg);
 }
 
 void PeerConnection::PostCreateSessionDescriptionFailure(
     CreateSessionDescriptionObserver* observer,
     RTCError error) {
   RTC_DCHECK(!error.ok());
-  // TODO(steveanton): In C++14 this can be done with a lambda.
-  struct Functor {
-    void operator()() { observer->OnFailure(std::move(error)); }
-    rtc::scoped_refptr<CreateSessionDescriptionObserver> observer;
-    RTCError error;
-  };
-  async_invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread(),
-                                   Functor{observer, std::move(error)});
+  CreateSessionDescriptionMsg* msg = new CreateSessionDescriptionMsg(observer);
+  msg->error = std::move(error);
+  signaling_thread()->Post(RTC_FROM_HERE, this,
+                           MSG_CREATE_SESSIONDESCRIPTION_FAILED, msg);
 }
 
 void PeerConnection::GetOptionsForOffer(
@@ -4404,9 +4467,8 @@
       // we can't free it directly here; we need to free it asynchronously.
       sctp_data_channels_to_free_.push_back(*it);
       sctp_data_channels_.erase(it);
-      async_invoker_.AsyncInvoke<void>(
-          RTC_FROM_HERE, signaling_thread(),
-          [this] { sctp_data_channels_to_free_.clear(); });
+      signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FREE_DATACHANNELS,
+                               nullptr);
       return;
     }
   }
@@ -6170,8 +6232,8 @@
 }
 
 void PeerConnection::RequestUsagePatternReportForTesting() {
-  async_invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread(),
-                                   [this] { ReportUsagePattern(); });
+  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_REPORT_USAGE_PATTERN,
+                           nullptr);
 }
 
 }  // namespace webrtc
diff --git a/pc/peerconnection.h b/pc/peerconnection.h
index bd9ef24..2942709 100644
--- a/pc/peerconnection.h
+++ b/pc/peerconnection.h
@@ -52,6 +52,7 @@
 class PeerConnection : public PeerConnectionInternal,
                        public DataChannelProviderInterface,
                        public JsepTransportController::Observer,
+                       public rtc::MessageHandler,
                        public sigslot::has_slots<> {
  public:
   enum class UsageEvent : int {
@@ -287,6 +288,9 @@
     uint32_t first_ssrc;
   };
 
+  // Implements MessageHandler.
+  void OnMessage(rtc::Message* msg) override;
+
   // Plan B helpers for getting the voice/video media channels for the single
   // audio/video transceiver, if it exists.
   cricket::VoiceMediaChannel* voice_media_channel() const;
@@ -391,7 +395,7 @@
   void PostSetSessionDescriptionSuccess(
       SetSessionDescriptionObserver* observer);
   void PostSetSessionDescriptionFailure(SetSessionDescriptionObserver* observer,
-                                        RTCError error);
+                                        RTCError&& error);
   void PostCreateSessionDescriptionFailure(
       CreateSessionDescriptionObserver* observer,
       RTCError error);
@@ -1029,7 +1033,6 @@
 
   int usage_event_accumulator_ = 0;
   bool return_histogram_very_quickly_ = false;
-  rtc::AsyncInvoker async_invoker_;
 };
 
 }  // namespace webrtc