diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 5eedcc0fcd..aa59aa2384 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1,7 +1,4 @@ #include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/Memory/Memory.h" - #include "Thread.h" thread_local NamedThreadBase* g_tls_this_thread = nullptr; @@ -27,6 +24,17 @@ void NamedThreadBase::SetThreadName(const std::string& name) m_name = name; } +void NamedThreadBase::WaitForAnySignal() // wait 1 ms for something +{ + std::unique_lock lock(m_signal_mtx); + m_signal_cv.wait_for(lock, std::chrono::milliseconds(1)); +} + +void NamedThreadBase::Notify() // wake up waiting thread or nothing +{ + m_signal_cv.notify_one(); +} + ThreadBase::ThreadBase(const std::string& name) : NamedThreadBase(name) , m_executor(nullptr) @@ -40,7 +48,8 @@ ThreadBase::~ThreadBase() if(IsAlive()) Stop(false); - safe_delete(m_executor); + delete m_executor; + m_executor = nullptr; } void ThreadBase::Start() @@ -57,18 +66,7 @@ void ThreadBase::Start() SetCurrentNamedThread(this); g_thread_count++; - try - { - Task(); - } - catch (const std::string& e) - { - LOG_ERROR(GENERAL, "Exception: %s", e.c_str()); - } - catch (const char* e) - { - LOG_ERROR(GENERAL, "Exception: %s", e); - } + Task(); m_alive = false; g_thread_count--; @@ -144,15 +142,7 @@ void thread::start(std::function func) SetCurrentNamedThread(&info); g_thread_count++; - try - { - func(); - } - catch(...) - { - LOG_ERROR(HLE, "Crash :("); - //std::terminate(); - } + func(); g_thread_count--; }); diff --git a/Utilities/Thread.h b/Utilities/Thread.h index 83401da110..ef210365a8 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -1,11 +1,9 @@ #pragma once #include #include -#include #include #include #include -//#include static std::thread::id main_thread; @@ -35,16 +33,9 @@ public: virtual std::string GetThreadName() const; virtual void SetThreadName(const std::string& name); - void WaitForAnySignal() // wait 1 ms for something - { - std::unique_lock lock(m_signal_mtx); - m_signal_cv.wait_for(lock, std::chrono::milliseconds(1)); - } + void WaitForAnySignal(); - void Notify() // wake up waiting thread or nothing - { - m_signal_cv.notify_one(); - } + void Notify(); }; NamedThreadBase* GetCurrentNamedThread(); @@ -89,132 +80,4 @@ public: void detach(); void join(); bool joinable() const; -}; - -template class MTPacketBuffer -{ -protected: - volatile bool m_busy; - volatile u32 m_put, m_get; - std::vector m_buffer; - u32 m_max_buffer_size; - mutable std::recursive_mutex m_cs_main; - - void CheckBusy() - { - m_busy = m_put >= m_max_buffer_size; - } - -public: - MTPacketBuffer(u32 max_buffer_size) - : m_max_buffer_size(max_buffer_size) - { - Flush(); - } - - ~MTPacketBuffer() - { - Flush(); - } - - void Flush() - { - std::lock_guard lock(m_cs_main); - m_put = m_get = 0; - m_buffer.clear(); - m_busy = false; - } - -private: - virtual void _push(const T& v) = 0; - virtual T _pop() = 0; - -public: - void Push(const T& v) - { - std::lock_guard lock(m_cs_main); - _push(v); - } - - T Pop() - { - std::lock_guard lock(m_cs_main); - return _pop(); - } - - bool HasNewPacket() const { std::lock_guard lock(m_cs_main); return m_put != m_get; } - bool IsBusy() const { return m_busy; } -}; - -/* -class StepThread : public ThreadBase -{ - wxSemaphore m_main_sem; - wxSemaphore m_destroy_sem; - volatile bool m_exit; - -protected: - StepThread(const std::string& name = "Unknown StepThread") - : ThreadBase(true, name) - , m_exit(false) - { - } - - virtual ~StepThread() throw() - { - } - -private: - virtual void Task() - { - m_exit = false; - - while(!TestDestroy()) - { - m_main_sem.Wait(); - - if(TestDestroy() || m_exit) break; - - Step(); - } - - while(!TestDestroy()) std::this_thread::sleep_for(std::chrono::milliseconds(0)); - if(m_destroy_sem.TryWait() != wxSEMA_NO_ERROR) m_destroy_sem.Post(); - } - - virtual void Step()=0; - -public: - void DoStep() - { - if(IsRunning()) m_main_sem.Post(); - } - - void WaitForExit() - { - if(TestDestroy()) m_destroy_sem.Wait(); - } - - void WaitForNextStep() - { - if(!IsRunning()) return; - - while(m_main_sem.TryWait() != wxSEMA_NO_ERROR) std::this_thread::sleep_for(std::chrono::milliseconds(0)); - } - - void Exit(bool wait = false) - { - if(!IsAlive()) return; - - if(m_main_sem.TryWait() != wxSEMA_NO_ERROR) - { - m_exit = true; - m_main_sem.Post(); - } - - Delete(); - - if(wait) WaitForExit(); - } -}; -*/ +}; \ No newline at end of file diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 6cc990b777..3b28ea682d 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -324,40 +324,51 @@ void CPUThread::Task() // TODO: linux version #endif - while (true) + try { - int status = ThreadStatus(); - - if (status == CPUThread_Stopped || status == CPUThread_Break) + while (true) { - break; - } + int status = ThreadStatus(); - if (status == CPUThread_Sleeping) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } - - Step(); - //if (PC - 0x13ED4 < 0x288) trace.push_back(PC); - NextPc(m_dec->DecodeMemory(PC + m_offset)); - - if (status == CPUThread_Step) - { - m_is_step = false; - break; - } - - for (uint i = 0; i < bp.size(); ++i) - { - if (bp[i] == PC) + if (status == CPUThread_Stopped || status == CPUThread_Break) { - Emu.Pause(); break; } + + if (status == CPUThread_Sleeping) + { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; + } + + Step(); + //if (PC - 0x13ED4 < 0x288) trace.push_back(PC); + NextPc(m_dec->DecodeMemory(PC + m_offset)); + + if (status == CPUThread_Step) + { + m_is_step = false; + break; + } + + for (uint i = 0; i < bp.size(); ++i) + { + if (bp[i] == PC) + { + Emu.Pause(); + break; + } + } } } + catch (const std::string& e) + { + LOG_ERROR(GENERAL, "Exception: %s", e.c_str()); + } + catch (const char* e) + { + LOG_ERROR(GENERAL, "Exception: %s", e); + } for (auto& v : trace) LOG_NOTICE(PPU, "PC = 0x%llx", v); diff --git a/rpcs3/Emu/FS/VFS.cpp b/rpcs3/Emu/FS/VFS.cpp index 8263fa1acb..c4c75202ce 100644 --- a/rpcs3/Emu/FS/VFS.cpp +++ b/rpcs3/Emu/FS/VFS.cpp @@ -2,6 +2,7 @@ #include #include "VFS.h" +#include "vfsDirBase.h" #include "Emu/HDD/HDD.h" #include "vfsDeviceLocalFile.h" #include "Ini.h" diff --git a/rpcs3/Emu/FS/VFS.h b/rpcs3/Emu/FS/VFS.h index 95434cb4ea..0f1f1539ba 100644 --- a/rpcs3/Emu/FS/VFS.h +++ b/rpcs3/Emu/FS/VFS.h @@ -1,6 +1,9 @@ #pragma once -#include "vfsDevice.h" +class vfsDevice; +struct vfsFileBase; +class vfsDirBase; +enum vfsOpenMode; enum vfsDeviceType { diff --git a/rpcs3/Emu/FS/vfsDevice.h b/rpcs3/Emu/FS/vfsDevice.h index b5780e7add..c092df5d05 100644 --- a/rpcs3/Emu/FS/vfsDevice.h +++ b/rpcs3/Emu/FS/vfsDevice.h @@ -1,8 +1,9 @@ #pragma once -#include "vfsFileBase.h" -#include "vfsDirBase.h" #include +struct vfsFileBase; +class vfsDirBase; + class vfsDevice { std::string m_ps3_path; diff --git a/rpcs3/Emu/FS/vfsDir.h b/rpcs3/Emu/FS/vfsDir.h index 09c8ee197d..02f229eab5 100644 --- a/rpcs3/Emu/FS/vfsDir.h +++ b/rpcs3/Emu/FS/vfsDir.h @@ -1,4 +1,5 @@ #pragma once +#include #include "vfsDirBase.h" class vfsDir : public vfsDirBase diff --git a/rpcs3/Emu/FS/vfsDirBase.cpp b/rpcs3/Emu/FS/vfsDirBase.cpp index 6e37d7cf1e..e5bda0eded 100644 --- a/rpcs3/Emu/FS/vfsDirBase.cpp +++ b/rpcs3/Emu/FS/vfsDirBase.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" -#include "vfsDevice.h" -#include "vfsDirBase.h" #include "Utilities/rFile.h" +#include "vfsDirBase.h" vfsDirBase::vfsDirBase(vfsDevice* device) : m_pos(0) diff --git a/rpcs3/Emu/FS/vfsDirBase.h b/rpcs3/Emu/FS/vfsDirBase.h index c888f60cab..7251862976 100644 --- a/rpcs3/Emu/FS/vfsDirBase.h +++ b/rpcs3/Emu/FS/vfsDirBase.h @@ -1,5 +1,7 @@ #pragma once +class vfsDevice; + enum DirEntryFlags { DirEntry_TypeDir = 0x1, diff --git a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp index c549d2fada..ddbfcfebff 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" +#include "Emu/FS/vfsFileBase.h" #include "cellUserInfo.h" //void cellUserInfo_init(); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 24a5360065..8fa76a2f74 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -8,6 +8,7 @@ #include "Loader/TRP.h" #include "Loader/TROPUSR.h" #include "Emu/FS/vfsDir.h" +#include "Emu/FS/vfsFileBase.h" #include "Emu/SysCalls/lv2/sys_time.h" #include "sceNp.h" #include "sceNpTrophy.h" diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index b99a75b804..0f1ad2bafe 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" +#include "Emu/FS/vfsFileBase.h" #include "Emu/SysCalls/lv2/lv2Fs.h" Module *sys_fs = nullptr; diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index 72b70bb87c..117a0bdbc2 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Utilities/Log.h" #include "Utilities/rFile.h" +#include "Emu/FS/vfsStream.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" diff --git a/rpcs3/Loader/TROPUSR.cpp b/rpcs3/Loader/TROPUSR.cpp index 35e3b7bda0..62646c83fb 100644 --- a/rpcs3/Loader/TROPUSR.cpp +++ b/rpcs3/Loader/TROPUSR.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Utilities/Log.h" #include "Utilities/rXml.h" +#include "Emu/FS/vfsFileBase.h" #include "Emu/System.h" #include "TROPUSR.h" diff --git a/rpcs3/Loader/TROPUSR.h b/rpcs3/Loader/TROPUSR.h index 7fca0aa590..bfdc0ff182 100644 --- a/rpcs3/Loader/TROPUSR.h +++ b/rpcs3/Loader/TROPUSR.h @@ -1,5 +1,7 @@ #pragma once +struct vfsStream; + struct TROPUSRHeader { be_t magic; // 81 8F 54 AD