mirror of
https://github.com/trapexit/mergerfs.git
synced 2026-10-26 19:01:56 -04:00
Rework objpool
This commit is contained in:
parent
a872b20c61
commit
507c9eb340
2 changed files with 33 additions and 10 deletions
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <new>
|
||||
|
|
@ -117,7 +118,7 @@ private:
|
|||
Node*
|
||||
_pop_node()
|
||||
{
|
||||
mutex_lock(&_mtx);
|
||||
mutex_lock(_mtx);
|
||||
|
||||
Node *node = _head;
|
||||
if(node)
|
||||
|
|
@ -126,7 +127,7 @@ private:
|
|||
_pool_count.fetch_sub(1, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
mutex_unlock(&_mtx);
|
||||
mutex_unlock(_mtx);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
|
@ -138,10 +139,9 @@ private:
|
|||
|
||||
node_->next = _head;
|
||||
_head = node_;
|
||||
_pool_count.fetch_add(1, std::memory_order_relaxed);
|
||||
|
||||
mutex_unlock(_mtx);
|
||||
|
||||
_pool_count.fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
public:
|
||||
|
|
@ -154,11 +154,10 @@ public:
|
|||
|
||||
head = _head;
|
||||
_head = nullptr;
|
||||
_pool_count.store(0, std::memory_order_relaxed);
|
||||
|
||||
mutex_unlock(_mtx);
|
||||
|
||||
_pool_count.store(0, std::memory_order_relaxed);
|
||||
|
||||
while(head)
|
||||
{
|
||||
Node *next = head->next;
|
||||
|
|
@ -169,11 +168,28 @@ public:
|
|||
|
||||
template<typename... Args>
|
||||
T*
|
||||
alloc(size_t size_ = sizeof(T), Args&&... args_)
|
||||
alloc(Args&&... args_)
|
||||
{
|
||||
return _alloc_impl(sizeof(T), std::forward<Args>(args_)...);
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
T*
|
||||
alloc_size(size_t size_, Args&&... args_)
|
||||
{
|
||||
return _alloc_impl(size_, std::forward<Args>(args_)...);
|
||||
}
|
||||
|
||||
private:
|
||||
template<typename... Args>
|
||||
T*
|
||||
_alloc_impl(size_t size_, Args&&... args_)
|
||||
{
|
||||
void *mem;
|
||||
Node *node;
|
||||
|
||||
assert(size_ >= sizeof(T));
|
||||
|
||||
node = _pop_node();
|
||||
mem = (node ?
|
||||
static_cast<void*>(node) :
|
||||
|
|
@ -191,8 +207,15 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
public:
|
||||
void
|
||||
free(T *obj_, size_t size_ = sizeof(T)) noexcept
|
||||
free(T *obj_) noexcept
|
||||
{
|
||||
free_size(obj_, sizeof(T));
|
||||
}
|
||||
|
||||
void
|
||||
free_size(T *obj_, size_t size_) noexcept
|
||||
{
|
||||
if(not obj_)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ _msgbuf_alloc(msgbuf_setup_func_t setup_func_)
|
|||
{
|
||||
fuse_msgbuf_t *msgbuf;
|
||||
|
||||
msgbuf = g_msgbuf_pool.alloc(g_bufsize);
|
||||
msgbuf = g_msgbuf_pool.alloc_size(g_bufsize);
|
||||
if(msgbuf == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -127,7 +127,7 @@ msgbuf_alloc_page_aligned()
|
|||
void
|
||||
msgbuf_free(fuse_msgbuf_t *msgbuf_)
|
||||
{
|
||||
g_msgbuf_pool.free(msgbuf_, g_bufsize);
|
||||
g_msgbuf_pool.free_size(msgbuf_,g_bufsize);
|
||||
}
|
||||
|
||||
u64
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue