From 340fa8a7cbf712ab522c52082b66bacc3bc7e1ca Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 11 Jul 2018 16:29:27 -0700 Subject: [PATCH] Thread accept non-copyable std::function --- src/misc/pv/thread.h | 4 ++-- src/misc/thread.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/misc/pv/thread.h b/src/misc/pv/thread.h index b58b613..5cc1fd5 100644 --- a/src/misc/pv/thread.h +++ b/src/misc/pv/thread.h @@ -111,7 +111,7 @@ public: template Config(C* inst, void(C::*meth)()) {this->x_setdefault();this->run(inst, meth);} #if __cplusplus>=201103L - Config(const std::function& fn); + Config(std::function&& fn); #endif Config& name(const std::string& n); @@ -132,7 +132,7 @@ public: return *this; } #if __cplusplus>=201103L - Config& run(const std::function& fn); + Config& run(std::function&& fn); #endif //! Append to thread name string. Argument must be understood by std::ostream::operator<< diff --git a/src/misc/thread.cpp b/src/misc/thread.cpp index fc39d83..ddaa916 100644 --- a/src/misc/thread.cpp +++ b/src/misc/thread.cpp @@ -29,7 +29,7 @@ struct BindRunner : public epicsThreadRunable { typedef std::function fn_t; fn_t fn; - BindRunner(const fn_t f) : fn(f) {} + BindRunner(fn_t&& f) : fn(std::move(f)) {} virtual ~BindRunner() {} virtual void run() { @@ -64,7 +64,7 @@ Thread::Config::Config(Runnable *r) {this->x_setdefault();this->run(r);} Thread::Config::Config(void(*fn)(void*), void *ptr) {this->x_setdefault();this->run(fn, ptr);} #if __cplusplus>=201103L -Thread::Config::Config(const std::function& fn) {this->x_setdefault();this->run(fn);} +Thread::Config::Config(std::function&& fn) {this->x_setdefault();this->run(std::move(fn));} #endif Thread::Config& Thread::Config::name(const std::string& n) @@ -90,9 +90,9 @@ Thread::Config& Thread::Config::run(void(*fn)(void*), void *ptr) } #if __cplusplus>=201103L -Thread::Config& Thread::Config::run(const std::function& fn) +Thread::Config& Thread::Config::run(std::function &&fn) { - this->p_owned_runner.reset(new detail::BindRunner(fn)); + this->p_owned_runner.reset(new detail::BindRunner(std::move(fn))); this->p_runner = this->p_owned_runner.get(); return *this; }