X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FExecutor.h;h=a2ac0d6358089e7f4330f626180f125ebdb78c49;hp=4bacba7b2bc017d67860bd0ea710970068d48dda;hb=8b51694b56db79f30fe20cb6c019d5d28c030ec4;hpb=6214f971e82863efe7c72229dde0c84fc0594dd0 diff --git a/folly/Executor.h b/folly/Executor.h index 4bacba7b..a2ac0d63 100644 --- a/folly/Executor.h +++ b/folly/Executor.h @@ -1,5 +1,5 @@ /* - * Copyright 2014 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,32 +16,81 @@ #pragma once -#include -#include +#include + +#include namespace folly { -typedef std::function Func; +using Func = Function; /// An Executor accepts units of work with add(), which should be /// threadsafe. class Executor { public: - virtual ~Executor() = default; + // Workaround for a linkage problem with explicitly defaulted dtor t22914621 + virtual ~Executor() {} /// Enqueue a function to executed by this executor. This and all /// variants must be threadsafe. virtual void add(Func) = 0; - /// A convenience function for shared_ptr to legacy functors. + /// Enqueue a function with a given priority, where 0 is the medium priority + /// This is up to the implementation to enforce + virtual void addWithPriority(Func, int8_t priority); + + virtual uint8_t getNumPriorities() const { + return 1; + } + + static const int8_t LO_PRI = SCHAR_MIN; + static const int8_t MID_PRI = 0; + static const int8_t HI_PRI = SCHAR_MAX; + + class KeepAlive { + public: + KeepAlive() {} + + void reset() { + executor_.reset(); + } + + explicit operator bool() const { + return executor_ != nullptr; + } + + Executor* get() const { + return executor_.get(); + } + + private: + friend class Executor; + explicit KeepAlive(folly::Executor* executor) : executor_(executor) {} + + struct Deleter { + void operator()(folly::Executor* executor) { + executor->keepAliveRelease(); + } + }; + std::unique_ptr executor_; + }; + + /// Returns a keep-alive token which guarantees that Executor will keep + /// processing tasks until the token is released. /// - /// Sometimes you have a functor that is move-only, and therefore can't be - /// converted to a std::function (e.g. std::packaged_task). In that case, - /// wrap it in a shared_ptr (or maybe folly::MoveWrapper) and use this. - template - void addPtr(P fn) { - this->add([fn]() mutable { (*fn)(); }); + /// If executor does not support keep-alive functionality - dummy token will + /// be returned. + virtual KeepAlive getKeepAliveToken() { + return {}; + } + + protected: + virtual void keepAliveAcquire(); + virtual void keepAliveRelease(); + + KeepAlive makeKeepAlive() { + return KeepAlive{this}; } }; -} // folly +} // namespace folly