From 3ff986d90c2b891ea5391be9fd5104c60785ad00 Mon Sep 17 00:00:00 2001 From: Zithia Satazaki Date: Mon, 28 Mar 2022 18:28:31 -0400 Subject: [PATCH] move pool reservation out of static init --- notes | 7 ------- xybrid/main.cpp | 4 ++++ xybrid/util/mem.cpp | 20 ++++++++++++++------ xybrid/util/mem.h | 2 ++ 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/notes b/notes index b30547d..d2d2286 100644 --- a/notes +++ b/notes @@ -35,13 +35,6 @@ TODO { about-license info } - - rework RegisterPlugin slightly to automatically give a file-scope access to the PluginInfo - - ^ use in graph - - - pool I guess - - ? implement dlmalloc as backend for some things - more ui options for laptop stuff { invert scrollwheel (knobs) maybe scroll sensitivity diff --git a/xybrid/main.cpp b/xybrid/main.cpp index 8826655..cc8c391 100644 --- a/xybrid/main.cpp +++ b/xybrid/main.cpp @@ -4,6 +4,8 @@ #include "data/graph.h" #include "fileops.h" +#include "util/mem.h" + #include #include @@ -111,6 +113,8 @@ int main(int argc, char *argv[]) { Xybrid::Config::PluginRegistry::init(); Xybrid::Audio::AudioEngine::init(); + Xybrid::Util::reserveInitialPool(); // reserve arena pool ahead of time + bool opn = false; for (auto& fn : args) { diff --git a/xybrid/util/mem.cpp b/xybrid/util/mem.cpp index 5608f76..adc350e 100644 --- a/xybrid/util/mem.cpp +++ b/xybrid/util/mem.cpp @@ -6,10 +6,18 @@ std::pmr::synchronized_pool_resource Xybrid::Util::rpool; // instantiate decltype(Xybrid::Util::ralloc) Xybrid::Util::ralloc(&rpool); namespace { - static bool _____ = [] { // static init hackery to force pre-reservation of a certain chunk size - const constexpr size_t rsize = 1024*1024*128; - auto r = rpool.allocate(rsize); - rpool.deallocate(r, rsize); - return false; - }(); + static bool reserved = false; +} + +void Xybrid::Util::reserveInitialPool() { + if (reserved) return; + reserved = true; + + const constexpr size_t rsize = 1024*1024*128; + size_t bsize = rpool.options().largest_required_pool_block; + std::vector allocs; + for (size_t ts = 0; ts < rsize; ts += bsize) { + allocs.push_back(rpool.allocate(bsize)); + } + for (auto r : allocs) rpool.deallocate(r, bsize); } diff --git a/xybrid/util/mem.h b/xybrid/util/mem.h index 0581dc1..75736d2 100644 --- a/xybrid/util/mem.h +++ b/xybrid/util/mem.h @@ -10,6 +10,8 @@ namespace Xybrid::Util { extern std::pmr::synchronized_pool_resource rpool; extern std::pmr::polymorphic_allocator ralloc; + void reserveInitialPool(); + template class ResourcePool { typedef char slot[sizeof(T)];