Improve RoutingWorker utilities

Added an overload to execute_concurrently that takes an std::function as a
parameter and added a const version of operator* for rworker_local. Also
removed the std::move of the return value in rworker_local::values as it
can prevent RVO from taking place.
This commit is contained in:
Markus Mäkelä
2019-03-18 23:37:08 +02:00
parent 0130bc16e2
commit 494a8a660a
2 changed files with 15 additions and 1 deletions

View File

@ -405,6 +405,7 @@ public:
* otherwise the task is delivered via the message loop. * otherwise the task is delivered via the message loop.
*/ */
static size_t execute_concurrently(Task& task); static size_t execute_concurrently(Task& task);
static size_t execute_concurrently(std::function<void()> func);
/** /**
* Broadcast a message to all worker. * Broadcast a message to all worker.
@ -705,6 +706,12 @@ public:
return *get_local_value(); return *get_local_value();
} }
// Const version of dereference operator
const T& operator*() const
{
return *get_local_value();
}
/** /**
* Assign a value * Assign a value
* *
@ -746,7 +753,7 @@ public:
RoutingWorker::EXECUTE_AUTO); RoutingWorker::EXECUTE_AUTO);
sem.wait_n(n); sem.wait_n(n);
return std::move(rval); return rval;
} }
private: private:

View File

@ -780,6 +780,13 @@ size_t RoutingWorker::execute_concurrently(Task& task)
return sem.wait_n(RoutingWorker::broadcast(&task, &sem)); return sem.wait_n(RoutingWorker::broadcast(&task, &sem));
} }
// static
size_t RoutingWorker::execute_concurrently(std::function<void()> func)
{
Semaphore sem;
return sem.wait_n(RoutingWorker::broadcast(func, &sem, EXECUTE_AUTO));
}
// static // static
size_t RoutingWorker::broadcast_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2) size_t RoutingWorker::broadcast_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2)
{ {