From 6433eebe1e6c1c941747adfe39b6fdb8e0b01f2b Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 31 Jan 2017 15:57:32 +0300 Subject: [PATCH] IdManager fix --- rpcs3/Emu/IdManager.h | 52 +++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 046edd429b..f8d522d2da 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -275,11 +275,13 @@ class idm return nullptr; } - if (const auto ptr = &vec[index]) + auto& data = vec[index]; + + if (data.second) { - if (std::is_same::value || ptr->first.type() == get_type()) + if (std::is_same::value || data.first.type() == get_type()) { - return ptr; + return &data; } } @@ -305,7 +307,11 @@ class idm { // Get object, store it place->second = provider(); - return place; + + if (place->second) + { + return place; + } } return nullptr; @@ -365,15 +371,15 @@ public: // Add a new ID for an object returned by provider() template > - static inline std::shared_ptr import(F&& provider) + static inline u32 import(F&& provider) { if (auto pair = create_id(std::forward(provider))) { id_manager::on_init::func(static_cast(pair->second.get()), pair->second); - return {pair->second, static_cast(pair->second.get())}; + return pair->first; } - return nullptr; + return id_manager::id_traits::invalid; } // Check the ID @@ -386,7 +392,7 @@ public: } // Check the ID, access object under shared lock - template , typename = std::enable_if_t::value>> + template , typename = std::enable_if_t::value>> static inline explicit_bool_t check(u32 id, F&& func, int = 0) { reader_lock lock(id_manager::g_mutex); @@ -403,7 +409,7 @@ public: } // Check the ID, access object under reader lock, propagate return value - template , typename = std::enable_if_t::value>> + template , typename = std::enable_if_t::value>> static inline return_pair check(u32 id, F&& func) { reader_lock lock(id_manager::g_mutex); @@ -435,7 +441,7 @@ public: } // Get the object, access object under reader lock - template , typename = std::enable_if_t::value>> + template , typename = std::enable_if_t::value>> static inline auto get(u32 id, F&& func, int = 0) { using result_type = std::shared_ptr; @@ -457,7 +463,7 @@ public: } // Get the object, access object under reader lock, propagate return value - template , typename = std::enable_if_t::value>> + template , typename = std::enable_if_t::value>> static inline auto get(u32 id, F&& func) { using result_type = return_pair; @@ -721,10 +727,14 @@ public: { ptr = provider(); - pair.first = id_manager::typeinfo::get_stop(); - pair.second = ptr; + if (ptr) + { + pair.first = id_manager::typeinfo::get_stop(); + pair.second = ptr; + } } - else + + if (!ptr) { return nullptr; } @@ -746,10 +756,18 @@ public: auto& pair = g_vec[get_type()]; ptr = provider(); - old = std::move(pair.second); - pair.first = id_manager::typeinfo::get_stop(); - pair.second = ptr; + if (ptr) + { + old = std::move(pair.second); + + pair.first = id_manager::typeinfo::get_stop(); + pair.second = ptr; + } + else + { + return nullptr; + } } if (old)