From c99ac53c728fac8ff7fcf15ce5c045a82ce18ccc Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sat, 28 Feb 2026 13:26:10 +1100 Subject: [PATCH] xo-interpreter2 stack: + RuntimeContext.visit_pools() method --- idl/RuntimeContext.json5 | 19 ++++++++++++++++++- include/xo/procedure2/DSimpleRcx.hpp | 2 ++ .../xo/procedure2/detail/ARuntimeContext.hpp | 5 +++++ .../procedure2/detail/IRuntimeContext_Any.hpp | 2 ++ .../detail/IRuntimeContext_DSimpleRcx.hpp | 3 +++ .../detail/IRuntimeContext_Xfer.hpp | 5 +++++ .../xo/procedure2/detail/RRuntimeContext.hpp | 4 ++++ src/procedure2/CMakeLists.txt | 3 +-- src/procedure2/DSimpleRcx.cpp | 19 +++++++++++++++++++ src/procedure2/IRuntimeContext_DSimpleRcx.cpp | 6 ++++++ 10 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/procedure2/DSimpleRcx.cpp diff --git a/idl/RuntimeContext.json5 b/idl/RuntimeContext.json5 index 07ed5b0..4012077 100644 --- a/idl/RuntimeContext.json5 +++ b/idl/RuntimeContext.json5 @@ -5,7 +5,8 @@ output_impl_subdir: "detail", // includes in ARuntimeContext.hpp includes: [ - "" + "", + "" ], // extra includes in RuntimeContext.hpp, if any user_hpp_includes: [ @@ -29,6 +30,11 @@ definition: "xo::mm::AAllocator", doc: [ "xo memory allocator" ], }, + { + name: "MemorySizeVisitor", + definition: "xo::mm::MemorySizeVisitor", + doc: [ "function to visit memory pools" ], + }, ], const_methods: [ { @@ -40,6 +46,17 @@ noexcept: true, attributes: [], }, + { + name: "visit_pools", + doc: [ "invoke visitor for each distinct memory pool" ], + return_type: "void", + args: [ + {type: "MemorySizeVisitor", name: "visitor"} + ], + const: true, + noexcept: false, + attributes: [], + }, ], nonconst_methods: [ ], diff --git a/include/xo/procedure2/DSimpleRcx.hpp b/include/xo/procedure2/DSimpleRcx.hpp index bd52dcc..1efb802 100644 --- a/include/xo/procedure2/DSimpleRcx.hpp +++ b/include/xo/procedure2/DSimpleRcx.hpp @@ -18,11 +18,13 @@ namespace xo { class DSimpleRcx { public: using AAllocator = xo::mm::AAllocator; + using MemorySizeVisitor = xo::mm::MemorySizeVisitor; public: DSimpleRcx(obj mm) : allocator_{mm} {} obj allocator() const noexcept { return allocator_; } + void visit_pools(const MemorySizeVisitor & visitor) const; private: obj allocator_; diff --git a/include/xo/procedure2/detail/ARuntimeContext.hpp b/include/xo/procedure2/detail/ARuntimeContext.hpp index 0983187..820dd8d 100644 --- a/include/xo/procedure2/detail/ARuntimeContext.hpp +++ b/include/xo/procedure2/detail/ARuntimeContext.hpp @@ -15,6 +15,7 @@ // includes (via {facet_includes}) #include +#include #include #include #include @@ -40,6 +41,8 @@ public: using Opaque = void *; /** xo memory allocator **/ using AAllocator = xo::mm::AAllocator; + /** function to visit memory pools **/ + using MemorySizeVisitor = xo::mm::MemorySizeVisitor; ///@} /** @defgroup scm-runtimecontext-methods **/ @@ -51,6 +54,8 @@ public: virtual void _drop(Opaque d) const noexcept = 0; /** default allocator to use for objects **/ virtual obj allocator(Copaque data) const noexcept = 0; + /** invoke visitor for each distinct memory pool **/ + virtual void visit_pools(Copaque data, MemorySizeVisitor visitor) const = 0; // nonconst methods ///@} diff --git a/include/xo/procedure2/detail/IRuntimeContext_Any.hpp b/include/xo/procedure2/detail/IRuntimeContext_Any.hpp index cb6dfa4..2caa9d3 100644 --- a/include/xo/procedure2/detail/IRuntimeContext_Any.hpp +++ b/include/xo/procedure2/detail/IRuntimeContext_Any.hpp @@ -45,6 +45,7 @@ namespace scm { /** integer identifying a type **/ using typeseq = xo::facet::typeseq; using AAllocator = ARuntimeContext::AAllocator; + using MemorySizeVisitor = ARuntimeContext::MemorySizeVisitor; ///@} /** @defgroup scm-runtimecontext-any-methods **/ @@ -60,6 +61,7 @@ namespace scm { // const methods [[noreturn]] obj allocator(Copaque) const noexcept override { _fatal(); } + [[noreturn]] void visit_pools(Copaque, MemorySizeVisitor) const override { _fatal(); } // nonconst methods diff --git a/include/xo/procedure2/detail/IRuntimeContext_DSimpleRcx.hpp b/include/xo/procedure2/detail/IRuntimeContext_DSimpleRcx.hpp index 247b676..62d3e12 100644 --- a/include/xo/procedure2/detail/IRuntimeContext_DSimpleRcx.hpp +++ b/include/xo/procedure2/detail/IRuntimeContext_DSimpleRcx.hpp @@ -40,6 +40,7 @@ namespace xo { /** @defgroup scm-runtimecontext-dsimplercx-type-traits **/ ///@{ using AAllocator = xo::scm::ARuntimeContext::AAllocator; + using MemorySizeVisitor = xo::scm::ARuntimeContext::MemorySizeVisitor; using Copaque = xo::scm::ARuntimeContext::Copaque; using Opaque = xo::scm::ARuntimeContext::Opaque; ///@} @@ -48,6 +49,8 @@ namespace xo { // const methods /** default allocator to use for objects **/ static obj allocator(const DSimpleRcx & self) noexcept; + /** invoke visitor for each distinct memory pool **/ + static void visit_pools(const DSimpleRcx & self, MemorySizeVisitor visitor); // non-const methods ///@} diff --git a/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp b/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp index a4545b8..6257abb 100644 --- a/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp +++ b/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp @@ -14,6 +14,7 @@ #pragma once #include +#include namespace xo { namespace scm { @@ -29,6 +30,7 @@ namespace scm { /** integer identifying a type **/ using typeseq = ARuntimeContext::typeseq; using AAllocator = ARuntimeContext::AAllocator; + using MemorySizeVisitor = ARuntimeContext::MemorySizeVisitor; ///@} /** @defgroup scm-runtimecontext-xfer-methods **/ @@ -47,6 +49,9 @@ namespace scm { obj allocator(Copaque data) const noexcept override { return I::allocator(_dcast(data)); } + void visit_pools(Copaque data, MemorySizeVisitor visitor) const override { + return I::visit_pools(_dcast(data), visitor); + } // non-const methods diff --git a/include/xo/procedure2/detail/RRuntimeContext.hpp b/include/xo/procedure2/detail/RRuntimeContext.hpp index a9e161e..5840743 100644 --- a/include/xo/procedure2/detail/RRuntimeContext.hpp +++ b/include/xo/procedure2/detail/RRuntimeContext.hpp @@ -32,6 +32,7 @@ public: using DataPtr = Object::DataPtr; using typeseq = xo::reflect::typeseq; using AAllocator = ARuntimeContext::AAllocator; + using MemorySizeVisitor = ARuntimeContext::MemorySizeVisitor; ///@} /** @defgroup scm-runtimecontext-router-ctors **/ @@ -56,6 +57,9 @@ public: obj allocator() const noexcept { return O::iface()->allocator(O::data()); } + void visit_pools(MemorySizeVisitor visitor) const { + return O::iface()->visit_pools(O::data(), visitor); + } // non-const methods (still const in router!) diff --git a/src/procedure2/CMakeLists.txt b/src/procedure2/CMakeLists.txt index 92685af..45f41bd 100644 --- a/src/procedure2/CMakeLists.txt +++ b/src/procedure2/CMakeLists.txt @@ -6,6 +6,7 @@ set(SELF_SRCS init_primitives.cpp procedure2_register_types.cpp procedure2_register_facets.cpp + DSimpleRcx.cpp IRuntimeContext_Any.cpp IRuntimeContext_DSimpleRcx.cpp IProcedure_Any.cpp @@ -13,8 +14,6 @@ set(SELF_SRCS IGCObject_DPrimitive_gco_2_gco_gco.cpp IProcedure_DPrimitive_gco_2_gco_gco.cpp IPrintable_DPrimitive_gco_2_gco_gco.cpp - # Add source files here, e.g.: - # procedure2.cpp ) xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 ${SELF_SRCS}) diff --git a/src/procedure2/DSimpleRcx.cpp b/src/procedure2/DSimpleRcx.cpp new file mode 100644 index 0000000..30ec9c9 --- /dev/null +++ b/src/procedure2/DSimpleRcx.cpp @@ -0,0 +1,19 @@ +/** @file DSimpleRcx.cpp + * + * @author Roland Conybeare, Feb 2026 + **/ + +#include "DSimpleRcx.hpp" + +namespace xo { + namespace scm { + + void + DSimpleRcx::visit_pools(const MemorySizeVisitor & visitor) const + { + allocator_.visit_pools(visitor); + } + } +} + +/* end DSimpleRcx.cpp */ diff --git a/src/procedure2/IRuntimeContext_DSimpleRcx.cpp b/src/procedure2/IRuntimeContext_DSimpleRcx.cpp index f057220..2331b7c 100644 --- a/src/procedure2/IRuntimeContext_DSimpleRcx.cpp +++ b/src/procedure2/IRuntimeContext_DSimpleRcx.cpp @@ -21,6 +21,12 @@ namespace xo { return self.allocator(); } + auto + IRuntimeContext_DSimpleRcx::visit_pools(const DSimpleRcx & self, MemorySizeVisitor visitor) -> void + { + self.visit_pools(visitor); + } + } /*namespace scm*/ } /*namespace xo*/