mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-15 14:50:39 +01:00
Revert "Replaces SynchronousMethodCall with rtc::Thread::Invoke."
This reverts commit b0e0728159
.
Reason for revert:
Causes Chromium tests to timeout, preventing rolls into Chromium.
Original change's description:
> Replaces SynchronousMethodCall with rtc::Thread::Invoke.
>
> Given that we already have Thread:.Invoke that can be used with lambda,
> SynchronousMethodCall doesn't add any value.
>
> This simplification prepares for simulated time peer connection tests.
>
> Bug: webrtc:11255
> Change-Id: I478a11f15e30e009dae4a3fee2120f6d7a03355f
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165683
> Commit-Queue: Sebastian Jansson <srte@webrtc.org>
> Reviewed-by: Steve Anton <steveanton@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#30217}
TBR=steveanton@webrtc.org,srte@webrtc.org
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: webrtc:11255
Change-Id: I9d3aa218013129db7a09a77500a0547ce9ae341a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166047
Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
Commit-Queue: Guido Urdaneta <guidou@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30265}
This commit is contained in:
parent
61d6471912
commit
ccab06fb72
4 changed files with 245 additions and 85 deletions
|
@ -145,6 +145,7 @@ rtc_library("libjingle_peerconnection_api") {
|
|||
"peer_connection_interface.cc",
|
||||
"peer_connection_interface.h",
|
||||
"peer_connection_proxy.h",
|
||||
"proxy.cc",
|
||||
"proxy.h",
|
||||
"rtp_receiver_interface.cc",
|
||||
"rtp_receiver_interface.h",
|
||||
|
|
37
api/proxy.cc
Normal file
37
api/proxy.cc
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "api/proxy.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace internal {
|
||||
|
||||
SynchronousMethodCall::SynchronousMethodCall(rtc::MessageHandler* proxy)
|
||||
: proxy_(proxy) {}
|
||||
|
||||
SynchronousMethodCall::~SynchronousMethodCall() = default;
|
||||
|
||||
void SynchronousMethodCall::Invoke(const rtc::Location& posted_from,
|
||||
rtc::Thread* t) {
|
||||
if (t->IsCurrent()) {
|
||||
proxy_->OnMessage(nullptr);
|
||||
} else {
|
||||
t->Post(posted_from, this, 0);
|
||||
e_.Wait(rtc::Event::kForever);
|
||||
}
|
||||
}
|
||||
|
||||
void SynchronousMethodCall::OnMessage(rtc::Message*) {
|
||||
proxy_->OnMessage(nullptr);
|
||||
e_.Set();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace webrtc
|
287
api/proxy.h
287
api/proxy.h
|
@ -70,6 +70,106 @@ class Location;
|
|||
|
||||
namespace webrtc {
|
||||
|
||||
template <typename R>
|
||||
class ReturnType {
|
||||
public:
|
||||
template <typename C, typename M, typename... Args>
|
||||
void Invoke(C* c, M m, Args&&... args) {
|
||||
r_ = (c->*m)(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
R moved_result() { return std::move(r_); }
|
||||
|
||||
private:
|
||||
R r_;
|
||||
};
|
||||
|
||||
template <>
|
||||
class ReturnType<void> {
|
||||
public:
|
||||
template <typename C, typename M, typename... Args>
|
||||
void Invoke(C* c, M m, Args&&... args) {
|
||||
(c->*m)(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
void moved_result() {}
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
class RTC_EXPORT SynchronousMethodCall : public rtc::MessageData,
|
||||
public rtc::MessageHandler {
|
||||
public:
|
||||
explicit SynchronousMethodCall(rtc::MessageHandler* proxy);
|
||||
~SynchronousMethodCall() override;
|
||||
|
||||
void Invoke(const rtc::Location& posted_from, rtc::Thread* t);
|
||||
|
||||
private:
|
||||
void OnMessage(rtc::Message*) override;
|
||||
|
||||
rtc::Event e_;
|
||||
rtc::MessageHandler* proxy_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
template <typename C, typename R, typename... Args>
|
||||
class MethodCall : public rtc::Message, public rtc::MessageHandler {
|
||||
public:
|
||||
typedef R (C::*Method)(Args...);
|
||||
MethodCall(C* c, Method m, Args&&... args)
|
||||
: c_(c),
|
||||
m_(m),
|
||||
args_(std::forward_as_tuple(std::forward<Args>(args)...)) {}
|
||||
|
||||
R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
|
||||
internal::SynchronousMethodCall(this).Invoke(posted_from, t);
|
||||
return r_.moved_result();
|
||||
}
|
||||
|
||||
private:
|
||||
void OnMessage(rtc::Message*) { Invoke(std::index_sequence_for<Args...>()); }
|
||||
|
||||
template <size_t... Is>
|
||||
void Invoke(std::index_sequence<Is...>) {
|
||||
r_.Invoke(c_, m_, std::move(std::get<Is>(args_))...);
|
||||
}
|
||||
|
||||
C* c_;
|
||||
Method m_;
|
||||
ReturnType<R> r_;
|
||||
std::tuple<Args&&...> args_;
|
||||
};
|
||||
|
||||
template <typename C, typename R, typename... Args>
|
||||
class ConstMethodCall : public rtc::Message, public rtc::MessageHandler {
|
||||
public:
|
||||
typedef R (C::*Method)(Args...) const;
|
||||
ConstMethodCall(const C* c, Method m, Args&&... args)
|
||||
: c_(c),
|
||||
m_(m),
|
||||
args_(std::forward_as_tuple(std::forward<Args>(args)...)) {}
|
||||
|
||||
R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
|
||||
internal::SynchronousMethodCall(this).Invoke(posted_from, t);
|
||||
return r_.moved_result();
|
||||
}
|
||||
|
||||
private:
|
||||
void OnMessage(rtc::Message*) { Invoke(std::index_sequence_for<Args...>()); }
|
||||
|
||||
template <size_t... Is>
|
||||
void Invoke(std::index_sequence<Is...>) {
|
||||
r_.Invoke(c_, m_, std::move(std::get<Is>(args_))...);
|
||||
}
|
||||
|
||||
const C* c_;
|
||||
Method m_;
|
||||
ReturnType<R> r_;
|
||||
std::tuple<Args&&...> args_;
|
||||
};
|
||||
|
||||
// Helper macros to reduce code duplication.
|
||||
#define PROXY_MAP_BOILERPLATE(c) \
|
||||
template <class INTERNAL_CLASS> \
|
||||
|
@ -113,14 +213,16 @@ namespace webrtc {
|
|||
|
||||
// Note that the destructor is protected so that the proxy can only be
|
||||
// destroyed via RefCountInterface.
|
||||
#define REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \
|
||||
protected: \
|
||||
~c##ProxyWithInternal() { \
|
||||
destructor_thread()->template Invoke<void>(RTC_FROM_HERE, \
|
||||
[&] { c_ = nullptr; }); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
#define REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \
|
||||
protected: \
|
||||
~c##ProxyWithInternal() { \
|
||||
MethodCall<c##ProxyWithInternal, void> call( \
|
||||
this, &c##ProxyWithInternal::DestroyInternal); \
|
||||
call.Marshal(RTC_FROM_HERE, destructor_thread()); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
void DestroyInternal() { c_ = nullptr; } \
|
||||
rtc::scoped_refptr<INTERNAL_CLASS> c_;
|
||||
|
||||
// Note: This doesn't use a unique_ptr, because it intends to handle a corner
|
||||
|
@ -128,14 +230,16 @@ namespace webrtc {
|
|||
// this proxy object. If relying on a unique_ptr to delete the object, its
|
||||
// inner pointer would be set to null before this reentrant callback would have
|
||||
// a chance to run, resulting in a segfault.
|
||||
#define OWNED_PROXY_MAP_BOILERPLATE(c) \
|
||||
public: \
|
||||
~c##ProxyWithInternal() { \
|
||||
destructor_thread()->template Invoke<void>(RTC_FROM_HERE, \
|
||||
[&] { delete c_; }); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
#define OWNED_PROXY_MAP_BOILERPLATE(c) \
|
||||
public: \
|
||||
~c##ProxyWithInternal() { \
|
||||
MethodCall<c##ProxyWithInternal, void> call( \
|
||||
this, &c##ProxyWithInternal::DestroyInternal); \
|
||||
call.Marshal(RTC_FROM_HERE, destructor_thread()); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
void DestroyInternal() { delete c_; } \
|
||||
INTERNAL_CLASS* c_;
|
||||
|
||||
#define BEGIN_SIGNALING_PROXY_MAP(c) \
|
||||
|
@ -185,95 +289,112 @@ namespace webrtc {
|
|||
\
|
||||
public: // NOLINTNEXTLINE
|
||||
|
||||
#define PROXY_METHOD0_BASE(t, modifier, r, method) \
|
||||
r method() modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, [&] { return c_->method(); }); \
|
||||
#define PROXY_METHOD0(r, method) \
|
||||
r method() override { \
|
||||
MethodCall<C, r> call(c_, &C::method); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD1_BASE(t, modifier, r, method, t1) \
|
||||
r method(t1 a1) modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, \
|
||||
[&] { return c_->method(std::move(a1)); }); \
|
||||
#define PROXY_CONSTMETHOD0(r, method) \
|
||||
r method() const override { \
|
||||
ConstMethodCall<C, r> call(c_, &C::method); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD2_BASE(t, modifier, r, method, t1, t2) \
|
||||
r method(t1 a1, t2 a2) modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, [&] { \
|
||||
return c_->method(std::move(a1), std::move(a2)); \
|
||||
}); \
|
||||
#define PROXY_METHOD1(r, method, t1) \
|
||||
r method(t1 a1) override { \
|
||||
MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD3_BASE(t, modifier, r, method, t1, t2, t3) \
|
||||
r method(t1 a1, t2 a2, t3 a3) modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, [&] { \
|
||||
return c_->method(std::move(a1), std::move(a2), std::move(a3)); \
|
||||
}); \
|
||||
#define PROXY_CONSTMETHOD1(r, method, t1) \
|
||||
r method(t1 a1) const override { \
|
||||
ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD4_BASE(t, modifier, r, method, t1, t2, t3, t4) \
|
||||
r method(t1 a1, t2 a2, t3 a3, t4 a4) modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, [&] { \
|
||||
return c_->method(std::move(a1), std::move(a2), std::move(a3), \
|
||||
std::move(a4)); \
|
||||
}); \
|
||||
#define PROXY_METHOD2(r, method, t1, t2) \
|
||||
r method(t1 a1, t2 a2) override { \
|
||||
MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD5_BASE(t, modifier, r, method, t1, t2, t3, t4, t5) \
|
||||
r method(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) modifier override { \
|
||||
return t->template Invoke<r>(RTC_FROM_HERE, [&] { \
|
||||
return c_->method(std::move(a1), std::move(a2), std::move(a3), \
|
||||
std::move(a4), std::move(a5)); \
|
||||
}); \
|
||||
#define PROXY_METHOD3(r, method, t1, t2, t3) \
|
||||
r method(t1 a1, t2 a2, t3 a3) override { \
|
||||
MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2), std::move(a3)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_METHOD0(r, method) \
|
||||
PROXY_METHOD0_BASE(signaling_thread_, , r, method)
|
||||
#define PROXY_METHOD4(r, method, t1, t2, t3, t4) \
|
||||
r method(t1 a1, t2 a2, t3 a3, t4 a4) override { \
|
||||
MethodCall<C, r, t1, t2, t3, t4> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2), std::move(a3), \
|
||||
std::move(a4)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_CONSTMETHOD0(r, method) \
|
||||
PROXY_METHOD0_BASE(signaling_thread_, const, r, method)
|
||||
|
||||
#define PROXY_METHOD1(r, method, t1) \
|
||||
PROXY_METHOD1_BASE(signaling_thread_, , r, method, t1)
|
||||
|
||||
#define PROXY_CONSTMETHOD1(r, method, t1) \
|
||||
PROXY_METHOD1_BASE(signaling_thread_, const, r, method, t1)
|
||||
|
||||
#define PROXY_METHOD2(r, method, t1, t2) \
|
||||
PROXY_METHOD2_BASE(signaling_thread_, , r, method, t1, t2)
|
||||
|
||||
#define PROXY_METHOD3(r, method, t1, t2, t3) \
|
||||
PROXY_METHOD3_BASE(signaling_thread_, , r, method, t1, t2, t3)
|
||||
|
||||
#define PROXY_METHOD4(r, method, t1, t2, t3, t4) \
|
||||
PROXY_METHOD4_BASE(signaling_thread_, , r, method, t1, t2, t3, t4)
|
||||
|
||||
#define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5) \
|
||||
PROXY_METHOD5_BASE(signaling_thread_, , r, method, t1, t2, t3, t4, t5)
|
||||
#define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5) \
|
||||
r method(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) override { \
|
||||
MethodCall<C, r, t1, t2, t3, t4, t5> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2), std::move(a3), \
|
||||
std::move(a4), std::move(a5)); \
|
||||
return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
|
||||
}
|
||||
|
||||
// Define methods which should be invoked on the worker thread.
|
||||
#define PROXY_WORKER_METHOD0(r, method) \
|
||||
PROXY_METHOD0_BASE(worker_thread_, , r, method)
|
||||
#define PROXY_WORKER_METHOD0(r, method) \
|
||||
r method() override { \
|
||||
MethodCall<C, r> call(c_, &C::method); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_CONSTMETHOD0(r, method) \
|
||||
PROXY_METHOD0_BASE(worker_thread_, const, r, method)
|
||||
#define PROXY_WORKER_CONSTMETHOD0(r, method) \
|
||||
r method() const override { \
|
||||
ConstMethodCall<C, r> call(c_, &C::method); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_METHOD1(r, method, t1) \
|
||||
PROXY_METHOD1_BASE(worker_thread_, , r, method, t1)
|
||||
#define PROXY_WORKER_METHOD1(r, method, t1) \
|
||||
r method(t1 a1) override { \
|
||||
MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_CONSTMETHOD1(r, method, t1) \
|
||||
PROXY_METHOD1_BASE(worker_thread_, const, r, method, t1)
|
||||
#define PROXY_WORKER_CONSTMETHOD1(r, method, t1) \
|
||||
r method(t1 a1) const override { \
|
||||
ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_METHOD2(r, method, t1, t2) \
|
||||
PROXY_METHOD2_BASE(worker_thread_, , r, method, t1, t2)
|
||||
#define PROXY_WORKER_METHOD2(r, method, t1, t2) \
|
||||
r method(t1 a1, t2 a2) override { \
|
||||
MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_CONSTMETHOD2(r, method, t1, t2) \
|
||||
PROXY_METHOD2_BASE(worker_thread_, const, r, method, t1, t2)
|
||||
#define PROXY_WORKER_CONSTMETHOD2(r, method, t1, t2) \
|
||||
r method(t1 a1, t2 a2) const override { \
|
||||
ConstMethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_METHOD3(r, method, t1, t2, t3) \
|
||||
PROXY_METHOD3_BASE(worker_thread_, , r, method, t1, t2, t3)
|
||||
#define PROXY_WORKER_METHOD3(r, method, t1, t2, t3) \
|
||||
r method(t1 a1, t2 a2, t3 a3) override { \
|
||||
MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2), std::move(a3)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
#define PROXY_WORKER_CONSTMETHOD3(r, method, t1, t2) \
|
||||
PROXY_METHOD3_BASE(worker_thread_, const, r, method, t1, t2, t3)
|
||||
#define PROXY_WORKER_CONSTMETHOD3(r, method, t1, t2) \
|
||||
r method(t1 a1, t2 a2, t3 a3) const override { \
|
||||
ConstMethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
|
||||
std::move(a2), std::move(a3)); \
|
||||
return call.Marshal(RTC_FROM_HERE, worker_thread_); \
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
|
|
|
@ -55,8 +55,9 @@ CreateModularPeerConnectionFactory(
|
|||
std::move(dependencies)));
|
||||
// Call Initialize synchronously but make sure it is executed on
|
||||
// |signaling_thread|.
|
||||
bool result = pc_factory->signaling_thread()->Invoke<bool>(
|
||||
RTC_FROM_HERE, [&] { return pc_factory->Initialize(); });
|
||||
MethodCall<PeerConnectionFactory, bool> call(
|
||||
pc_factory.get(), &PeerConnectionFactory::Initialize);
|
||||
bool result = call.Marshal(RTC_FROM_HERE, pc_factory->signaling_thread());
|
||||
|
||||
if (!result) {
|
||||
return nullptr;
|
||||
|
|
Loading…
Reference in a new issue