From 8e7d041d2df3edaf7bbf5a650e199d4182d77100 Mon Sep 17 00:00:00 2001 From: nxtumUbun Date: Thu, 26 Sep 2024 03:27:46 -0700 Subject: [PATCH] return pod of data --- Source/Thunder/Controller.cpp | 13 +++++---- Source/Thunder/PluginHost.cpp | 8 +++--- Source/com/Administrator.cpp | 50 +++++++++++++++++++++++++++++++++++ Source/com/Administrator.h | 36 +++++++------------------ 4 files changed, 70 insertions(+), 37 deletions(-) diff --git a/Source/Thunder/Controller.cpp b/Source/Thunder/Controller.cpp index e41ba97d7..3f90e499f 100644 --- a/Source/Thunder/Controller.cpp +++ b/Source/Thunder/Controller.cpp @@ -1220,7 +1220,7 @@ namespace Plugin { { Core::hresult result = Core::ERROR_UNKNOWN_KEY; - RPC::Administrator::Proxies collection; + RPC::Administrator::ProxyDataVector collection; // Search for the Dangling proxies if (RPC::Administrator::Instance().Allocations(linkId, collection) == true) { @@ -1229,13 +1229,12 @@ namespace Plugin { std::list< IMetadata::Data::Proxy> elements; - for (const ProxyStub::UnknownProxy* proxy : collection) { + for (const auto &proxy : collection) { IMetadata::Data::Proxy data; - data.Instance = proxy->Implementation(); - data.Interface = proxy->InterfaceId(); - data.Count = proxy->ReferenceCount(); - data.Name = proxy->Name(); - + data.Instance = proxy.Instance; + data.Interface = proxy.Interface; + data.Count = proxy.Count; + data.Name = proxy.Name; elements.emplace_back(std::move(data)); } diff --git a/Source/Thunder/PluginHost.cpp b/Source/Thunder/PluginHost.cpp index 307589c5e..6b356ea14 100644 --- a/Source/Thunder/PluginHost.cpp +++ b/Source/Thunder/PluginHost.cpp @@ -712,13 +712,13 @@ POP_WARNING() printf("Link: %s\n", index.Current().Remote.Value().c_str()); printf("------------------------------------------------------------\n"); - RPC::Administrator::Proxies proxies; + RPC::Administrator::ProxyDataVector proxies; RPC::Administrator::Instance().Allocations(index.Current().ID.Value(), proxies); - for (const ProxyStub::UnknownProxy* proxy : proxies) { - Core::instance_id instanceId = proxy->Implementation(); - printf("[%s] InstanceId: 0x%" PRIx64 ", RefCount: %d, InterfaceId %d [0x%X]\n", proxy->Name().c_str(), static_cast(instanceId), proxy->ReferenceCount(), proxy->InterfaceId(), proxy->InterfaceId()); + for (const auto &proxy: proxies) { + Core::instance_id instanceId = proxy.Instance; + printf("[%s] InstanceId: 0x%" PRIx64 ", RefCount: %d, InterfaceId %d [0x%X]\n", proxy.Name.c_str(), static_cast(instanceId), proxy.Count, proxy.Interface, proxy.Interface); } printf("\n"); } diff --git a/Source/com/Administrator.cpp b/Source/com/Administrator.cpp index 8ef34abcc..2fd1386cf 100644 --- a/Source/com/Administrator.cpp +++ b/Source/com/Administrator.cpp @@ -59,6 +59,56 @@ namespace RPC { return (systemAdministrator); } + bool Administrator::Allocations(const uint32_t id, ProxyDataVector& proxies) const { + bool found = false; + + if (id == 0) { + ChannelMap::const_iterator index(_channelProxyMap.begin()); + while (index != _channelProxyMap.end() && (found == false)) { + const auto &temp = index->second; + for (const auto &proxy : temp) { + ProxyData UnknownProxyData; + UnknownProxyData.Name = proxy->Name(); + UnknownProxyData.Instance = proxy->Implementation(); + UnknownProxyData.Interface = proxy->InterfaceId(); + UnknownProxyData.Count = proxy->ReferenceCount(); + proxies.push_back(UnknownProxyData); + } + index++; + } + for (const auto& proxy: _danglingProxies) { + ProxyData UnknownProxyData; + UnknownProxyData.Name = proxy->Name(); + UnknownProxyData.Instance = proxy->Implementation(); + UnknownProxyData.Interface = proxy->InterfaceId(); + UnknownProxyData.Count = proxy->ReferenceCount(); + proxies.push_back(UnknownProxyData); + } + found = true; + } + else { + ChannelMap::const_iterator index(_channelProxyMap.begin()); + while ((found == false) && (index != _channelProxyMap.end())) { + if (index->first != id) { + index++; + } + else { + found = true; + const auto &temp = index->second; + for (const auto &proxy : temp) { + ProxyData UnknownProxyData; + UnknownProxyData.Name = proxy->Name(); + UnknownProxyData.Instance = proxy->Implementation(); + UnknownProxyData.Interface = proxy->InterfaceId(); + UnknownProxyData.Count = proxy->ReferenceCount(); + proxies.push_back(UnknownProxyData); + } + } + } + } + return (found); + } + void Administrator::AddRef(const Core::ProxyType& channel, void* impl, const uint32_t interfaceId) { // stub are loaded before any action is taken and destructed if the process closes down, so no need to lock.. diff --git a/Source/com/Administrator.h b/Source/com/Administrator.h index 30317db4c..3e2602fb2 100644 --- a/Source/com/Administrator.h +++ b/Source/com/Administrator.h @@ -124,7 +124,15 @@ namespace RPC { }; public: + struct ProxyData { + uint32_t Interface; + string Name; + Core::instance_id Instance; + uint32_t Count; + }; + using Proxies = std::vector; + using ProxyDataVector = std::vector; using ChannelMap = std::unordered_map; using ReferenceMap = std::unordered_map >; using Stubs = std::unordered_map; @@ -147,32 +155,8 @@ namespace RPC { void DelegatedReleases(const bool enabled) { _delegatedReleases = enabled; } - bool Allocations(const uint32_t id, Proxies& proxies) const { - bool found = false; - if (id == 0) { - ChannelMap::const_iterator index(_channelProxyMap.begin()); - while (index != _channelProxyMap.end()) { - const auto &temp = index->second; - proxies.insert(proxies.end(), temp.begin(), temp.end()); - index++; - } - proxies.insert(proxies.end(), _danglingProxies.begin(), _danglingProxies.end()); - found = true; - } - else { - ChannelMap::const_iterator index(_channelProxyMap.begin()); - while ((found == false) && (index != _channelProxyMap.end())) { - if (index->first != id) { - index++; - } - else { - found = true; - proxies = index->second; - } - } - } - return (found); - } + + bool Allocations(const uint32_t id, ProxyDataVector& proxies) const; template void Announce()