Browse Source

Rework objpool

pull/1619/head
Antonio SJ Musumeci 3 weeks ago
parent
commit
507c9eb340
  1. 39
      libfuse/include/objpool.hpp
  2. 4
      libfuse/lib/fuse_msgbuf.cpp

39
libfuse/include/objpool.hpp

@ -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_) noexcept
{
free_size(obj_, sizeof(T));
}
void
free(T *obj_, size_t size_ = sizeof(T)) noexcept
free_size(T *obj_, size_t size_) noexcept
{
if(not obj_)
return;

4
libfuse/lib/fuse_msgbuf.cpp

@ -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…
Cancel
Save