/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include namespace facebook { namespace react { /** * A simple wrapper class that can be registered to a collection that keep it * alive for extended period of time. This object can be removed from the * collection when needed. * * The subclass of this class must be created using std::make_shared(). * After creation, add it to the `LongLivedObjectCollection`. * When done with the object, call `allowRelease()` to allow the OS to release * it. */ class LongLivedObject { public: void allowRelease(); protected: LongLivedObject() = default; virtual ~LongLivedObject() = default; }; /** * A singleton, thread-safe, write-only collection for the `LongLivedObject`s. */ class LongLivedObjectCollection { public: static LongLivedObjectCollection &get(); LongLivedObjectCollection(LongLivedObjectCollection const &) = delete; void operator=(LongLivedObjectCollection const &) = delete; void add(std::shared_ptr o); void remove(const LongLivedObject *o); void clear(); size_t size() const; private: LongLivedObjectCollection() = default; std::unordered_set> collection_; mutable std::mutex collectionMutex_; }; } // namespace react } // namespace facebook