From 031a72d7ad255c283b9f770b05101e142d98f32f Mon Sep 17 00:00:00 2001
From: Antonio SJ Musumeci <trapexit@spawn.link>
Date: Mon, 24 Apr 2023 09:04:33 -0400
Subject: [PATCH] checkpoint

---
 libfuse/lib/fuse.c          |  2 +-
 libfuse/lib/fuse_msgbuf.cpp | 25 +++++++++++++------------
 2 files changed, 14 insertions(+), 13 deletions(-)

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 <cstdint>
 #include <cstdlib>
 #include <mutex>
-#include <stack>
+#include <vector>
 
 
 static std::uint32_t g_PAGESIZE = 0;
 static std::uint32_t g_BUFSIZE  = 0;
 
 static std::mutex g_MUTEX;
-static std::stack<fuse_msgbuf_t*> g_MSGBUF_STACK;
+static std::vector<fuse_msgbuf_t*> 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<std::mutex> lck(g_MUTEX);
-
-  while(!g_MSGBUF_STACK.empty())
-    {
-      fuse_msgbuf_t *msgbuf;
+  std::vector<fuse_msgbuf_t*> oldstack;
 
-      msgbuf = g_MSGBUF_STACK.top();
-      g_MSGBUF_STACK.pop();
+  {
+    std::lock_guard<std::mutex> lck(g_MUTEX);
+    oldstack.swap(g_MSGBUF_STACK);
+  }
 
+  for(auto msgbuf: oldstack)
+    {
       free(msgbuf->mem);
       free(msgbuf);
     }