From a70d3058069ef80b8c7e3a85a9e6655f89b18e7c Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 28 May 2015 22:13:35 +0300 Subject: [PATCH] IdManager fix --- rpcs3/Emu/IdManager.h | 17 +++++------------ rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules/cellDmux.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp | 4 ++-- rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp | 4 ++-- rpcs3/Emu/SysCalls/lv2/sys_event.cpp | 4 ++-- rpcs3/Emu/SysCalls/lv2/sys_fs.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_prx.cpp | 4 ++-- 9 files changed, 20 insertions(+), 27 deletions(-) diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 4c92bffc10..6cee9d4bfc 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -23,15 +23,8 @@ public: const std::type_info& info; const u32 type; - template ID_data_t(u32 type, Args&&... args) // doesn't work - : data(std::make_shared(args...)) - , info(typeid(T)) - , type(type) - { - } - - template ID_data_t(const std::shared_ptr& data, u32 type) - : data(data) + template force_inline ID_data_t(std::shared_ptr data, u32 type) + : data(std::move(data)) , info(typeid(T)) , type(type) { @@ -42,7 +35,7 @@ public: ID_data_t& operator =(const ID_data_t& right) = delete; ID_data_t(ID_data_t&& right) - : data(right.data) + : data(std::move(const_cast&>(right.data))) , info(right.info) , type(right.type) { @@ -95,11 +88,11 @@ public: } // add new ID using existing std::shared_ptr (not recommended, use make() instead) - template u32 add(const std::shared_ptr& data, u32 type = ID_type::type) + template u32 add(std::shared_ptr data, u32 type = ID_type::type) { std::lock_guard lock(m_mutex); - m_id_map.emplace(m_cur_id, ID_data_t(data, type)); + m_id_map.emplace(m_cur_id, ID_data_t(std::move(data), type)); return m_cur_id++; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 1d0e29301d..e857e9acf8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -763,12 +763,12 @@ s32 cellAudioCreateNotifyEventQueue(vm::ptr id, vm::ptr key) { const u64 key_value = 0x80004d494f323221ull + k; - const auto queue = std::make_shared(SYS_SYNC_FIFO, SYS_PPU_QUEUE, 0, key_value, 32); + auto queue = std::make_shared(SYS_SYNC_FIFO, SYS_PPU_QUEUE, 0, key_value, 32); // register key if not used yet if (Emu.GetEventManager().RegisterKey(queue)) { - *id = Emu.GetIdManager().add(queue); + *id = Emu.GetIdManager().add(std::move(queue)); *key = key_value; return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index c8cd59643e..7bb177751f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -998,9 +998,9 @@ s32 cellDmuxEnableEs(u32 handle, vm::ptr esFilterId, // TODO: check esFilterId, esResourceInfo, esCb and esSpecificInfo correctly - std::shared_ptr es(new ElementaryStream(dmux.get(), esResourceInfo->memAddr, esResourceInfo->memSize, + auto es = std::make_shared(dmux.get(), esResourceInfo->memAddr, esResourceInfo->memSize, esFilterId->filterIdMajor, esFilterId->filterIdMinor, esFilterId->supplementalInfo1, esFilterId->supplementalInfo2, - esCb->cbEsMsgFunc, esCb->cbArg, esSpecificInfo)); + esCb->cbEsMsgFunc, esCb->cbArg, esSpecificInfo); u32 id = Emu.GetIdManager().add(es); es->id = id; diff --git a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp index b57d667844..352cedc091 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp @@ -34,7 +34,7 @@ s32 cellGifDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr current_subHandle(new CellGifDecSubHandle); + auto current_subHandle = std::make_shared(); current_subHandle->fd = 0; current_subHandle->src = *src; @@ -57,7 +57,7 @@ s32 cellGifDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr subHandle, vm::ptr current_subHandle(new CellJpgDecSubHandle); + auto current_subHandle = std::make_shared(); current_subHandle->fd = 0; current_subHandle->src = *src; @@ -63,7 +63,7 @@ s32 cellJpgDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr taskset, u32 taskID); s32 spursCreateLv2EventQueue(vm::ptr spurs, u32& queue_id, vm::ptr port, s32 size, u64 name_u64) { - const auto queue = Emu.GetEventManager().MakeEventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, name_u64, 0, size); + auto queue = Emu.GetEventManager().MakeEventQueue(SYS_SYNC_FIFO, SYS_PPU_QUEUE, name_u64, 0, size); if (!queue) // rough { return CELL_EAGAIN; } - queue_id = Emu.GetIdManager().add(queue); + queue_id = Emu.GetIdManager().add(std::move(queue)); if (s32 res = spursAttachLv2EventQueue(spurs, queue_id, port, 1, true)) { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp index 3cc24797b3..ab64c03805 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp @@ -40,14 +40,14 @@ s32 sys_event_queue_create(vm::ptr equeue_id, vm::ptr default: sys_event.Error("sys_event_queue_create(): unknown type (0x%x)", type); return CELL_EINVAL; } - const auto queue = Emu.GetEventManager().MakeEventQueue(protocol, type, attr->name_u64, event_queue_key, size); + auto queue = Emu.GetEventManager().MakeEventQueue(protocol, type, attr->name_u64, event_queue_key, size); if (!queue) { return CELL_EEXIST; } - *equeue_id = Emu.GetIdManager().add(queue); + *equeue_id = Emu.GetIdManager().add(std::move(queue)); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_fs.cpp b/rpcs3/Emu/SysCalls/lv2/sys_fs.cpp index 3f96aa2e93..fad6fe9c17 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_fs.cpp @@ -183,7 +183,7 @@ s32 sys_fs_opendir(vm::ptr path, vm::ptr fd) return CELL_FS_ENOENT; } - *fd = Emu.GetIdManager().add(directory); + *fd = Emu.GetIdManager().add(std::move(directory)); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp index 057bf52270..4ea2e5f284 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp @@ -32,7 +32,7 @@ s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptr prx(new lv2_prx_t()); + std::shared_ptr prx = std::make_shared(); prx->size = (u32)f.GetSize(); prx->address = (u32)Memory.Alloc(prx->size, 4); prx->path = (const char*)path; @@ -40,7 +40,7 @@ s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptraddress), prx->size); - return Emu.GetIdManager().add(prx); + return Emu.GetIdManager().add(std::move(prx)); } s32 sys_prx_load_module_on_memcontainer()