Removed std::enable_shared_from_this

Minor ID manager refactoring
This commit is contained in:
Nekotekina 2016-07-24 02:56:03 +03:00
parent 09ae45c566
commit 7ccdea7822
10 changed files with 41 additions and 42 deletions

View File

@ -2238,18 +2238,18 @@ std::string named_thread::get_name() const
return fmt::format("('%s') Unnamed Thread", typeid(*this).name()); return fmt::format("('%s') Unnamed Thread", typeid(*this).name());
} }
void named_thread::start() void named_thread::start_thread(const std::shared_ptr<void>& _this)
{ {
// Get shared_ptr instance (will throw if called from the constructor or the object has been created incorrectly) // Ensure it's not called from the constructor and the correct object is passed
auto&& ptr = shared_from_this(); ENSURES(_this.get() == this);
// Run thread // Run thread
m_thread = thread_ctrl::spawn(get_name(), [thread = std::move(ptr)]() m_thread = thread_ctrl::spawn(get_name(), [this, _this]()
{ {
try try
{ {
LOG_TRACE(GENERAL, "Thread started"); LOG_TRACE(GENERAL, "Thread started");
thread->on_task(); on_task();
LOG_TRACE(GENERAL, "Thread ended"); LOG_TRACE(GENERAL, "Thread ended");
} }
catch (const std::exception& e) catch (const std::exception& e)
@ -2262,6 +2262,6 @@ void named_thread::start()
LOG_NOTICE(GENERAL, "Thread aborted"); LOG_NOTICE(GENERAL, "Thread aborted");
} }
thread->on_exit(); on_exit();
}); });
} }

View File

@ -312,7 +312,7 @@ public:
} }
}; };
class named_thread : public std::enable_shared_from_this<named_thread> class named_thread
{ {
// Pointer to managed resource (shared with actual thread) // Pointer to managed resource (shared with actual thread)
std::shared_ptr<thread_ctrl> m_thread; std::shared_ptr<thread_ctrl> m_thread;
@ -329,8 +329,8 @@ public:
virtual std::string get_name() const; virtual std::string get_name() const;
protected: protected:
// Start thread (cannot be called from the constructor: should throw bad_weak_ptr in such case) // Start thread (cannot be called from the constructor: should throw in such case)
void start(); void start_thread(const std::shared_ptr<void>& _this);
// Thread task (called in the thread) // Thread task (called in the thread)
virtual void on_task() = 0; virtual void on_task() = 0;
@ -340,9 +340,9 @@ protected:
public: public:
// ID initialization // ID initialization
virtual void on_init() virtual void on_init(const std::shared_ptr<void>& _this)
{ {
start(); return start_thread(_this);
} }
// ID finalization // ID finalization

View File

@ -24,7 +24,7 @@ void RawSPUThread::cpu_task()
npc = pc | ((ch_event_stat & SPU_EVENT_INTR_ENABLED) != 0); npc = pc | ((ch_event_stat & SPU_EVENT_INTR_ENABLED) != 0);
} }
void RawSPUThread::on_init() void RawSPUThread::on_init(const std::shared_ptr<void>& _this)
{ {
if (!offset) if (!offset)
{ {
@ -33,7 +33,7 @@ void RawSPUThread::on_init()
const_cast<u32&>(offset) = vm::falloc(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index, 0x40000); const_cast<u32&>(offset) = vm::falloc(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index, 0x40000);
VERIFY(offset); VERIFY(offset);
SPUThread::on_init(); SPUThread::on_init(_this);
} }
} }

View File

@ -14,7 +14,7 @@ public:
static constexpr u32 id_min = 0; static constexpr u32 id_min = 0;
static constexpr u32 id_max = 4; static constexpr u32 id_max = 4;
void on_init() override; void on_init(const std::shared_ptr<void>&) override;
RawSPUThread(const std::string& name); RawSPUThread(const std::string& name);

View File

