etqw-sdk/source/idlib/sys/threading/SysThread_win.cpp

159 lines
3.4 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#include "precompiled.h"
#pragma hdrstop
#include "SysThread.h"
#include <process.h>
/*
=============
sdSysThread::Create
=============
*/
bool sdSysThread::Create( threadProc_t proc, void* parms, threadHandle_t& handle, threadPriority_e priority, unsigned int stackSize ) {
handle.handle = reinterpret_cast< HANDLE >( ::_beginthreadex( NULL, stackSize, proc, parms, CREATE_SUSPENDED, &handle.id ) );
if ( NULL == handle.handle ) {
return false;
}
SetPriority( handle, priority );
return true;
}
/*
=============
sdSysThread::Start
=============
*/
bool sdSysThread::Start( threadHandle_t& handle ) {
if ( -1 == ::ResumeThread( handle.handle ) ) {
return false;
}
return true;
}
/*
=============
sdSysThread::Suspend
=============
*/
bool sdSysThread::Suspend( threadHandle_t& handle ) {
if ( -1 == ::SuspendThread( handle.handle ) ) {
return false;
}
return true;
}
/*
=============
sdSysThread::Resume
=============
*/
bool sdSysThread::Resume( threadHandle_t& handle ) {
if ( -1 == ::ResumeThread( handle.handle ) ) {
return false;
}
return true;
}
/*
=============
sdSysThread::Exit
=============
*/
unsigned int sdSysThread::Exit( unsigned int retVal ) {
::_endthreadex( retVal );
return retVal;
}
/*
=============
sdSysThread::Join
=============
*/
void sdSysThread::Join( threadHandle_t& handle ) {
::WaitForSingleObject( handle.handle, INFINITE );
}
/*
=============
sdSysThread::Destroy
=============
*/
void sdSysThread::Destroy( threadHandle_t& handle ) {
::CloseHandle( handle.handle );
}
/*
=============
sdSysThread::SetPriority
=============
*/
void sdSysThread::SetPriority( threadHandle_t& handle, const threadPriority_e priority ) {
switch( priority ) {
case THREAD_LOWEST:
::SetThreadPriority( handle.handle, THREAD_PRIORITY_LOWEST );
break;
case THREAD_BELOW_NORMAL:
::SetThreadPriority( handle.handle, THREAD_PRIORITY_BELOW_NORMAL );
break;
default:
case THREAD_NORMAL:
::SetThreadPriority( handle.handle, THREAD_PRIORITY_NORMAL );
break;
case THREAD_ABOVE_NORMAL:
::SetThreadPriority( handle.handle, THREAD_PRIORITY_ABOVE_NORMAL );
break;
case THREAD_HIGHEST:
::SetThreadPriority( handle.handle, THREAD_PRIORITY_HIGHEST );
break;
}
}
/*
=============
sdSysThread::SetProcessor
=============
*/
void sdSysThread::SetProcessor( threadHandle_t& handle, const unsigned int processor ) {
#if defined( _XENON )
::XSetThreadProcessor( handle.handle, processor );
#else
::SetThreadAffinityMask( handle.handle, 1 << processor );
#endif
}
/*
=============
sdSysThread::SetName
=============
*/
void sdSysThread::SetName( threadHandle_t& handle, const char* name ) {
//#if defined( _WIN32_WINNT ) && ( _WIN32_WINNT >=0x0501 )
struct THREADNAME_INFO {
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in user addr space)
DWORD dwThreadID; // thread ID (-1=caller thread)
DWORD dwFlags; // reserved for future use, must be zero
};
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = name;
//info.dwThreadID = ::GetThreadId( handle );
info.dwThreadID = handle.id;
info.dwFlags = 0;
if ( info.dwThreadID != 0 ) {
__try {
::RaiseException( 0x406D1388, 0, sizeof( info ) / sizeof( DWORD ), (ULONG_PTR *)&info );
}
__except( EXCEPTION_CONTINUE_EXECUTION ) {
}
}
//#endif
}