#pragma once
#include "BuildSettings.h"
#if defined(MPT_ENABLE_THREAD)
#include <thread>
#if defined(MODPLUG_TRACKER)
#if MPT_OS_WINDOWS
#include <windows.h>
#endif #endif
#endif
OPENMPT_NAMESPACE_BEGIN
#if defined(MPT_ENABLE_THREAD)
namespace mpt
{
#if defined(MODPLUG_TRACKER)
#if MPT_OS_WINDOWS && (MPT_COMPILER_MSVC || MPT_COMPILER_CLANG)
enum ThreadPriority
{
ThreadPriorityLowest = THREAD_PRIORITY_LOWEST,
ThreadPriorityLower = THREAD_PRIORITY_BELOW_NORMAL,
ThreadPriorityNormal = THREAD_PRIORITY_NORMAL,
ThreadPriorityHigh = THREAD_PRIORITY_ABOVE_NORMAL,
ThreadPriorityHighest = THREAD_PRIORITY_HIGHEST
};
inline void SetThreadPriority(std::thread &t, mpt::ThreadPriority priority)
{
::SetThreadPriority(t.native_handle(), priority);
}
inline void SetCurrentThreadPriority(mpt::ThreadPriority priority)
{
::SetThreadPriority(GetCurrentThread(), priority);
}
#else
enum ThreadPriority
{
ThreadPriorityLowest = -2,
ThreadPriorityLower = -1,
ThreadPriorityNormal = 0,
ThreadPriorityHigh = 1,
ThreadPriorityHighest = 2
};
inline void SetThreadPriority(std::thread & , mpt::ThreadPriority )
{
}
inline void SetCurrentThreadPriority(mpt::ThreadPriority )
{
}
#endif
#endif
#if defined(MODPLUG_TRACKER)
#if MPT_OS_WINDOWS
class UnmanagedThread
{
protected:
HANDLE threadHandle;
public:
operator HANDLE& () { return threadHandle; }
operator bool () const { return threadHandle != nullptr; }
UnmanagedThread() : threadHandle(nullptr) { }
UnmanagedThread(LPTHREAD_START_ROUTINE function, void *userData = nullptr)
{
DWORD dummy = 0; threadHandle = CreateThread(NULL, 0, function, userData, 0, &dummy);
}
};
template<typename T, void (T::*Fun)()>
class UnmanagedThreadMember : public mpt::UnmanagedThread
{
protected:
static DWORD WINAPI wrapperFunc(LPVOID param)
{
(static_cast<T *>(param)->*Fun)();
return 0;
}
public:
UnmanagedThreadMember(T *instance) : mpt::UnmanagedThread(wrapperFunc, instance) { }
};
inline void SetThreadPriority(mpt::UnmanagedThread &t, mpt::ThreadPriority priority)
{
::SetThreadPriority(t, priority);
}
#endif
#endif
}
#endif
OPENMPT_NAMESPACE_END