mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2024-11-14 04:57:21 +01:00
Remove the ObjectPool from trantor.
This commit is contained in:
parent
fc6381a6e5
commit
2fc39f37dc
@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
* @file ObjectPool.h
|
|
||||||
* @author An Tao
|
|
||||||
*
|
|
||||||
* Public header file in trantor lib.
|
|
||||||
*
|
|
||||||
* Copyright 2018, An Tao. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the License file.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <trantor/utils/NonCopyable.h>
|
|
||||||
#include <vector>
|
|
||||||
#include <memory>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
namespace trantor
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @brief This class template represents a object pool.
|
|
||||||
*
|
|
||||||
* @tparam T
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
class ObjectPool : public NonCopyable,
|
|
||||||
public std::enable_shared_from_this<ObjectPool<T>>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::shared_ptr<T> getObject()
|
|
||||||
{
|
|
||||||
static_assert(!std::is_pointer<T>::value,
|
|
||||||
"The parameter type of the ObjectPool template can't be "
|
|
||||||
"pointer type");
|
|
||||||
T *p{nullptr};
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mtx_);
|
|
||||||
if (!objs_.empty())
|
|
||||||
{
|
|
||||||
p = objs_.back();
|
|
||||||
objs_.pop_back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p == nullptr)
|
|
||||||
{
|
|
||||||
p = new T;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(p);
|
|
||||||
std::weak_ptr<ObjectPool<T>> weakPtr = this->shared_from_this();
|
|
||||||
auto obj = std::shared_ptr<T>(p, [weakPtr](T *ptr) {
|
|
||||||
auto self = weakPtr.lock();
|
|
||||||
if (self)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(self->mtx_);
|
|
||||||
self->objs_.push_back(ptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete ptr;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<T *> objs_;
|
|
||||||
std::mutex mtx_;
|
|
||||||
};
|
|
||||||
} // namespace trantor
|
|
Loading…
Reference in New Issue
Block a user