diff options
Diffstat (limited to 'libtransport/includes/hicn/transport/utils/object_pool.h')
-rw-r--r-- | libtransport/includes/hicn/transport/utils/object_pool.h | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/libtransport/includes/hicn/transport/utils/object_pool.h b/libtransport/includes/hicn/transport/utils/object_pool.h index f78bd2aa2..63288c655 100644 --- a/libtransport/includes/hicn/transport/utils/object_pool.h +++ b/libtransport/includes/hicn/transport/utils/object_pool.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2021 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -15,8 +15,8 @@ #pragma once -// TODO #include <hicn/transport/utils/branch_prediction.h> +#include <hicn/transport/utils/noncopyable.h> #include <hicn/transport/utils/spinlock.h> #include <deque> @@ -26,7 +26,7 @@ namespace utils { template <typename T> -class ObjectPool { +class ObjectPool : private utils::NonCopyable { class ObjectDeleter { public: ObjectDeleter(ObjectPool<T> *pool = nullptr) : pool_(pool) {} @@ -44,10 +44,25 @@ class ObjectPool { }; public: - using Ptr = std::unique_ptr<T, ObjectDeleter>; + using Ptr = std::shared_ptr<T>; ObjectPool() : destructor_(false) {} + ObjectPool(ObjectPool &&other) + : object_pool_lock_(std::move(other.object_pool_lock_)), + object_pool_(std::move(other.object_pool_)), + destructor_(other.destructor_) {} + + ObjectPool &operator=(ObjectPool &&other) { + if (this != &other) { + object_pool_lock_ = std::move(other.object_pool_lock_); + object_pool_ = std::move(other.object_pool_); + destructor_ = other.destructor_; + } + + return *this; + } + ~ObjectPool() { destructor_ = true; for (auto &ptr : object_pool_) { @@ -55,12 +70,17 @@ class ObjectPool { } } + bool empty() { + utils::SpinLock::Acquire locked(object_pool_lock_); + return object_pool_.empty(); + } + std::pair<bool, Ptr> get() { + utils::SpinLock::Acquire locked(object_pool_lock_); if (object_pool_.empty()) { - return std::make_pair<bool, Ptr>(false, makePtr(nullptr)); + return std::make_pair<bool, Ptr>(false, nullptr); } - utils::SpinLock::Acquire locked(object_pool_lock_); auto ret = std::move(object_pool_.front()); object_pool_.pop_front(); return std::make_pair<bool, Ptr>(true, std::move(ret)); @@ -70,7 +90,7 @@ class ObjectPool { utils::SpinLock::Acquire locked(object_pool_lock_); if (TRANSPORT_EXPECT_TRUE(!destructor_)) { - object_pool_.emplace_back(makePtr(object)); + object_pool_.emplace_front(makePtr(object)); } else { delete object; } @@ -79,12 +99,9 @@ class ObjectPool { Ptr makePtr(T *object) { return Ptr(object, ObjectDeleter(this)); } private: - // No copies - ObjectPool(const ObjectPool &other) = delete; - utils::SpinLock object_pool_lock_; std::deque<Ptr> object_pool_; - bool destructor_; + std::atomic<bool> destructor_; }; -} // namespace utils
\ No newline at end of file +} // namespace utils |