From 88a237e38cc1b60c8f51d21e4c476dcca1a36c51 Mon Sep 17 00:00:00 2001 From: Artyom Ivanov Date: Thu, 6 Nov 2025 19:03:19 +0300 Subject: [PATCH 1/5] refactor(init): Add wrapper for static local variables --- src/common/classes/init.h | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 8ac2a0476d8..130913a8ba2 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -303,6 +303,64 @@ class InitInstance : private DestroyControl > } }; +template +class DefaultNonLazyInstanceAllocator +{ +public: + template + static T* create(TArgs&&... args) + { + return FB_NEW_POOL(*getDefaultMemoryPool()) T(std::forward(args)...); + } + + static void destroy(T* inst) noexcept + { + delete inst; + } +}; + +// Best use case is for static local variable +template , template class DestroyControl = DeleteInstance > +class NonLazyInitInstance : private DestroyControl > +{ +public: + template + NonLazyInitInstance(TArgs&&... args) + { + MutexLockGuard guard(*StaticMutex::mutex, "NonLazyInitInstance"); + m_instance = TAllocator::create(std::forward(args)...); + DestroyControl>::registerInstance(this); + } + + T& operator()() noexcept + { + return *m_instance; + } + const T& operator()() const noexcept + { + return *m_instance; + } + + T* get() noexcept + { + return m_instance; + } + const T* get() const noexcept + { + return m_instance; + } + + void dtor() + { + MutexLockGuard guard(*StaticMutex::mutex, "NonLazyInitInstance - dtor"); + TAllocator::destroy(m_instance); + m_instance = nullptr; + } + +private: + T* m_instance = nullptr; +}; + // Static - create instance of some class in static char[] buffer. Never destroy it. template From 023fd6daeee002437b4de6756b1eb2314518a456 Mon Sep 17 00:00:00 2001 From: Artyom Ivanov Date: Thu, 6 Nov 2025 19:04:37 +0300 Subject: [PATCH 2/5] refactor(vio): Initialize schema search path statically --- src/jrd/vio.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index 44760b74b11..b9c3208f7de 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -4223,7 +4223,9 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) }}, }; - ObjectsArray schemaSearchPath({SYSTEM_SCHEMA, PUBLIC_SCHEMA}); + static const NonLazyInitInstance> schemaSearchPath( + *getDefaultMemoryPool(), std::initializer_list{SYSTEM_SCHEMA, PUBLIC_SCHEMA} + ); if (const auto relSchemaFields = schemaFields.find(relation->rel_id); relSchemaFields != schemaFields.end()) { @@ -4242,7 +4244,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) { MOV_get_metaname(tdbb, &desc, depName.object); - if (MET_qualify_existing_name(tdbb, depName, {dependency->objType}, &schemaSearchPath)) + if (MET_qualify_existing_name(tdbb, depName, {dependency->objType}, schemaSearchPath.get())) schemaName = depName.schema.c_str(); } From ce8e17d0c91da252715bd3ba883c903c4e770c57 Mon Sep 17 00:00:00 2001 From: Artyom Ivanov Date: Fri, 7 Nov 2025 12:03:34 +0300 Subject: [PATCH 3/5] Revert "refactor(init): Add wrapper for static local variables" This reverts commit 88a237e38cc1b60c8f51d21e4c476dcca1a36c51. --- src/common/classes/init.h | 58 --------------------------------------- 1 file changed, 58 deletions(-) diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 130913a8ba2..8ac2a0476d8 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -303,64 +303,6 @@ class InitInstance : private DestroyControl > } }; -template -class DefaultNonLazyInstanceAllocator -{ -public: - template - static T* create(TArgs&&... args) - { - return FB_NEW_POOL(*getDefaultMemoryPool()) T(std::forward(args)...); - } - - static void destroy(T* inst) noexcept - { - delete inst; - } -}; - -// Best use case is for static local variable -template , template class DestroyControl = DeleteInstance > -class NonLazyInitInstance : private DestroyControl > -{ -public: - template - NonLazyInitInstance(TArgs&&... args) - { - MutexLockGuard guard(*StaticMutex::mutex, "NonLazyInitInstance"); - m_instance = TAllocator::create(std::forward(args)...); - DestroyControl>::registerInstance(this); - } - - T& operator()() noexcept - { - return *m_instance; - } - const T& operator()() const noexcept - { - return *m_instance; - } - - T* get() noexcept - { - return m_instance; - } - const T* get() const noexcept - { - return m_instance; - } - - void dtor() - { - MutexLockGuard guard(*StaticMutex::mutex, "NonLazyInitInstance - dtor"); - TAllocator::destroy(m_instance); - m_instance = nullptr; - } - -private: - T* m_instance = nullptr; -}; - // Static - create instance of some class in static char[] buffer. Never destroy it. template From 894956d2cdb06afddaebcd34a39187b33e84ab40 Mon Sep 17 00:00:00 2001 From: Artyom Ivanov Date: Fri, 7 Nov 2025 12:11:07 +0300 Subject: [PATCH 4/5] refactor(vio): Use GlobalPtr --- src/common/classes/init.h | 16 ++++++++++++++++ src/jrd/vio.cpp | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 8ac2a0476d8..52bfe2f2ebe 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -147,6 +147,13 @@ class GlobalPtr : private InstanceControl FB_NEW InstanceControl::InstanceLink(this); } + template + GlobalPtr(TFunc initializationFunc) + { + instance = initializationFunc(); + FB_NEW InstanceControl::InstanceLink(this); + } + T* operator->() noexcept { return instance; @@ -160,6 +167,15 @@ class GlobalPtr : private InstanceControl return instance; } + T* get() noexcept + { + return instance; + } + const T* get() const noexcept + { + return instance; + } + operator bool() noexcept { return instance; diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index b9c3208f7de..af00e8548e7 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -4223,9 +4223,10 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) }}, }; - static const NonLazyInitInstance> schemaSearchPath( - *getDefaultMemoryPool(), std::initializer_list{SYSTEM_SCHEMA, PUBLIC_SCHEMA} - ); + static const GlobalPtr> schemaSearchPath([]() + { + return FB_NEW_POOL(*getDefaultMemoryPool()) ObjectsArray(*getDefaultMemoryPool(), {SYSTEM_SCHEMA, PUBLIC_SCHEMA}); + }); if (const auto relSchemaFields = schemaFields.find(relation->rel_id); relSchemaFields != schemaFields.end()) { From 61f13215c3004680aeea1ba936fc4b65e85b273e Mon Sep 17 00:00:00 2001 From: Artyom Ivanov Date: Fri, 7 Nov 2025 15:52:18 +0300 Subject: [PATCH 5/5] Refactor after review --- src/common/classes/init.h | 6 ++++-- src/jrd/vio.cpp | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 52bfe2f2ebe..f673e9bbbf8 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -147,10 +147,11 @@ class GlobalPtr : private InstanceControl FB_NEW InstanceControl::InstanceLink(this); } - template + template + requires(std::invocable) GlobalPtr(TFunc initializationFunc) { - instance = initializationFunc(); + instance = initializationFunc(*getDefaultMemoryPool()); FB_NEW InstanceControl::InstanceLink(this); } @@ -171,6 +172,7 @@ class GlobalPtr : private InstanceControl { return instance; } + const T* get() const noexcept { return instance; diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index af00e8548e7..f90d7ae732d 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -4223,9 +4223,9 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) }}, }; - static const GlobalPtr> schemaSearchPath([]() + static const GlobalPtr> schemaSearchPath([](MemoryPool& pool) { - return FB_NEW_POOL(*getDefaultMemoryPool()) ObjectsArray(*getDefaultMemoryPool(), {SYSTEM_SCHEMA, PUBLIC_SCHEMA}); + return FB_NEW_POOL(pool) ObjectsArray(pool, {SYSTEM_SCHEMA, PUBLIC_SCHEMA}); }); if (const auto relSchemaFields = schemaFields.find(relation->rel_id); relSchemaFields != schemaFields.end())