@ -23,7 +23,7 @@ void lv2_cond_t::notify(lv2_lock_t, cpu_thread* thread)
} }
else else
{ {
mutex->owner = std::static_pointer_cast<cpu_thread>(thread->shared_from_this()); mutex->owner = idm::get<PPUThread>(thread->id);
VERIFY(!thread->state.test_and_set(cpu_state::signal)); VERIFY(!thread->state.test_and_set(cpu_state::signal));
(*thread)->notify(); (*thread)->notify();
@ -212,7 +212,7 @@ s32 sys_cond_wait(PPUThread& ppu, u32 cond_id, u64 timeout)
// try to reown mutex and exit if timed out // try to reown mutex and exit if timed out
if (!cond->mutex->owner) if (!cond->mutex->owner)
{ {
cond->mutex->owner = std::static_pointer_cast<cpu_thread>(ppu.shared_from_this()); cond->mutex->owner = idm::get<PPUThread>(ppu.id);
break; break;
} }

View File

@ -18,7 +18,7 @@ void lv2_mutex_t::unlock(lv2_lock_t)
if (sq.size()) if (sq.size())
{ {
// pick new owner; protocol is ignored in current implementation // pick new owner; protocol is ignored in current implementation
owner = std::static_pointer_cast<cpu_thread>(sq.front()->shared_from_this()); owner = idm::get<PPUThread>(sq.front()->id);
VERIFY(!owner->state.test_and_set(cpu_state::signal)); VERIFY(!owner->state.test_and_set(cpu_state::signal));
(*owner)->notify(); (*owner)->notify();
@ -127,7 +127,7 @@ s32 sys_mutex_lock(PPUThread& ppu, u32 mutex_id, u64 timeout)
// lock immediately if not locked // lock immediately if not locked
if (!mutex->owner) if (!mutex->owner)
{ {
mutex->owner = std::static_pointer_cast<cpu_thread>(ppu.shared_from_this()); mutex->owner = idm::get<PPUThread>(ppu.id);
return CELL_OK; return CELL_OK;
} }
@ -202,7 +202,7 @@ s32 sys_mutex_trylock(PPUThread& ppu, u32 mutex_id)
} }
// own the mutex if free // own the mutex if free
mutex->owner = std::static_pointer_cast<cpu_thread>(ppu.shared_from_this()); mutex->owner = idm::get<PPUThread>(ppu.id);
return CELL_OK; return CELL_OK;
} }

View File

@ -16,7 +16,7 @@ void lv2_rwlock_t::notify_all(lv2_lock_t)
// pick a new writer if possible; protocol is ignored in current implementation // pick a new writer if possible; protocol is ignored in current implementation
if (!readers && !writer && wsq.size()) if (!readers && !writer && wsq.size())
{ {
writer = std::static_pointer_cast<cpu_thread>(wsq.front()->shared_from_this()); writer = idm::get<PPUThread>(wsq.front()->id);
VERIFY(!writer->state.test_and_set(cpu_state::signal)); VERIFY(!writer->state.test_and_set(cpu_state::signal));
(*writer)->notify(); (*writer)->notify();
@ -221,7 +221,7 @@ s32 sys_rwlock_wlock(PPUThread& ppu, u32 rw_lock_id, u64 timeout)
if (!rwlock->readers && !rwlock->writer) if (!rwlock->readers && !rwlock->writer)
{ {
rwlock->writer = std::static_pointer_cast<cpu_thread>(ppu.shared_from_this()); rwlock->writer = idm::get<PPUThread>(ppu.id);
return CELL_OK; return CELL_OK;
} }
@ -293,7 +293,7 @@ s32 sys_rwlock_trywlock(PPUThread& ppu, u32 rw_lock_id)
return CELL_EBUSY; return CELL_EBUSY;
} }
rwlock->writer = std::static_pointer_cast<cpu_thread>(ppu.shared_from_this()); rwlock->writer = idm::get<PPUThread>(ppu.id);
return CELL_OK; return CELL_OK;
} }

View File

