summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Thakker <github@anandthakker.net>2018-06-14 10:37:07 -0400
committerAnand Thakker <github@anandthakker.net>2018-06-14 10:37:07 -0400
commitd0b44af050c993772e8ef8bafb4b4fa0c41c2978 (patch)
tree77733b000fe6f862fb5b824057d919b2c40c7496
parenta17003b494846ebbaf69971355a5f14f93eecb15 (diff)
downloadqtlocation-mapboxgl-d0b44af050c993772e8ef8bafb4b4fa0c41c2978.tar.gz
Move target Object constructor args into thread
-rw-r--r--include/mbgl/util/thread.hpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/include/mbgl/util/thread.hpp b/include/mbgl/util/thread.hpp
index 8230d8778f..b5f79aa28d 100644
--- a/include/mbgl/util/thread.hpp
+++ b/include/mbgl/util/thread.hpp
@@ -58,16 +58,27 @@ public:
// up and running.
std::shared_ptr<Mailbox> mailbox_ = std::make_shared<Mailbox>(noopScheduler);
mailbox = mailbox_;
-
- thread = std::thread([&, sharedMailbox = std::move(mailbox_), runningPromise = std::move(running_)] {
+
+ auto tuple = std::make_tuple(std::forward<Args>(args)...);
+
+ thread = std::thread([
+ this,
+ name,
+ tuple,
+ sharedMailbox = std::move(mailbox_),
+ runningPromise = std::move(running_)
+ ] {
platform::setCurrentThreadName(name);
platform::makeThreadLowPriority();
util::RunLoop loop_(util::RunLoop::Type::New);
loop = &loop_;
- Actor<Object>* actor = new (&actorStorage) Actor<Object>(std::move(sharedMailbox), std::forward<Args>(args)...);
-
+ Actor<Object>* actor = emplaceActor(
+ std::move(sharedMailbox),
+ std::move(tuple),
+ std::make_index_sequence<std::tuple_size<decltype(tuple)>::value>{});
+
// Replace the NoopScheduler on the mailbox with the RunLoop to
// begin actually processing messages.
actor->mailbox->setScheduler(this);
@@ -161,6 +172,11 @@ private:
assert(loop);
loop->schedule(mailbox_);
}
+
+ template <typename ArgsTuple, std::size_t... I>
+ Actor<Object>* emplaceActor(std::shared_ptr<Mailbox> sharedMailbox, ArgsTuple args, std::index_sequence<I...>) {
+ return new (&actorStorage) Actor<Object>(std::move(sharedMailbox), std::move(std::get<I>(std::forward<ArgsTuple>(args)))...);
+ }
NoopScheduler noopScheduler;
std::weak_ptr<Mailbox> mailbox;