2009-09-08 12:08:10 +00:00
|
|
|
/* PCSX2 - PS2 Emulator for PCs
|
2010-05-03 14:08:02 +00:00
|
|
|
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
2009-10-04 09:00:07 +00:00
|
|
|
*
|
2009-09-08 12:08:10 +00:00
|
|
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
|
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
2009-02-09 21:15:56 +00:00
|
|
|
*
|
2009-09-08 12:08:10 +00:00
|
|
|
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
2009-02-09 21:15:56 +00:00
|
|
|
*
|
2009-09-08 12:08:10 +00:00
|
|
|
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
2009-02-09 21:15:56 +00:00
|
|
|
*/
|
2009-10-04 09:00:07 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
#include "PrecompiledHeader.h"
|
|
|
|
|
2014-08-03 18:11:22 +00:00
|
|
|
#ifdef __linux__
|
2016-11-12 15:28:37 +00:00
|
|
|
#include <signal.h> // for pthread_kill, which is in pthread.h on w32-pthreads
|
2009-08-20 23:05:26 +00:00
|
|
|
#endif
|
|
|
|
|
2010-01-22 15:22:01 +00:00
|
|
|
#include "PersistentThread.h"
|
2009-10-07 19:20:11 +00:00
|
|
|
#include "wxBaseTools.h"
|
2009-10-17 18:21:30 +00:00
|
|
|
#include "ThreadingInternal.h"
|
2010-01-22 15:22:01 +00:00
|
|
|
#include "EventSource.inl"
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2009-11-22 09:47:52 +00:00
|
|
|
using namespace Threading;
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
template class EventSource<EventListener_Thread>;
|
2010-01-22 15:22:01 +00:00
|
|
|
|
2009-10-17 18:21:30 +00:00
|
|
|
// 100ms interval for waitgui (issued from blocking semaphore waits on the main thread,
|
|
|
|
// to avoid gui deadlock).
|
2016-11-12 15:28:37 +00:00
|
|
|
const wxTimeSpan Threading::def_yieldgui_interval(0, 0, 0, 100);
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2010-08-16 15:01:13 +00:00
|
|
|
ConsoleLogSource_Threading::ConsoleLogSource_Threading()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
static const TraceLogDescriptor myDesc =
|
|
|
|
{
|
|
|
|
L"p&xThread", L"pxThread",
|
|
|
|
pxLt("Threading activity: start, detach, sync, deletion, etc.")};
|
2010-08-16 15:01:13 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
m_Descriptor = &myDesc;
|
2010-08-16 15:01:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ConsoleLogSource_Threading pxConLog_Thread;
|
|
|
|
|
|
|
|
|
2010-04-27 13:12:03 +00:00
|
|
|
class StaticMutex : public Mutex
|
|
|
|
{
|
|
|
|
protected:
|
2016-11-12 15:28:37 +00:00
|
|
|
bool &m_DeletedFlag;
|
2010-04-27 13:12:03 +00:00
|
|
|
|
|
|
|
public:
|
2016-11-12 15:28:37 +00:00
|
|
|
StaticMutex(bool &deletedFlag)
|
|
|
|
: m_DeletedFlag(deletedFlag)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-05-06 12:22:00 +00:00
|
|
|
virtual ~StaticMutex()
|
2016-11-12 15:28:37 +00:00
|
|
|
{
|
|
|
|
m_DeletedFlag = true;
|
|
|
|
}
|
2010-04-27 13:12:03 +00:00
|
|
|
};
|
2009-10-17 18:21:30 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
static pthread_key_t curthread_key = 0;
|
|
|
|
static s32 total_key_count = 0;
|
2010-04-27 13:12:03 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
static bool tkl_destructed = false;
|
|
|
|
static StaticMutex total_key_lock(tkl_destructed);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
static void make_curthread_key(const pxThread *thr)
|
2009-12-14 12:18:55 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
pxAssumeDev(!tkl_destructed, "total_key_lock is destroyed; program is shutting down; cannot create new thread key.");
|
2010-04-27 13:12:03 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
ScopedLock lock(total_key_lock);
|
|
|
|
if (total_key_count++ != 0)
|
|
|
|
return;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (0 != pthread_key_create(&curthread_key, NULL)) {
|
|
|
|
pxThreadLog.Error(thr->GetName(), L"Thread key creation failed (probably out of memory >_<)");
|
|
|
|
curthread_key = 0;
|
|
|
|
}
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void unmake_curthread_key()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
ScopedLock lock;
|
|
|
|
if (!tkl_destructed)
|
|
|
|
lock.AssignAndLock(total_key_lock);
|
2010-04-27 13:12:03 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (--total_key_count > 0)
|
|
|
|
return;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (curthread_key)
|
|
|
|
pthread_key_delete(curthread_key);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
curthread_key = 0;
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
2010-04-27 13:12:03 +00:00
|
|
|
void Threading::pxTestCancel()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
pthread_testcancel();
|
2010-04-27 13:12:03 +00:00
|
|
|
}
|
|
|
|
|
2009-12-14 12:18:55 +00:00
|
|
|
// Returns a handle to the current persistent thread. If the current thread does not belong
|
2010-06-19 13:42:32 +00:00
|
|
|
// to the pxThread table, NULL is returned. Since the main/ui thread is not created
|
|
|
|
// through pxThread it will also return NULL. Callers can use wxThread::IsMain() to
|
2009-12-14 12:18:55 +00:00
|
|
|
// test if the NULL thread is the main thread.
|
2016-11-12 15:28:37 +00:00
|
|
|
pxThread *Threading::pxGetCurrentThread()
|
2009-12-14 12:18:55 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
return !curthread_key ? NULL : (pxThread *)pthread_getspecific(curthread_key);
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
// returns the name of the current thread, or "Unknown" if the thread is neither a pxThread
|
2009-12-14 12:18:55 +00:00
|
|
|
// nor the Main/UI thread.
|
|
|
|
wxString Threading::pxGetCurrentThreadName()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (pxThread *thr = pxGetCurrentThread()) {
|
|
|
|
return thr->GetName();
|
|
|
|
} else if (wxThread::IsMain()) {
|
|
|
|
return L"Main/UI";
|
|
|
|
}
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
return L"Unknown";
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxYield(int ms)
|
2009-12-21 11:52:14 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (pxThread *thr = pxGetCurrentThread())
|
|
|
|
thr->Yield(ms);
|
|
|
|
else
|
|
|
|
Sleep(ms);
|
2009-12-21 11:52:14 +00:00
|
|
|
}
|
|
|
|
|
2009-10-17 18:21:30 +00:00
|
|
|
// (intended for internal use only)
|
|
|
|
// Returns true if the Wait is recursive, or false if the Wait is safe and should be
|
|
|
|
// handled via normal yielding methods.
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::_WaitGui_RecursionGuard(const wxChar *name)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_AllowFrom_MainUI();
|
|
|
|
|
|
|
|
// In order to avoid deadlock we need to make sure we cut some time to handle messages.
|
|
|
|
// But this can result in recursive yield calls, which would crash the app. Protect
|
|
|
|
// against them here and, if recursion is detected, perform a standard blocking wait.
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
static int __Guard = 0;
|
|
|
|
RecursionGuard guard(__Guard);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
//if( pxAssertDev( !guard.IsReentrant(), "Recursion during UI-bound threading wait object." ) ) return false;
|
2010-05-03 13:51:46 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!guard.IsReentrant())
|
|
|
|
return false;
|
|
|
|
pxThreadLog.Write(pxGetCurrentThreadName(),
|
|
|
|
pxsFmt(L"Yield recursion in %s; opening modal dialog.", name));
|
|
|
|
return true;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
2010-08-09 04:10:38 +00:00
|
|
|
__fi void Threading::Timeslice()
|
2009-02-09 21:15:56 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
sched_yield();
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-09-07 21:16:12 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::_pt_callback_cleanup(void *handle)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
((pxThread *)handle)->_ThreadCleanup();
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-09-03 11:59:05 +00:00
|
|
|
|
2010-01-25 15:31:17 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
Threading::pxThread::pxThread(const wxString &name)
|
|
|
|
: m_name(name)
|
|
|
|
, m_thread()
|
|
|
|
, m_native_id(0)
|
|
|
|
, m_native_handle(0)
|
|
|
|
, m_detached(true) // start out with m_thread in detached/invalid state
|
|
|
|
, m_running(false)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
|
|
|
}
|
2009-02-09 21:15:56 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// This destructor performs basic "last chance" cleanup, which is a blocking join
|
|
|
|
// against the thread. Extending classes should almost always implement their own
|
2010-06-19 13:42:32 +00:00
|
|
|
// thread closure process, since any pxThread will, by design, not terminate
|
2009-12-14 12:18:55 +00:00
|
|
|
// unless it has been properly canceled (resulting in deadlock).
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
//
|
|
|
|
// Thread safety: This class must not be deleted from its own thread. That would be
|
|
|
|
// like marrying your sister, and then cheating on her with your daughter.
|
2017-05-06 12:22:00 +00:00
|
|
|
Threading::pxThread::~pxThread()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
try {
|
|
|
|
pxThreadLog.Write(GetName(), L"Executing default destructor!");
|
|
|
|
|
|
|
|
if (m_running) {
|
|
|
|
pxThreadLog.Write(GetName(), L"Waiting for running thread to end...");
|
|
|
|
m_mtx_InThread.Wait();
|
|
|
|
pxThreadLog.Write(GetName(), L"Thread ended gracefully.");
|
|
|
|
}
|
|
|
|
Threading::Sleep(1);
|
|
|
|
Detach();
|
|
|
|
}
|
|
|
|
DESTRUCTOR_CATCHALL
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
Lots of new code maintenance stuffs:
* Completely new assertion macros: pxAssert, pxAssertMsg, and pxFail, pxAssertDev (both which default to using a message). These replace *all* wxASSERT, DevAssert, and jASSUME varieties of macros. New macros borrow the best of all assertion worlds: MSVCRT, wxASSERT, and AtlAssume. :)
* Rewrote the Console namespace as a structure called IConsoleWriter, and created several varieties of ConsoleWriters for handling different states of log and console availability (should help reduce overhead of console logging nicely).
* More improvements to the PersistentThread model, using safely interlocked "Do*" style callbacks for starting and cleaning up threads.
* Fixed console logs so that they're readable in Win32 notepad again (the log writer adds CRs to naked LFs).
* Added AppInit.cpp -- contains constructor, destructor, OnInit, and command line parsing mess.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1950 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-04 08:27:27 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::AffinityAssert_AllowFromSelf(const DiagnosticOrigin &origin) const
|
2009-12-07 22:43:16 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (IsSelf())
|
|
|
|
return true;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (IsDevBuild)
|
|
|
|
pxOnAssert(origin, pxsFmt(L"Thread affinity violation: Call allowed from '%s' thread only.", WX_STR(GetName())));
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
return false;
|
2009-12-07 22:43:16 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::AffinityAssert_DisallowFromSelf(const DiagnosticOrigin &origin) const
|
2009-12-07 22:43:16 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!IsSelf())
|
|
|
|
return true;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (IsDevBuild)
|
|
|
|
pxOnAssert(origin, pxsFmt(L"Thread affinity violation: Call is *not* allowed from '%s' thread.", WX_STR(GetName())));
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
return false;
|
2009-12-07 22:43:16 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::FrankenMutex(Mutex &mutex)
|
2009-10-17 18:21:30 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (mutex.RecreateIfLocked()) {
|
|
|
|
// Our lock is bupkis, which means the previous thread probably deadlocked.
|
|
|
|
// Let's create a new mutex lock to replace it.
|
2009-10-17 18:21:30 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
pxThreadLog.Error(GetName(), L"Possible deadlock detected on restarted mutex!");
|
|
|
|
}
|
2009-10-17 18:21:30 +00:00
|
|
|
}
|
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// Main entry point for starting or e-starting a persistent thread. This function performs necessary
|
2009-10-18 12:30:00 +00:00
|
|
|
// locks and checks for avoiding race conditions, and then calls OnStart() immediately before
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// the actual thread creation. Extending classes should generally not override Start(), and should
|
|
|
|
// instead override DoPrepStart instead.
|
|
|
|
//
|
|
|
|
// This function should not be called from the owner thread.
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::Start()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
// Prevents sudden parallel startup, and or parallel startup + cancel:
|
|
|
|
ScopedLock startlock(m_mtx_start);
|
|
|
|
if (m_running) {
|
|
|
|
pxThreadLog.Write(GetName(), L"Start() called on running thread; ignorning...");
|
|
|
|
return;
|
|
|
|
}
|
Lots of new code maintenance stuffs:
* Completely new assertion macros: pxAssert, pxAssertMsg, and pxFail, pxAssertDev (both which default to using a message). These replace *all* wxASSERT, DevAssert, and jASSUME varieties of macros. New macros borrow the best of all assertion worlds: MSVCRT, wxASSERT, and AtlAssume. :)
* Rewrote the Console namespace as a structure called IConsoleWriter, and created several varieties of ConsoleWriters for handling different states of log and console availability (should help reduce overhead of console logging nicely).
* More improvements to the PersistentThread model, using safely interlocked "Do*" style callbacks for starting and cleaning up threads.
* Fixed console logs so that they're readable in Win32 notepad again (the log writer adds CRs to naked LFs).
* Added AppInit.cpp -- contains constructor, destructor, OnInit, and command line parsing mess.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1950 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-04 08:27:27 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
Detach(); // clean up previous thread handle, if one exists.
|
|
|
|
OnStart();
|
2009-08-15 06:17:43 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
m_except = NULL;
|
2009-10-23 20:24:59 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
pxThreadLog.Write(GetName(), L"Calling pthread_create...");
|
|
|
|
if (pthread_create(&m_thread, NULL, _internal_callback, this) != 0)
|
|
|
|
throw Exception::ThreadCreationError(this).SetDiagMsg(L"Thread creation error: " + wxString(std::strerror(errno)));
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2017-05-13 12:07:54 +00:00
|
|
|
#ifdef ASAN_WORKAROUND
|
|
|
|
// Recent Asan + libc6 do pretty bad stuff on the thread init => https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77982
|
|
|
|
//
|
|
|
|
// In our case, the semaphore was posted (counter is 1) but thread is still
|
|
|
|
// waiting... So waits 100ms and checks the counter value manually
|
|
|
|
if (!m_sem_startup.WaitWithoutYield(wxTimeSpan(0, 0, 0, 100))) {
|
|
|
|
if (m_sem_startup.Count() == 0)
|
|
|
|
throw Exception::ThreadCreationError(this).SetDiagMsg(L"Thread creation error: %s thread never posted startup semaphore.");
|
|
|
|
}
|
|
|
|
#else
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!m_sem_startup.WaitWithoutYield(wxTimeSpan(0, 0, 3, 0))) {
|
|
|
|
RethrowException();
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// And if the thread threw nothing of its own:
|
|
|
|
throw Exception::ThreadCreationError(this).SetDiagMsg(L"Thread creation error: %s thread never posted startup semaphore.");
|
|
|
|
}
|
2017-05-13 12:07:54 +00:00
|
|
|
#endif
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// Event Rationale (above): Performing this semaphore wait on the created thread is "slow" in the
|
|
|
|
// sense that it stalls the calling thread completely until the new thread is created
|
|
|
|
// (which may not always be desirable). But too bad. In order to safely use 'running' locks
|
|
|
|
// and detachment management, this *has* to be done. By rule, starting new threads shouldn't
|
|
|
|
// be done very often anyway, hence the concept of Threadpooling for rapidly rotating tasks.
|
|
|
|
// (and indeed, this semaphore wait might, in fact, be very swift compared to other kernel
|
|
|
|
// overhead in starting threads).
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// (this could also be done using operating system specific calls, since any threaded OS has
|
|
|
|
// functions that allow us to see if a thread is running or not, and to block against it even if
|
|
|
|
// it's been detached -- removing the need for m_mtx_InThread and the semaphore wait above. But
|
|
|
|
// pthreads kinda lacks that stuff, since pthread_join() has no timeout option making it im-
|
|
|
|
// possible to safely block against a running thread)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-09-03 11:59:05 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// Returns: TRUE if the detachment was performed, or FALSE if the thread was
|
|
|
|
// already detached or isn't running at all.
|
|
|
|
// This function should not be called from the owner thread.
|
2010-06-19 13:42:32 +00:00
|
|
|
bool Threading::pxThread::Detach()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_DisallowFromSelf(pxDiagSpot);
|
Lots of new code maintenance stuffs:
* Completely new assertion macros: pxAssert, pxAssertMsg, and pxFail, pxAssertDev (both which default to using a message). These replace *all* wxASSERT, DevAssert, and jASSUME varieties of macros. New macros borrow the best of all assertion worlds: MSVCRT, wxASSERT, and AtlAssume. :)
* Rewrote the Console namespace as a structure called IConsoleWriter, and created several varieties of ConsoleWriters for handling different states of log and console availability (should help reduce overhead of console logging nicely).
* More improvements to the PersistentThread model, using safely interlocked "Do*" style callbacks for starting and cleaning up threads.
* Fixed console logs so that they're readable in Win32 notepad again (the log writer adds CRs to naked LFs).
* Added AppInit.cpp -- contains constructor, destructor, OnInit, and command line parsing mess.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1950 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-04 08:27:27 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (m_detached.exchange(true))
|
|
|
|
return false;
|
|
|
|
pthread_detach(m_thread);
|
|
|
|
return true;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-09-05 12:02:07 +00:00
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
bool Threading::pxThread::_basecancel()
|
2009-12-14 12:18:55 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!m_running)
|
|
|
|
return false;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (m_detached) {
|
|
|
|
pxThreadLog.Warn(GetName(), L"Ignoring attempted cancellation of detached thread.");
|
|
|
|
return false;
|
|
|
|
}
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
pthread_cancel(m_thread);
|
|
|
|
return true;
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// Remarks:
|
2010-06-19 13:42:32 +00:00
|
|
|
// Provision of non-blocking Cancel() is probably academic, since destroying a pxThread
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// object performs a blocking Cancel regardless of if you explicitly do a non-blocking Cancel()
|
|
|
|
// prior, since the ExecuteTaskInThread() method requires a valid object state. If you really need
|
|
|
|
// fire-and-forget behavior on threads, use pthreads directly for now.
|
|
|
|
//
|
|
|
|
// This function should not be called from the owner thread.
|
|
|
|
//
|
|
|
|
// Parameters:
|
|
|
|
// isBlocking - indicates if the Cancel action should block for thread completion or not.
|
|
|
|
//
|
2009-12-14 12:18:55 +00:00
|
|
|
// Exceptions raised by the blocking thread will be re-thrown into the main thread. If isBlocking
|
|
|
|
// is false then no exceptions will occur.
|
|
|
|
//
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::Cancel(bool isBlocking)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_DisallowFromSelf(pxDiagSpot);
|
2009-08-15 06:17:43 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// Prevent simultaneous startup and cancel, necessary to avoid
|
|
|
|
ScopedLock startlock(m_mtx_start);
|
2009-10-17 18:21:30 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!_basecancel())
|
|
|
|
return;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (isBlocking) {
|
|
|
|
WaitOnSelf(m_mtx_InThread);
|
|
|
|
Detach();
|
|
|
|
}
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-02-17 01:38:02 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::Cancel(const wxTimeSpan ×pan)
|
2009-12-14 12:18:55 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_DisallowFromSelf(pxDiagSpot);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// Prevent simultaneous startup and cancel:
|
|
|
|
ScopedLock startlock(m_mtx_start);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!_basecancel())
|
|
|
|
return true;
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!WaitOnSelf(m_mtx_InThread, timespan))
|
|
|
|
return false;
|
|
|
|
Detach();
|
|
|
|
return true;
|
2009-12-14 12:18:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// Blocks execution of the calling thread until this thread completes its task. The
|
|
|
|
// caller should make sure to signal the thread to exit, or else blocking may deadlock the
|
2010-06-19 13:42:32 +00:00
|
|
|
// calling thread. Classes which extend pxThread should override this method
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// and signal any necessary thread exit variables prior to blocking.
|
|
|
|
//
|
|
|
|
// Returns the return code of the thread.
|
|
|
|
// This method is roughly the equivalent of pthread_join().
|
|
|
|
//
|
2009-12-14 12:18:55 +00:00
|
|
|
// Exceptions raised by the blocking thread will be re-thrown into the main thread.
|
|
|
|
//
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::Block()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_DisallowFromSelf(pxDiagSpot);
|
|
|
|
WaitOnSelf(m_mtx_InThread);
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::Block(const wxTimeSpan &timeout)
|
2010-04-27 13:12:03 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_DisallowFromSelf(pxDiagSpot);
|
|
|
|
return WaitOnSelf(m_mtx_InThread, timeout);
|
2010-04-27 13:12:03 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
bool Threading::pxThread::IsSelf() const
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
// Detached threads may have their pthread handles recycled as newer threads, causing
|
|
|
|
// false IsSelf reports.
|
|
|
|
return !m_detached && (pthread_self() == m_thread);
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
bool Threading::pxThread::IsRunning() const
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-02-22 21:14:29 +00:00
|
|
|
return m_running;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::AddListener(EventListener_Thread &evt)
|
2010-01-22 15:22:01 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
evt.SetThread(this);
|
|
|
|
m_evtsrc_OnDelete.Add(evt);
|
2010-01-22 15:22:01 +00:00
|
|
|
}
|
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// Throws an exception if the thread encountered one. Uses the BaseException's Rethrow() method,
|
|
|
|
// which ensures the exception type remains consistent. Debuggable stacktraces will be lost, since
|
|
|
|
// the thread will have allowed itself to terminate properly.
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::RethrowException() const
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
// Thread safety note: always detach the m_except pointer. If we checked it for NULL, the
|
|
|
|
// pointer might still be invalid after detachment, so might as well just detach and check
|
|
|
|
// after.
|
2010-05-07 03:20:58 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
ScopedExcept ptr(const_cast<pxThread *>(this)->m_except.DetachPtr());
|
|
|
|
if (ptr)
|
|
|
|
ptr->Rethrow();
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
2010-05-03 13:51:46 +00:00
|
|
|
static bool m_BlockDeletions = false;
|
|
|
|
|
|
|
|
bool Threading::AllowDeletions()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_AllowFrom_MainUI();
|
|
|
|
return !m_BlockDeletions;
|
2010-05-03 13:51:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Threading::YieldToMain()
|
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
m_BlockDeletions = true;
|
|
|
|
wxTheApp->Yield(true);
|
|
|
|
m_BlockDeletions = false;
|
2010-05-03 13:51:46 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::_selfRunningTest(const wxChar *name) const
|
2009-11-22 09:47:52 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (HasPendingException()) {
|
|
|
|
pxThreadLog.Error(GetName(), pxsFmt(L"An exception was thrown while waiting on a %s.", name));
|
|
|
|
RethrowException();
|
|
|
|
}
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!m_running) {
|
|
|
|
throw Exception::CancelEvent(pxsFmt(
|
|
|
|
L"Blocking thread %s was terminated while another thread was waiting on a %s.",
|
|
|
|
WX_STR(GetName()), name));
|
|
|
|
}
|
2010-05-03 13:51:46 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// Thread is still alive and kicking (for now) -- yield to other messages and hope
|
|
|
|
// that impending chaos does not ensue. [it shouldn't since we block pxThread
|
|
|
|
// objects from being deleted until outside the scope of a mutex/semaphore wait).
|
2010-05-03 13:51:46 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
if ((wxTheApp != NULL) && wxThread::IsMain() && !_WaitGui_RecursionGuard(L"WaitForSelf"))
|
|
|
|
Threading::YieldToMain();
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
// This helper function is a deadlock-safe method of waiting on a semaphore in a pxThread. If the
|
2009-10-18 12:30:00 +00:00
|
|
|
// thread is terminated or canceled by another thread or a nested action prior to the semaphore being
|
2009-11-22 09:47:52 +00:00
|
|
|
// posted, this function will detect that and throw a CancelEvent exception is thrown.
|
2009-10-18 12:30:00 +00:00
|
|
|
//
|
|
|
|
// Note: Use of this function only applies to semaphores which are posted by the worker thread. Calling
|
|
|
|
// this function from the context of the thread itself is an error, and a dev assertion will be generated.
|
|
|
|
//
|
|
|
|
// Exceptions:
|
2009-11-22 09:47:52 +00:00
|
|
|
// This function will rethrow exceptions raised by the persistent thread, if it throws an error
|
|
|
|
// while the calling thread is blocking (which also means the persistent thread has terminated).
|
2009-10-18 12:30:00 +00:00
|
|
|
//
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::WaitOnSelf(Semaphore &sem) const
|
2009-10-18 12:30:00 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!AffinityAssert_DisallowFromSelf(pxDiagSpot))
|
|
|
|
return;
|
2009-10-18 12:30:00 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
while (true) {
|
|
|
|
if (sem.WaitWithoutYield(wxTimeSpan(0, 0, 0, 333)))
|
|
|
|
return;
|
|
|
|
_selfRunningTest(L"semaphore");
|
|
|
|
}
|
2009-10-18 12:30:00 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
// This helper function is a deadlock-safe method of waiting on a mutex in a pxThread.
|
2009-11-22 09:47:52 +00:00
|
|
|
// If the thread is terminated or canceled by another thread or a nested action prior to the
|
|
|
|
// mutex being unlocked, this function will detect that and a CancelEvent exception is thrown.
|
2009-10-18 12:30:00 +00:00
|
|
|
//
|
2009-11-22 09:47:52 +00:00
|
|
|
// Note: Use of this function only applies to mutexes which are acquired by a worker thread.
|
|
|
|
// Calling this function from the context of the thread itself is an error, and a dev assertion
|
|
|
|
// will be generated.
|
2009-10-18 12:30:00 +00:00
|
|
|
//
|
|
|
|
// Exceptions:
|
2009-11-22 09:47:52 +00:00
|
|
|
// This function will rethrow exceptions raised by the persistent thread, if it throws an
|
|
|
|
// error while the calling thread is blocking (which also means the persistent thread has
|
|
|
|
// terminated).
|
2009-10-18 12:30:00 +00:00
|
|
|
//
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::WaitOnSelf(Mutex &mutex) const
|
2009-10-18 12:30:00 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!AffinityAssert_DisallowFromSelf(pxDiagSpot))
|
|
|
|
return;
|
2009-10-18 12:30:00 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
while (true) {
|
|
|
|
if (mutex.WaitWithoutYield(wxTimeSpan(0, 0, 0, 333)))
|
|
|
|
return;
|
|
|
|
_selfRunningTest(L"mutex");
|
|
|
|
}
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
static const wxTimeSpan SelfWaitInterval(0, 0, 0, 333);
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::WaitOnSelf(Semaphore &sem, const wxTimeSpan &timeout) const
|
2009-11-22 09:47:52 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!AffinityAssert_DisallowFromSelf(pxDiagSpot))
|
|
|
|
return true;
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
wxTimeSpan runningout(timeout);
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
while (runningout.GetMilliseconds() > 0) {
|
|
|
|
const wxTimeSpan interval((SelfWaitInterval < runningout) ? SelfWaitInterval : runningout);
|
|
|
|
if (sem.WaitWithoutYield(interval))
|
|
|
|
return true;
|
|
|
|
_selfRunningTest(L"semaphore");
|
|
|
|
runningout -= interval;
|
|
|
|
}
|
|
|
|
return false;
|
2009-10-18 12:30:00 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
bool Threading::pxThread::WaitOnSelf(Mutex &mutex, const wxTimeSpan &timeout) const
|
2009-11-22 09:47:52 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!AffinityAssert_DisallowFromSelf(pxDiagSpot))
|
|
|
|
return true;
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
wxTimeSpan runningout(timeout);
|
2009-11-22 09:47:52 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
while (runningout.GetMilliseconds() > 0) {
|
|
|
|
const wxTimeSpan interval((SelfWaitInterval < runningout) ? SelfWaitInterval : runningout);
|
|
|
|
if (mutex.WaitWithoutYield(interval))
|
|
|
|
return true;
|
|
|
|
_selfRunningTest(L"mutex");
|
|
|
|
runningout -= interval;
|
|
|
|
}
|
|
|
|
return false;
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
2009-10-18 12:30:00 +00:00
|
|
|
|
2009-10-17 18:21:30 +00:00
|
|
|
// Inserts a thread cancellation point. If the thread has received a cancel request, this
|
|
|
|
// function will throw an SEH exception designed to exit the thread (so make sure to use C++
|
|
|
|
// object encapsulation for anything that could leak resources, to ensure object unwinding
|
|
|
|
// and cleanup, or use the DoThreadCleanup() override to perform resource cleanup).
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::TestCancel() const
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_AllowFromSelf(pxDiagSpot);
|
|
|
|
pthread_testcancel();
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Executes the virtual member method
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::_try_virtual_invoke(void (pxThread::*method)())
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
(this->*method)();
|
|
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Neat repackaging for STL Runtime errors...
|
|
|
|
//
|
|
|
|
catch (std::runtime_error &ex) {
|
|
|
|
m_except = new Exception::RuntimeError(ex, WX_STR(GetName()));
|
|
|
|
}
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
catch (Exception::RuntimeError &ex) {
|
|
|
|
BaseException *woot = ex.Clone();
|
|
|
|
woot->DiagMsg() += pxsFmt(L"(thread:%s)", WX_STR(GetName()));
|
|
|
|
m_except = woot;
|
|
|
|
}
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
#ifndef PCSX2_DEVBUILD
|
2016-11-12 15:28:37 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Bleh... don't bother with std::exception. runtime_error should catch anything
|
|
|
|
// useful coming out of the core STL libraries anyway, and these are best handled by
|
|
|
|
// the MSVC debugger (or by silent random annoying fail on debug-less linux).
|
|
|
|
/*catch( std::logic_error& ex )
|
2009-09-29 19:16:00 +00:00
|
|
|
{
|
2010-10-18 01:40:49 +00:00
|
|
|
throw BaseException( pxsFmt( L"STL Logic Error (thread:%s): %s",
|
2014-06-29 07:05:03 +00:00
|
|
|
WX_STR(GetName()), WX_STR(fromUTF8( ex.what() )) )
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
);
|
2009-09-29 19:16:00 +00:00
|
|
|
}
|
2009-12-14 12:18:55 +00:00
|
|
|
catch( std::exception& ex )
|
2009-09-29 19:16:00 +00:00
|
|
|
{
|
2010-10-18 01:40:49 +00:00
|
|
|
throw BaseException( pxsFmt( L"STL exception (thread:%s): %s",
|
2014-06-29 07:05:03 +00:00
|
|
|
WX_STR(GetName()), WX_STR(fromUTF8( ex.what() )) )
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
);
|
2009-10-16 04:23:56 +00:00
|
|
|
}*/
|
2016-11-12 15:28:37 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// BaseException -- same deal as LogicErrors.
|
|
|
|
//
|
|
|
|
catch (BaseException &ex) {
|
|
|
|
BaseException *woot = ex.Clone();
|
|
|
|
woot->DiagMsg() += pxsFmt(L"(thread:%s)", WX_STR(GetName()));
|
|
|
|
m_except = woot;
|
|
|
|
}
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
#endif
|
|
|
|
}
|
2009-10-07 19:20:11 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// invoked internally when canceling or exiting the thread. Extending classes should implement
|
|
|
|
// OnCleanupInThread() to extend cleanup functionality.
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::_ThreadCleanup()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
AffinityAssert_AllowFromSelf(pxDiagSpot);
|
|
|
|
_try_virtual_invoke(&pxThread::OnCleanupInThread);
|
|
|
|
m_mtx_InThread.Release();
|
2010-04-27 13:12:03 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
// Must set m_running LAST, as thread destructors depend on this value (it is used
|
|
|
|
// to avoid destruction of the thread until all internal data use has stopped.
|
|
|
|
m_running = false;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
wxString Threading::pxThread::GetName() const
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
ScopedLock lock(m_mtx_ThreadName);
|
|
|
|
return m_name;
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::SetName(const wxString &newname)
|
2010-08-06 05:46:09 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
ScopedLock lock(m_mtx_ThreadName);
|
|
|
|
m_name = newname;
|
2010-08-06 05:46:09 +00:00
|
|
|
}
|
|
|
|
|
2009-10-18 12:30:00 +00:00
|
|
|
// This override is called by PeristentThread when the thread is first created, prior to
|
2009-12-14 12:18:55 +00:00
|
|
|
// calling ExecuteTaskInThread, and after the initial InThread lock has been claimed.
|
|
|
|
// This code is also executed within a "safe" environment, where the creating thread is
|
|
|
|
// blocked against m_sem_event. Make sure to do any necessary variable setup here, without
|
|
|
|
// worry that the calling thread might attempt to test the status of those variables
|
|
|
|
// before initialization has completed.
|
|
|
|
//
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::OnStartInThread()
|
2009-10-18 12:30:00 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
m_detached = false;
|
|
|
|
m_running = true;
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
_platform_specific_OnStartInThread();
|
2009-10-18 12:30:00 +00:00
|
|
|
}
|
|
|
|
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::_internal_execute()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
m_mtx_InThread.Acquire();
|
2009-10-18 12:30:00 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
_DoSetThreadName(GetName());
|
|
|
|
make_curthread_key(this);
|
|
|
|
if (curthread_key)
|
|
|
|
pthread_setspecific(curthread_key, this);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
OnStartInThread();
|
|
|
|
m_sem_startup.Post();
|
2009-10-21 02:23:42 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
_try_virtual_invoke(&pxThread::ExecuteTaskInThread);
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-10-07 19:20:11 +00:00
|
|
|
|
2009-12-14 12:18:55 +00:00
|
|
|
// Called by Start, prior to actual starting of the thread, and after any previous
|
|
|
|
// running thread has been canceled or detached.
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::OnStart()
|
2009-10-18 12:30:00 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
m_native_handle = 0;
|
|
|
|
m_native_id = 0;
|
2010-01-25 15:31:17 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
FrankenMutex(m_mtx_InThread);
|
|
|
|
m_sem_event.Reset();
|
|
|
|
m_sem_startup.Reset();
|
2009-10-18 12:30:00 +00:00
|
|
|
}
|
|
|
|
|
2010-04-27 13:12:03 +00:00
|
|
|
// Extending classes that override this method should always call it last from their
|
2009-12-14 12:18:55 +00:00
|
|
|
// personal implementations.
|
2010-06-19 13:42:32 +00:00
|
|
|
void Threading::pxThread::OnCleanupInThread()
|
2009-10-18 12:30:00 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (curthread_key)
|
|
|
|
pthread_setspecific(curthread_key, NULL);
|
2009-12-14 12:18:55 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
unmake_curthread_key();
|
2010-01-25 15:31:17 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
_platform_specific_OnCleanupInThread();
|
2010-01-25 15:31:17 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
m_native_handle = 0;
|
|
|
|
m_native_id = 0;
|
2016-02-22 21:14:29 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
m_evtsrc_OnDelete.Dispatch(0);
|
2009-10-18 12:30:00 +00:00
|
|
|
}
|
2009-10-07 19:20:11 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
// passed into pthread_create, and is used to dispatch the thread's object oriented
|
|
|
|
// callback function
|
2016-11-12 15:28:37 +00:00
|
|
|
void *Threading::pxThread::_internal_callback(void *itsme)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
if (!pxAssertDev(itsme != NULL, wxNullChar))
|
|
|
|
return NULL;
|
2019-09-01 19:43:28 +00:00
|
|
|
|
|
|
|
internal_callback_helper(itsme);
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
// __try is used in pthread_cleanup_push when CLEANUP_SEH is used as the cleanup model.
|
|
|
|
// That can't be used in a function that has objects that require unwinding (compile
|
|
|
|
// error C2712), so move it into a separate function.
|
|
|
|
void Threading::pxThread::internal_callback_helper(void *itsme)
|
|
|
|
{
|
|
|
|
pxThread &owner = *static_cast<pxThread *>(itsme);
|
2009-09-29 19:16:00 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
pthread_cleanup_push(_pt_callback_cleanup, itsme);
|
|
|
|
owner._internal_execute();
|
|
|
|
pthread_cleanup_pop(true);
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-10-04 09:00:07 +00:00
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
void Threading::pxThread::_DoSetThreadName(const wxString &name)
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
_DoSetThreadName(static_cast<const char *>(name.ToUTF8()));
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
}
|
2009-09-03 11:59:05 +00:00
|
|
|
|
2009-09-16 17:23:02 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// pthread Cond is an evil api that is not suited for Pcsx2 needs.
|
|
|
|
// Let's not use it. (Air)
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
|
2009-02-24 02:08:37 +00:00
|
|
|
#if 0
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
Threading::WaitEvent::WaitEvent()
|
|
|
|
{
|
|
|
|
int err = 0;
|
2009-07-03 20:12:33 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
err = pthread_cond_init(&cond, NULL);
|
|
|
|
err = pthread_mutex_init(&mutex, NULL);
|
|
|
|
}
|
2009-02-09 21:15:56 +00:00
|
|
|
|
2017-05-06 12:22:00 +00:00
|
|
|
Threading::WaitEvent::~WaitEvent()
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
{
|
|
|
|
pthread_cond_destroy( &cond );
|
|
|
|
pthread_mutex_destroy( &mutex );
|
|
|
|
}
|
2009-02-09 21:15:56 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
void Threading::WaitEvent::Set()
|
|
|
|
{
|
|
|
|
pthread_mutex_lock( &mutex );
|
|
|
|
pthread_cond_signal( &cond );
|
|
|
|
pthread_mutex_unlock( &mutex );
|
|
|
|
}
|
2009-02-09 21:15:56 +00:00
|
|
|
|
User Interface:
* Fixed and added better Emulation/System menu updating. Suspend/Resume is more consistent, and Reset grays itself out after being used.
* Entering plugin configurations auto-suspends the emulator.
* Changing plugins in the Configuration PAnel takes effect now without a restart.
* Added preliminary support for an ExtensibleConfirmation Dialog box (contains a sizer you can add content to, and also has an optional "[x] Do not show this again" checkbox).
Bugfixes:
* Added some mutex protection to cdvdNewDiskCB; "just in case."
* Resolved several recursion and deadlock scenarios when (very!) rapidly suspending, resuming, and resetting the emu.
Developments / Code Cleanups:
* Renamed SysCoreThread ExecutionModes: Suspend/Resume are now Opened/Closed (which more accurately reflects the fact they opena nd close the plugins, and helps avoid ambiguity with the "Paused" state).
* Added Exception::ThreadTimedOut, which is now thrown from Semaphore::Wait when recursive wxApp::Yield() calls are detected, and a deadlock occurs (basically cancels the current action which, most of the time, allows for full recovery).
* Major Threading namespace cleanups, documentations, etc.
* Removed wxScopedArray (scopedarray.h) and replaced it with a better implemeneted ScopedArray class.
* Removed toUTF8 class, which I only added a couple weeks ago because I didn't realize wxCharBuffer had an implicit typecast to (char*).
* Implemented more Source/Listener events for Pcsx2App. CoreThread events are sourced properly now, and added SettingsApplied and SettingsLoadSave Sources.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2010 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-16 03:58:29 +00:00
|
|
|
void Threading::WaitEvent::Wait()
|
|
|
|
{
|
|
|
|
pthread_mutex_lock( &mutex );
|
|
|
|
pthread_cond_wait( &cond, &mutex );
|
|
|
|
pthread_mutex_unlock( &mutex );
|
|
|
|
}
|
2009-02-24 02:08:37 +00:00
|
|
|
#endif
|
2009-02-28 20:55:53 +00:00
|
|
|
|
2009-11-22 09:47:52 +00:00
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
// BaseThreadError
|
|
|
|
// --------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
wxString Exception::BaseThreadError::FormatDiagnosticMessage() const
|
2010-04-25 00:31:27 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
wxString null_str(L"Null Thread Object");
|
|
|
|
return pxsFmt(m_message_diag, (m_thread == NULL) ? WX_STR(null_str) : WX_STR(m_thread->GetName()));
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
wxString Exception::BaseThreadError::FormatDisplayMessage() const
|
2010-04-25 00:31:27 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
wxString null_str(L"Null Thread Object");
|
|
|
|
return pxsFmt(m_message_user, (m_thread == NULL) ? WX_STR(null_str) : WX_STR(m_thread->GetName()));
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
|
|
|
|
2016-11-12 15:28:37 +00:00
|
|
|
pxThread &Exception::BaseThreadError::Thread()
|
2009-11-22 09:47:52 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
pxAssertDev(m_thread != NULL, "NULL thread object on ThreadError exception.");
|
|
|
|
return *m_thread;
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|
2016-11-12 15:28:37 +00:00
|
|
|
const pxThread &Exception::BaseThreadError::Thread() const
|
2009-11-22 09:47:52 +00:00
|
|
|
{
|
2016-11-12 15:28:37 +00:00
|
|
|
pxAssertDev(m_thread != NULL, "NULL thread object on ThreadError exception.");
|
|
|
|
return *m_thread;
|
2009-11-22 09:47:52 +00:00
|
|
|
}
|