From 0d7b09003204671286b4a6bc2054bee6c32610e8 Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Wed, 5 Jul 2023 13:08:13 +0300 Subject: [PATCH] [orbis-kernel] Implement utils::kstring --- orbis-kernel/include/orbis/KernelAllocator.hpp | 2 ++ orbis-kernel/include/orbis/KernelContext.hpp | 4 ++-- orbis-kernel/include/orbis/module/Module.hpp | 6 +++--- orbis-kernel/src/module.cpp | 3 ++- rpcsx-os/io-device.cpp | 2 +- rpcsx-os/linker.cpp | 2 +- rpcsx-os/ops.cpp | 14 +++++++------- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/orbis-kernel/include/orbis/KernelAllocator.hpp b/orbis-kernel/include/orbis/KernelAllocator.hpp index 4d372bb..852dbce 100644 --- a/orbis-kernel/include/orbis/KernelAllocator.hpp +++ b/orbis-kernel/include/orbis/KernelAllocator.hpp @@ -2,6 +2,7 @@ #include "utils/Rc.hpp" #include +#include #include #include #include @@ -31,6 +32,7 @@ template struct kallocator { } }; +using kstring = std::basic_string, kallocator>; template using kvector = std::vector>; template using kdeque = std::deque>; template > diff --git a/orbis-kernel/include/orbis/KernelContext.hpp b/orbis-kernel/include/orbis/KernelContext.hpp index a32496a..2427338 100644 --- a/orbis-kernel/include/orbis/KernelContext.hpp +++ b/orbis-kernel/include/orbis/KernelContext.hpp @@ -24,7 +24,7 @@ public: std::size_t align = __STDCPP_DEFAULT_NEW_ALIGNMENT__); static void kfree(void *ptr, std::size_t size); - std::pair createEventFlag(std::string name, std::int32_t flags) { + std::pair createEventFlag(utils::kstring name, std::int32_t flags) { auto [it, inserted] = m_event_flags.try_emplace(std::move(name), knew(flags)); return { it->second.get(), inserted }; } @@ -40,7 +40,7 @@ public: private: mutable shared_mutex m_proc_mtx; utils::LinkedNode *m_processes = nullptr; - kmap> m_event_flags; + utils::kmap> m_event_flags; struct node { std::size_t size; diff --git a/orbis-kernel/include/orbis/module/Module.hpp b/orbis-kernel/include/orbis/module/Module.hpp index 933765c..aa4bd49 100644 --- a/orbis-kernel/include/orbis/module/Module.hpp +++ b/orbis-kernel/include/orbis/module/Module.hpp @@ -16,7 +16,7 @@ struct Thread; struct Process; struct ModuleNeeded { - std::string name; + utils::kstring name; std::uint16_t version; std::uint16_t attr; bool isExport; @@ -68,7 +68,7 @@ struct Relocation { struct Module final { Process *proc{}; - std::string vfsPath; + utils::kstring vfsPath; char moduleName[256]{}; char soName[256]{}; ModuleHandle id{}; @@ -116,7 +116,7 @@ struct Module final { utils::kvector neededLibraries; utils::kvector> importedModules; utils::kvector> namespaceModules; - utils::kvector needed; + utils::kvector needed; std::atomic references{0}; unsigned _total_size = 0; diff --git a/orbis-kernel/src/module.cpp b/orbis-kernel/src/module.cpp index 731ebcc..2aef3a3 100644 --- a/orbis-kernel/src/module.cpp +++ b/orbis-kernel/src/module.cpp @@ -1,4 +1,5 @@ #include "module/Module.hpp" +#include "KernelAllocator.hpp" #include "thread.hpp" #include @@ -108,7 +109,7 @@ static orbis::SysResult doRelocation(orbis::Process *process, return std::pair(defModule.get(), defSym.address); } - foundInLibs.push_back(defLib.name); + foundInLibs.emplace_back(std::string_view(defLib.name)); } for (auto nsDefModule : defModule->namespaceModules) { diff --git a/rpcsx-os/io-device.cpp b/rpcsx-os/io-device.cpp index c3b4bab..f70c20d 100644 --- a/rpcsx-os/io-device.cpp +++ b/rpcsx-os/io-device.cpp @@ -19,7 +19,7 @@ void io_device_instance_init(IoDevice *device, IoDeviceInstance *instance) { } struct HostIoDevice : IoDevice { - std::string hostPath; + orbis::utils::kstring hostPath; }; struct HostIoDeviceInstance : IoDeviceInstance { diff --git a/rpcsx-os/linker.cpp b/rpcsx-os/linker.cpp index 2c864ed..bd936e7 100644 --- a/rpcsx-os/linker.cpp +++ b/rpcsx-os/linker.cpp @@ -588,7 +588,7 @@ Ref rx::linker::loadModule(std::span image, } else { name = patchSoName(name); if (name != "libSceFreeTypeOptBm") { // TODO - result->needed.push_back(std::string(name)); + result->needed.emplace_back(name); result->needed.back() += ".prx"; } } diff --git a/rpcsx-os/ops.cpp b/rpcsx-os/ops.cpp index 5ca73fc..76c2f8e 100644 --- a/rpcsx-os/ops.cpp +++ b/rpcsx-os/ops.cpp @@ -453,14 +453,14 @@ orbis::SysResult exit(orbis::Thread *thread, orbis::sint status) { SysResult processNeeded(Thread *thread) { while (true) { - std::set allNeededObjects; + std::set> allNeededObjects; auto proc = thread->tproc; - std::map loadedModules; - std::map loadedObjects; + std::map> loadedModules; + std::map> loadedObjects; for (auto [id, module] : proc->modulesMap) { for (const auto &object : module->needed) { - allNeededObjects.insert(object); + allNeededObjects.emplace(object.begin(), object.end()); } loadedModules[module->moduleName] = module; @@ -509,9 +509,9 @@ SysResult processNeeded(Thread *thread) { module->importedModules.clear(); module->importedModules.reserve(module->neededModules.size()); for (auto mod : module->neededModules) { - if (auto it = loadedModules.find(mod.name); + if (auto it = loadedModules.find(std::string_view(mod.name)); it != loadedModules.end()) { - module->importedModules.push_back(loadedModules.at(mod.name)); + module->importedModules.emplace_back(it->second); continue; } @@ -530,7 +530,7 @@ SysResult processNeeded(Thread *thread) { SysResult registerEhFrames(Thread *thread) { for (auto [id, module] : thread->tproc->modulesMap) { - if (module->ehFrame != nullptr) { + if (module->ehFrame != nullptr) { __register_frame(module->ehFrame); } }