From: Sven Over Date: Mon, 4 Apr 2016 09:32:10 +0000 (-0700) Subject: folly::FunctionScheduler: replace std::function w/ folly::Function X-Git-Tag: 2016.07.26~373 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a92b878a9c9928214b15f2f5b49c31032e9fb772;p=folly.git folly::FunctionScheduler: replace std::function w/ folly::Function Summary:By using folly::Function instead of std::function to internally store functions in FunctionScheduler, this diff allows users to pass non-copyable lambdas to FunctionScheduler::addFunction. All exisiting unit tests still pass. Also, passing std::function to addFunction still works, as the std::function will be implicitly converted (i.e. wrapped) in a folly::Function. However, this implies a performance penalty. Reviewed By: fugalh Differential Revision: D3092944 fb-gh-sync-id: 1e8081e70d4717025f2eadbb6b6da173460d4373 fbshipit-source-id: 1e8081e70d4717025f2eadbb6b6da173460d4373 --- diff --git a/folly/experimental/FunctionScheduler.cpp b/folly/experimental/FunctionScheduler.cpp index d648ce26..de90c482 100644 --- a/folly/experimental/FunctionScheduler.cpp +++ b/folly/experimental/FunctionScheduler.cpp @@ -92,46 +92,44 @@ FunctionScheduler::~FunctionScheduler() { shutdown(); } -void FunctionScheduler::addFunction(const std::function& cb, +void FunctionScheduler::addFunction(Function&& cb, milliseconds interval, StringPiece nameID, milliseconds startDelay) { addFunctionGenericDistribution( - cb, - IntervalDistributionFunc(ConstIntervalFunctor(interval)), + std::move(cb), + ConstIntervalFunctor(interval), nameID.str(), to(interval.count(), "ms"), startDelay); } -void FunctionScheduler::addFunction(const std::function& cb, +void FunctionScheduler::addFunction(Function&& cb, milliseconds interval, const LatencyDistribution& latencyDistr, StringPiece nameID, milliseconds startDelay) { if (latencyDistr.isPoisson) { addFunctionGenericDistribution( - cb, - IntervalDistributionFunc( - PoissonDistributionFunctor(latencyDistr.poissonMean)), + std::move(cb), + PoissonDistributionFunctor(latencyDistr.poissonMean), nameID.str(), to(latencyDistr.poissonMean, "ms (Poisson mean)"), startDelay); } else { - addFunction(cb, interval, nameID, startDelay); + addFunction(std::move(cb), interval, nameID, startDelay); } } void FunctionScheduler::addFunctionUniformDistribution( - const std::function& cb, + Function&& cb, milliseconds minInterval, milliseconds maxInterval, StringPiece nameID, milliseconds startDelay) { addFunctionGenericDistribution( - cb, - IntervalDistributionFunc( - UniformDistributionFunctor(minInterval, maxInterval)), + std::move(cb), + UniformDistributionFunctor(minInterval, maxInterval), nameID.str(), to( "[", minInterval.count(), " , ", maxInterval.count(), "] ms"), @@ -139,8 +137,8 @@ void FunctionScheduler::addFunctionUniformDistribution( } void FunctionScheduler::addFunctionGenericDistribution( - const std::function& cb, - const IntervalDistributionFunc& intervalFunc, + Function&& cb, + IntervalDistributionFunc&& intervalFunc, const std::string& nameID, const std::string& intervalDescr, milliseconds startDelay) { @@ -173,7 +171,13 @@ void FunctionScheduler::addFunctionGenericDistribution( } addFunctionToHeap( - l, RepeatFunc(cb, intervalFunc, nameID, intervalDescr, startDelay)); + l, + RepeatFunc( + std::move(cb), + std::move(intervalFunc), + nameID, + intervalDescr, + startDelay)); } bool FunctionScheduler::cancelFunction(StringPiece nameID) { diff --git a/folly/experimental/FunctionScheduler.h b/folly/experimental/FunctionScheduler.h index e3c0d132..e5514596 100644 --- a/folly/experimental/FunctionScheduler.h +++ b/folly/experimental/FunctionScheduler.h @@ -16,6 +16,7 @@ #pragma once +#include #include #include #include @@ -92,7 +93,7 @@ class FunctionScheduler { * Throws an exception on error. In particular, each function must have a * unique name--two functions cannot be added with the same name. */ - void addFunction(const std::function& cb, + void addFunction(Function&& cb, std::chrono::milliseconds interval, StringPiece nameID = StringPiece(), std::chrono::milliseconds startDelay = @@ -103,7 +104,7 @@ class FunctionScheduler { * LatencyDistribution */ void addFunction( - const std::function& cb, + Function&& cb, std::chrono::milliseconds interval, const LatencyDistribution& latencyDistr, StringPiece nameID = StringPiece(), @@ -114,7 +115,7 @@ class FunctionScheduler { * interval being distributed uniformly within the given interval * [minInterval, maxInterval]. */ - void addFunctionUniformDistribution(const std::function& cb, + void addFunctionUniformDistribution(Function&& cb, std::chrono::milliseconds minInterval, std::chrono::milliseconds maxInterval, StringPiece nameID, @@ -124,7 +125,7 @@ class FunctionScheduler { * A type alias for function that is called to determine the time * interval for the next scheduled run. */ - using IntervalDistributionFunc = std::function; + using IntervalDistributionFunc = Function; /** * Add a new function to the FunctionScheduler. The scheduling interval @@ -136,8 +137,8 @@ class FunctionScheduler { * @see FunctionScheduler::addFunctionJitterInterval). */ void addFunctionGenericDistribution( - const std::function& cb, - const IntervalDistributionFunc& intervalFunc, + Function&& cb, + IntervalDistributionFunc&& intervalFunc, const std::string& nameID, const std::string& intervalDescr, std::chrono::milliseconds startDelay); @@ -186,20 +187,20 @@ class FunctionScheduler { private: struct RepeatFunc { - std::function cb; + Function cb; IntervalDistributionFunc intervalFunc; std::chrono::steady_clock::time_point nextRunTime; std::string name; std::chrono::milliseconds startDelay; std::string intervalDescr; - RepeatFunc(const std::function& cback, - const IntervalDistributionFunc& intervalFn, + RepeatFunc(Function&& cback, + IntervalDistributionFunc&& intervalFn, const std::string& nameID, const std::string& intervalDistDescription, std::chrono::milliseconds delay) - : cb(cback), - intervalFunc(intervalFn), + : cb(std::move(cback)), + intervalFunc(std::move(intervalFn)), nextRunTime(), name(nameID), startDelay(delay), @@ -217,7 +218,7 @@ class FunctionScheduler { } void cancel() { // Simply reset cb to an empty function. - cb = std::function(); + cb = {}; } bool isValid() const { return bool(cb); } };