diff --git a/libfuse/lib/fuse.c b/libfuse/lib/fuse.c index 04691c30..8f76d53e 100644 --- a/libfuse/lib/fuse.c +++ b/libfuse/lib/fuse.c @@ -3829,7 +3829,7 @@ fuse_maintenance_loop(void *fuse_) if(!f->conf.nogc && gc) { gc = lfmp_gc(&f->node_fmp); - msgbuf_gc(); + // msgbuf_gc(); } if(g_LOG_METRICS) diff --git a/libfuse/lib/fuse_msgbuf.cpp b/libfuse/lib/fuse_msgbuf.cpp index dd857876..0037924c 100644 --- a/libfuse/lib/fuse_msgbuf.cpp +++ b/libfuse/lib/fuse_msgbuf.cpp @@ -23,14 +23,14 @@ #include #include #include -#include +#include static std::uint32_t g_PAGESIZE = 0; static std::uint32_t g_BUFSIZE = 0; static std::mutex g_MUTEX; -static std::stack g_MSGBUF_STACK; +static std::vector g_MSGBUF_STACK; static __attribute__((constructor)) @@ -38,6 +38,7 @@ void msgbuf_constructor() { g_PAGESIZE = sysconf(_SC_PAGESIZE); + // +2 because to do O_DIRECT we need to offset the buffer to align g_BUFSIZE = (g_PAGESIZE * (FUSE_MAX_MAX_PAGES + 2)); } @@ -98,8 +99,8 @@ msgbuf_alloc() } else { - msgbuf = g_MSGBUF_STACK.top(); - g_MSGBUF_STACK.pop(); + msgbuf = g_MSGBUF_STACK.back(); + g_MSGBUF_STACK.pop_back(); } return msgbuf; @@ -117,7 +118,7 @@ msgbuf_free(fuse_msgbuf_t *msgbuf_) return; } - g_MSGBUF_STACK.push(msgbuf_); + g_MSGBUF_STACK.emplace_back(msgbuf_); } uint64_t @@ -131,15 +132,15 @@ msgbuf_alloc_count() void msgbuf_gc() { - std::lock_guard lck(g_MUTEX); - - while(!g_MSGBUF_STACK.empty()) - { - fuse_msgbuf_t *msgbuf; + std::vector oldstack; - msgbuf = g_MSGBUF_STACK.top(); - g_MSGBUF_STACK.pop(); + { + std::lock_guard lck(g_MUTEX); + oldstack.swap(g_MSGBUF_STACK); + } + for(auto msgbuf: oldstack) + { free(msgbuf->mem); free(msgbuf); }