+ /// 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<folly::Executor, Deleter> executor_;
+ };
+
+ /// Returns a keep-alive token which guarantees that Executor will keep
+ /// processing tasks until the token is released.