X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FExecutor.h;h=a2ac0d6358089e7f4330f626180f125ebdb78c49;hp=68670faada32c485fc4c66b12c2597ec5e3fbe92;hb=3764b633f977129f8ee3bca60db7c5d1bb969eec;hpb=c9fc2e3200eaa8fde46f7a31447d278325bebd3b diff --git a/folly/Executor.h b/folly/Executor.h index 68670faa..a2ac0d63 100644 --- a/folly/Executor.h +++ b/folly/Executor.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 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. @@ -28,7 +28,8 @@ using Func = Function; /// 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. @@ -46,15 +47,50 @@ class Executor { static const int8_t MID_PRI = 0; static const int8_t HI_PRI = SCHAR_MAX; - /// A convenience function for shared_ptr to legacy functors. + 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