aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/function/basic/ChannelObject.cpp2
-rw-r--r--src/core/function/basic/ChannelObject.h19
-rw-r--r--src/core/function/basic/GpgFunctionObject.h26
-rw-r--r--src/core/function/basic/SingletonStorage.cpp22
-rw-r--r--src/core/function/basic/SingletonStorage.h7
-rw-r--r--src/core/function/basic/SingletonStorageCollection.cpp14
-rw-r--r--src/core/function/basic/SingletonStorageCollection.h8
7 files changed, 79 insertions, 19 deletions
diff --git a/src/core/function/basic/ChannelObject.cpp b/src/core/function/basic/ChannelObject.cpp
index 9485a278..7a41d4d1 100644
--- a/src/core/function/basic/ChannelObject.cpp
+++ b/src/core/function/basic/ChannelObject.cpp
@@ -34,6 +34,8 @@ ChannelObject::ChannelObject() noexcept = default;
ChannelObject::ChannelObject(int channel) : channel_(channel) {}
+ChannelObject::~ChannelObject() noexcept = default;
+
void ChannelObject::SetChannel(int channel) { this->channel_ = channel; }
auto ChannelObject::GetChannel() const -> int { return channel_; }
diff --git a/src/core/function/basic/ChannelObject.h b/src/core/function/basic/ChannelObject.h
index 9d247e6a..7bbd6d94 100644
--- a/src/core/function/basic/ChannelObject.h
+++ b/src/core/function/basic/ChannelObject.h
@@ -28,6 +28,7 @@
#pragma once
+#include "core/function/SecureMemoryAllocator.h"
namespace GpgFrontend {
static constexpr int kGpgFrontendDefaultChannel =
@@ -46,6 +47,12 @@ class GPGFRONTEND_CORE_EXPORT ChannelObject {
ChannelObject() noexcept;
/**
+ * @brief Destroy the Channel Object object
+ *
+ */
+ virtual ~ChannelObject() noexcept;
+
+ /**
* @brief Construct a new Channel Object object
*
* @param channel
@@ -77,4 +84,16 @@ class GPGFRONTEND_CORE_EXPORT ChannelObject {
int channel_ = kGpgFrontendDefaultChannel; ///< The channel id
};
+template <typename Derived>
+auto ConvertToChannelObjectPtr(
+ std::unique_ptr<Derived, SecureObjectDeleter<Derived>> derivedPtr)
+ -> std::unique_ptr<ChannelObject, SecureObjectDeleter<ChannelObject>> {
+ static_assert(std::is_base_of_v<ChannelObject, Derived>,
+ "Derived must be a subclass of ChannelObject");
+
+ ChannelObject* base_ptr = derivedPtr.release();
+ return std::unique_ptr<ChannelObject, SecureObjectDeleter<ChannelObject>>(
+ base_ptr);
+}
+
} // namespace GpgFrontend \ No newline at end of file
diff --git a/src/core/function/basic/GpgFunctionObject.h b/src/core/function/basic/GpgFunctionObject.h
index 59bc5715..ec0cebac 100644
--- a/src/core/function/basic/GpgFunctionObject.h
+++ b/src/core/function/basic/GpgFunctionObject.h
@@ -31,6 +31,8 @@
#include "core/function/basic/ChannelObject.h"
#include "core/function/basic/SingletonStorage.h"
#include "core/function/basic/SingletonStorageCollection.h"
+#include "core/utils/MemoryUtils.h"
+#include "spdlog/spdlog.h"
namespace GpgFrontend {
@@ -67,6 +69,9 @@ class SingletonFunctionObject : public ChannelObject {
static std::mutex g_channel_mutex_map_lock;
static std::map<int, std::mutex> g_channel_mutex_map;
+ SPDLOG_TRACE("try to get instance of type: {} at channel: {}",
+ typeid(T).name(), channel);
+
{
std::lock_guard<std::mutex> guard(g_channel_mutex_map_lock);
if (g_channel_mutex_map.find(channel) == g_channel_mutex_map.end()) {
@@ -80,9 +85,17 @@ class SingletonFunctionObject : public ChannelObject {
auto* p_storage =
SingletonStorageCollection::GetInstance(false)->GetSingletonStorage(
typeid(T));
+ SPDLOG_TRACE("get singleton storage result, p_storage: {}",
+ static_cast<void*>(p_storage));
+
auto* p_pbj = static_cast<T*>(p_storage->FindObjectInChannel(channel));
+ SPDLOG_TRACE("find channel object result, channel {}, p_pbj: {}", channel,
+ static_cast<void*>(p_pbj));
if (p_pbj == nullptr) {
+ SPDLOG_TRACE("create channel object, channel {}, type: {}", channel,
+ typeid(T).name());
+
// lock this channel
std::lock_guard<std::mutex> guard(g_channel_mutex_map[channel]);
@@ -93,7 +106,8 @@ class SingletonFunctionObject : public ChannelObject {
}
// do create object of this channel
- auto new_obj = std::unique_ptr<ChannelObject>(new T(channel));
+ auto new_obj =
+ ConvertToChannelObjectPtr<>(SecureCreateUniqueObject<T>(channel));
return *static_cast<T*>(
p_storage->SetObjectInChannel(channel, std::move(new_obj)));
}
@@ -108,19 +122,23 @@ class SingletonFunctionObject : public ChannelObject {
* @return T&
*/
static auto CreateInstance(
- int channel,
- const std::function<std::unique_ptr<ChannelObject>(void)>& factory)
- -> T& {
+ int channel, const std::function<ChannelObjectPtr(void)>& factory) -> T& {
static_assert(std::is_base_of<SingletonFunctionObject<T>, T>::value,
"T not derived from SingletonFunctionObject<T>");
auto* p_storage =
SingletonStorageCollection::GetInstance(false)->GetSingletonStorage(
typeid(T));
+ SPDLOG_TRACE("get singleton storage result, p_storage: {}",
+ static_cast<void*>(p_storage));
auto p_pbj = static_cast<T*>(p_storage->FindObjectInChannel(channel));
+ SPDLOG_TRACE("find channel object result, channel {}, p_pbj: {}", channel,
+ static_cast<void*>(p_pbj));
if (p_pbj == nullptr) {
+ SPDLOG_TRACE("create channel object, channel {}, type: {}", channel,
+ typeid(T).name());
return *static_cast<T*>(
p_storage->SetObjectInChannel(channel, factory()));
}
diff --git a/src/core/function/basic/SingletonStorage.cpp b/src/core/function/basic/SingletonStorage.cpp
index 567d3572..a067090e 100644
--- a/src/core/function/basic/SingletonStorage.cpp
+++ b/src/core/function/basic/SingletonStorage.cpp
@@ -52,6 +52,7 @@ class SingletonStorage::Impl {
std::shared_lock<std::shared_mutex> lock(instances_mutex_);
ins_it = instances_map_.find(channel);
if (ins_it == instances_map_.end()) {
+ SPDLOG_TRACE("cannot find channel object, channel :{}", channel);
return nullptr;
}
return ins_it->second.get();
@@ -67,28 +68,34 @@ class SingletonStorage::Impl {
return channels;
}
- auto SetObjectInChannel(int channel, std::unique_ptr<ChannelObject> p_obj)
+ auto SetObjectInChannel(int channel, ChannelObjectPtr p_obj)
-> GpgFrontend::ChannelObject* {
{
- SPDLOG_TRACE("set channel: {} instance address: {}", channel,
- static_cast<void*>(&instances_map_));
+ SPDLOG_TRACE("set channel: {}, channel object address: {}", channel,
+ static_cast<void*>(p_obj.get()));
assert(p_obj != nullptr);
- if (p_obj == nullptr) return nullptr;
+ if (p_obj == nullptr) {
+ return nullptr;
+ }
- auto* raw_obj = p_obj.get();
p_obj->SetChannel(channel);
+ auto* raw_obj = p_obj.get();
{
std::unique_lock<std::shared_mutex> lock(instances_mutex_);
instances_map_.insert({channel, std::move(p_obj)});
}
+
+ SPDLOG_TRACE(
+ "set channel: {} success, current channel object address: {}",
+ channel, static_cast<void*>(raw_obj));
return raw_obj;
}
}
private:
std::shared_mutex instances_mutex_; ///< mutex for _instances_map
- std::map<int, std::unique_ptr<ChannelObject>>
+ std::map<int, ChannelObjectPtr>
instances_map_; ///< map of singleton instances
};
@@ -109,8 +116,7 @@ auto SingletonStorage::GetAllChannelId() -> std::vector<int> {
return p_->GetAllChannelId();
}
-auto SingletonStorage::SetObjectInChannel(int channel,
- std::unique_ptr<ChannelObject> p_obj)
+auto SingletonStorage::SetObjectInChannel(int channel, ChannelObjectPtr p_obj)
-> GpgFrontend::ChannelObject* {
return p_->SetObjectInChannel(channel, std::move(p_obj));
}
diff --git a/src/core/function/basic/SingletonStorage.h b/src/core/function/basic/SingletonStorage.h
index 04fb2f07..e678fe44 100644
--- a/src/core/function/basic/SingletonStorage.h
+++ b/src/core/function/basic/SingletonStorage.h
@@ -28,10 +28,15 @@
#pragma once
+#include "core/function/SecureMemoryAllocator.h"
+
namespace GpgFrontend {
class ChannelObject;
+using ChannelObjectPtr =
+ std::unique_ptr<ChannelObject, SecureObjectDeleter<ChannelObject>>;
+
class GPGFRONTEND_CORE_EXPORT SingletonStorage {
public:
/**
@@ -75,7 +80,7 @@ class GPGFRONTEND_CORE_EXPORT SingletonStorage {
* @param p_obj
* @return T*
*/
- auto SetObjectInChannel(int channel, std::unique_ptr<ChannelObject> p_obj)
+ auto SetObjectInChannel(int channel, ChannelObjectPtr p_obj)
-> ChannelObject*;
private:
diff --git a/src/core/function/basic/SingletonStorageCollection.cpp b/src/core/function/basic/SingletonStorageCollection.cpp
index a5eb1dc0..144b69e2 100644
--- a/src/core/function/basic/SingletonStorageCollection.cpp
+++ b/src/core/function/basic/SingletonStorageCollection.cpp
@@ -31,6 +31,7 @@
#include <shared_mutex>
#include "core/function/basic/SingletonStorage.h"
+#include "core/utils/MemoryUtils.h"
namespace GpgFrontend {
@@ -46,7 +47,7 @@ class SingletonStorageCollection::Impl {
if (force_refresh || instance == nullptr) {
instance = new SingletonStorageCollection();
- SPDLOG_DEBUG("new single storage collection created: {}",
+ SPDLOG_TRACE("new single storage collection created: {}",
static_cast<void*>(instance));
}
@@ -69,12 +70,15 @@ class SingletonStorageCollection::Impl {
ins_it = storages_map_.find(hash);
}
if (ins_it == storages_map_.end()) {
+ auto storage = SecureCreateUniqueObject<SingletonStorage>();
+ SPDLOG_TRACE(
+ "hash: {} created, singleton storage address: {} type_name: {}",
+ hash, static_cast<void*>(storage.get()), type_id.name());
+
{
std::unique_lock<std::shared_mutex> lock(storages_mutex_);
- storages_map_.insert({hash, std::make_unique<SingletonStorage>()});
+ storages_map_.insert({hash, std::move(storage)});
}
- SPDLOG_TRACE("hash: {} created, storage address: {} type_name: {}",
- hash, static_cast<void*>(&storages_map_), type_id.name());
continue;
}
return ins_it->second.get();
@@ -83,7 +87,7 @@ class SingletonStorageCollection::Impl {
private:
std::shared_mutex storages_mutex_; ///< mutex for storages_map_
- std::map<size_t, std::unique_ptr<SingletonStorage>> storages_map_;
+ std::map<size_t, SingletonStoragePtr> storages_map_;
};
SingletonStorageCollection::SingletonStorageCollection() noexcept
diff --git a/src/core/function/basic/SingletonStorageCollection.h b/src/core/function/basic/SingletonStorageCollection.h
index 16a72fd4..b96bff3d 100644
--- a/src/core/function/basic/SingletonStorageCollection.h
+++ b/src/core/function/basic/SingletonStorageCollection.h
@@ -28,10 +28,16 @@
#pragma once
-namespace GpgFrontend {
+#include <core/function/SecureMemoryAllocator.h>
+
+#include "core/function/SecureMemoryAllocator.h"
+namespace GpgFrontend {
class SingletonStorage;
+using SingletonStoragePtr =
+ std::unique_ptr<SingletonStorage, SecureObjectDeleter<SingletonStorage>>;
+
class GPGFRONTEND_CORE_EXPORT SingletonStorageCollection {
public:
/**