+ // Returns a VirtualEventBase attached to this EventBase. Can be used to
+ // pass to APIs which expect VirtualEventBase. This VirtualEventBase will be
+ // destroyed together with the EventBase.
+ //
+ // Any number of VirtualEventBases instances may be independently constructed,
+ // which are backed by this EventBase. This method should be only used if you
+ // don't need to manage the life time of the VirtualEventBase used.
+ folly::VirtualEventBase& getVirtualEventBase();
+
+ protected:
+ void keepAliveAcquire() override {
+ if (inRunningEventBaseThread()) {
+ loopKeepAliveCount_++;
+ } else {
+ loopKeepAliveCountAtomic_.fetch_add(1, std::memory_order_relaxed);
+ }
+ }
+
+ void keepAliveRelease() override {
+ if (!inRunningEventBaseThread()) {
+ return add([=] { keepAliveRelease(); });
+ }
+ loopKeepAliveCount_--;
+ }
+