From f9a49043c35e73fc2d4ffb3ed9b39c33849c43b3 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 15 Dec 2023 21:14:17 +0800 Subject: fix: slove threading and memory issues --- src/core/function/basic/GpgFunctionObject.cpp | 78 ++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) (limited to 'src/core/function/basic/GpgFunctionObject.cpp') diff --git a/src/core/function/basic/GpgFunctionObject.cpp b/src/core/function/basic/GpgFunctionObject.cpp index 242621d2..e31ff2d6 100644 --- a/src/core/function/basic/GpgFunctionObject.cpp +++ b/src/core/function/basic/GpgFunctionObject.cpp @@ -26,4 +26,80 @@ * */ -#include "GpgFunctionObject.h" \ No newline at end of file +#include "GpgFunctionObject.h" + +#include +#include +#include + +#include "function/SecureMemoryAllocator.h" +#include "function/basic/ChannelObject.h" + +struct FunctionObjectTypeLockInfo { + std::map channel_lock_map; + std::mutex type_lock; +}; + +std::mutex g_function_object_mutex_map_lock; +std::map g_function_object_mutex_map; + +namespace GpgFrontend { +auto GetGlobalFunctionObjectChannelLock(const std::type_info& type, int channel) + -> std::mutex& { + std::lock_guard lock_guard(g_function_object_mutex_map_lock); + auto& channel_map = g_function_object_mutex_map[type.hash_code()]; + return channel_map.channel_lock_map[channel]; +} + +auto GetGlobalFunctionObjectTypeLock(const std::type_info& type) + -> std::mutex& { + std::lock_guard lock_guard(g_function_object_mutex_map_lock); + auto& channel_map = g_function_object_mutex_map[type.hash_code()]; + return channel_map.type_lock; +} + +/** + * @brief Get the Instance object + * + * @param channel + * @return T& + */ +auto GetChannelObjectInstance(const std::type_info& type, int channel) + -> ChannelObject* { + SPDLOG_TRACE("try to get instance of type: {} at channel: {}", type.name(), + channel); + + // lock this channel + std::lock_guard guard( + GetGlobalFunctionObjectChannelLock(type, channel)); + + auto* p_storage = + SingletonStorageCollection::GetInstance(false)->GetSingletonStorage(type); + SPDLOG_TRACE("get singleton storage result, p_storage: {}", + static_cast(p_storage)); + + auto* p_pbj = + static_cast(p_storage->FindObjectInChannel(channel)); + SPDLOG_TRACE("find channel object result, channel {}, p_pbj: {}", channel, + static_cast(p_pbj)); + + return p_pbj; +} + +auto CreateChannelObjectInstance(const std::type_info& type, int channel, + SecureUniquePtr channel_object) + -> ChannelObject* { + // lock this channel + std::lock_guard guard( + GetGlobalFunctionObjectChannelLock(type, channel)); + + auto* p_storage = + SingletonStorageCollection::GetInstance(false)->GetSingletonStorage(type); + SPDLOG_TRACE("create channel object, channel {}, type: {}", channel, + type.name()); + + // do create object of this channel + return p_storage->SetObjectInChannel(channel, std::move(channel_object)); +} + +} // namespace GpgFrontend \ No newline at end of file -- cgit v1.2.3