@ -35,7 +35,7 @@ namespace id_manager
template<typename T, typename = void> template<typename T, typename = void>
struct on_init struct on_init
{ {
static inline void func(T*) static inline void func(T*, const std::shared_ptr<void>&)
{ {
// Forbid forward declarations // Forbid forward declarations
static constexpr auto size = sizeof(std::conditional_t<std::is_void<T>::value, void*, T>); static constexpr auto size = sizeof(std::conditional_t<std::is_void<T>::value, void*, T>);
@ -43,11 +43,11 @@ namespace id_manager
}; };
template<typename T> template<typename T>
struct on_init<T, decltype(std::declval<T>().on_init())> struct on_init<T, decltype(std::declval<T>().on_init(std::declval<const std::shared_ptr<void>&>()))>
{ {
static inline void func(T* ptr) static inline void func(T* ptr, const std::shared_ptr<void>&_ptr)
{ {
if (ptr) ptr->on_init(); if (ptr) ptr->on_init(_ptr);
} }
}; };
@ -87,7 +87,6 @@ namespace id_manager
static u32 add_type(); static u32 add_type();
public: public:
void(*on_init)(void*) = nullptr;
void(*on_stop)(void*) = nullptr; void(*on_stop)(void*) = nullptr;
// Get type index // Get type index
@ -101,10 +100,7 @@ namespace id_manager
template<typename T> template<typename T>
static inline void update() static inline void update()
{ {
auto& info = access()[get_index<T>()]; access()[get_index<T>()].on_stop = [](void* ptr) { return_ id_manager::on_stop<T>::func(static_cast<T*>(ptr)); };
info.on_init = [](void* ptr) { return_ id_manager::on_init<T>::func(static_cast<T*>(ptr)); };
info.on_stop = [](void* ptr) { return_ id_manager::on_stop<T>::func(static_cast<T*>(ptr)); };
} }
// Read all registered types // Read all registered types
@ -251,7 +247,7 @@ public:
{ {
if (auto pair = create_id<T>(WRAP_EXPR(std::make_shared<Make>(std::forward<Args>(args)...)))) if (auto pair = create_id<T>(WRAP_EXPR(std::make_shared<Make>(std::forward<Args>(args)...))))
{ {
id_manager::on_init<T>::func(static_cast<T*>(pair->second.get())); id_manager::on_init<T>::func(static_cast<T*>(pair->second.get()), pair->second);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
return{ pair->second, static_cast<T*>(pair->second.get()) }; return{ pair->second, static_cast<T*>(pair->second.get()) };
} }
@ -265,7 +261,7 @@ public:
{ {
if (auto pair = create_id<T>(WRAP_EXPR(std::make_shared<Make>(std::forward<Args>(args)...)))) if (auto pair = create_id<T>(WRAP_EXPR(std::make_shared<Make>(std::forward<Args>(args)...))))
{ {
id_manager::on_init<T>::func(static_cast<T*>(pair->second.get())); id_manager::on_init<T>::func(static_cast<T*>(pair->second.get()), pair->second);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
return pair->first; return pair->first;
} }
@ -279,7 +275,7 @@ public:
{ {
if (auto pair = create_id<T>(WRAP_EXPR(ptr))) if (auto pair = create_id<T>(WRAP_EXPR(ptr)))
{ {
id_manager::on_init<T>::func(static_cast<T*>(pair->second.get())); id_manager::on_init<T>::func(static_cast<T*>(pair->second.get()), pair->second);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
return pair->first; return pair->first;
} }
@ -293,7 +289,7 @@ public:
{ {
if (auto pair = create_id<T>(std::forward<F>(provider))) if (auto pair = create_id<T>(std::forward<F>(provider)))
{ {
id_manager::on_init<T>::func(static_cast<T*>(pair->second.get())); id_manager::on_init<T>::func(static_cast<T*>(pair->second.get()), pair->second);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
return { pair->second, static_cast<T*>(pair->second.get()) }; return { pair->second, static_cast<T*>(pair->second.get()) };
} }
@ -477,7 +473,7 @@ public:
if (ptr) if (ptr)
{ {
id_manager::on_init<T>::func(ptr.get()); id_manager::on_init<T>::func(ptr.get(), ptr);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
} }
@ -506,7 +502,7 @@ public:
id_manager::on_stop<T>::func(static_cast<T*>(old.get())); id_manager::on_stop<T>::func(static_cast<T*>(old.get()));
} }
id_manager::on_init<T>::func(ptr.get()); id_manager::on_init<T>::func(ptr.get(), ptr);
return ptr; return ptr;
} }
@ -530,7 +526,7 @@ public:
if (ptr) if (ptr)
{ {
id_manager::on_init<T>::func(ptr.get()); id_manager::on_init<T>::func(ptr.get(), ptr);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
} }
@ -559,7 +555,7 @@ public:
id_manager::on_stop<T>::func(static_cast<T*>(old.get())); id_manager::on_stop<T>::func(static_cast<T*>(old.get()));
} }
id_manager::on_init<T>::func(ptr.get()); id_manager::on_init<T>::func(ptr.get(), ptr);
return ptr; return ptr;
} }
@ -585,7 +581,7 @@ public:
} }
} }
id_manager::on_init<T>::func(ptr.get()); id_manager::on_init<T>::func(ptr.get(), ptr);
id_manager::on_stop<T>::func(nullptr); id_manager::on_stop<T>::func(nullptr);
return ptr; return ptr;
} }

View File

@ -2,6 +2,7 @@
#include "Utilities/Config.h" #include "Utilities/Config.h"
#include "Emu/Memory/Memory.h" #include "Emu/Memory/Memory.h"
#include "Emu/System.h" #include "Emu/System.h"
#include "Emu/IdManager.h"
#include "RSXThread.h" #include "RSXThread.h"
#include "Emu/Cell/PPUCallback.h" #include "Emu/Cell/PPUCallback.h"
@ -14,6 +15,8 @@
#include <thread> #include <thread>
class GSRender;
#define CMD_DEBUG 0 #define CMD_DEBUG 0
cfg::bool_entry g_cfg_rsx_write_color_buffers(cfg::root.video, "Write Color Buffers"); cfg::bool_entry g_cfg_rsx_write_color_buffers(cfg::root.video, "Write Color Buffers");
@ -881,7 +884,7 @@ namespace rsx
m_used_gcm_commands.clear(); m_used_gcm_commands.clear();
on_init_rsx(); on_init_rsx();
start(); start_thread(fxm::get<GSRender>());
} }
GcmTileInfo *thread::find_tile(u32 offset, u32 location) GcmTileInfo *thread::find_tile(u32 offset, u32 location)

View File

@ -274,7 +274,7 @@ namespace rsx
public: public:
virtual std::string get_name() const override; virtual std::string get_name() const override;
virtual void on_init() override {} // disable start() (TODO) virtual void on_init(const std::shared_ptr<void>&) override {} // disable start() (TODO)
virtual void on_stop() override {} // disable join() virtual void on_stop() override {} // disable join()
virtual void begin(); virtual void begin();