From d8bd75079b43d4a06a4fcfe645e86504ad0c0095 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Wed, 9 Jan 2019 21:10:00 +0100 Subject: [PATCH] Add ability to use movable only functors in rtc::Thread::Invoke(...) Add support for movable only functors with void return type. Non void return type is already supported. Bug: webrtc:10138 Change-Id: If2ae2b5ab7244a0e932bceff7d9853c030805688 Reviewed-on: https://webrtc-review.googlesource.com/c/116740 Reviewed-by: Karl Wiberg Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/master@{#26186} --- pc/channel_unittest.cc | 5 +++-- rtc_base/messagehandler.h | 3 ++- rtc_base/timeutils_unittest.cc | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc index 07e9e188ae..e675375a48 100644 --- a/pc/channel_unittest.cc +++ b/pc/channel_unittest.cc @@ -520,9 +520,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { class ScopedCallThread { public: template - explicit ScopedCallThread(const FunctorT& functor) + explicit ScopedCallThread(FunctorT&& functor) : thread_(rtc::Thread::Create()), - task_(new rtc::FunctorMessageHandler(functor)) { + task_(new rtc::FunctorMessageHandler( + std::forward(functor))) { thread_->Start(); thread_->Post(RTC_FROM_HERE, task_.get()); } diff --git a/rtc_base/messagehandler.h b/rtc_base/messagehandler.h index 0c40853e21..67a3103178 100644 --- a/rtc_base/messagehandler.h +++ b/rtc_base/messagehandler.h @@ -55,7 +55,8 @@ class FunctorMessageHandler : public MessageHandler { template class FunctorMessageHandler : public MessageHandler { public: - explicit FunctorMessageHandler(const FunctorT& functor) : functor_(functor) {} + explicit FunctorMessageHandler(FunctorT&& functor) + : functor_(std::forward(functor)) {} virtual void OnMessage(Message* msg) { functor_(); } void result() const {} void MoveResult() {} diff --git a/rtc_base/timeutils_unittest.cc b/rtc_base/timeutils_unittest.cc index 9e7de069b5..a2e9a3f9e6 100644 --- a/rtc_base/timeutils_unittest.cc +++ b/rtc_base/timeutils_unittest.cc @@ -272,7 +272,7 @@ TEST(FakeClock, SettingTimeWakesThreads) { auto functor = [&message_handler_dispatched] { message_handler_dispatched.Set(); }; - FunctorMessageHandler handler(functor); + FunctorMessageHandler handler(std::move(functor)); worker->PostDelayed(RTC_FROM_HERE, 60000, &handler); // Wait for a bit for the worker thread to be started and enter its socket