cog/Frameworks/OpenMPT.old/OpenMPT/common/mptThread.h

153 lines
3.0 KiB
C++

/*
* mptThread.h
* -----------
* Purpose: Helper class for running threads, with a more or less platform-independent interface.
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "BuildSettings.h"
#if defined(MPT_ENABLE_THREAD)
#include <thread>
#if defined(MODPLUG_TRACKER)
#if MPT_OS_WINDOWS
#include <windows.h>
#endif // MPT_OS_WINDOWS
#endif // MODPLUG_TRACKER
#endif // MPT_ENABLE_THREAD
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 // !MPT_OS_WINDOWS
enum ThreadPriority
{
ThreadPriorityLowest = -2,
ThreadPriorityLower = -1,
ThreadPriorityNormal = 0,
ThreadPriorityHigh = 1,
ThreadPriorityHighest = 2
};
inline void SetThreadPriority(std::thread & /*t*/ , mpt::ThreadPriority /*priority*/ )
{
// nothing
}
inline void SetCurrentThreadPriority(mpt::ThreadPriority /*priority*/ )
{
// nothing
}
#endif // MPT_OS_WINDOWS && (MPT_COMPILER_MSVC || MPT_COMPILER_CLANG)
#endif // MODPLUG_TRACKER
#if defined(MODPLUG_TRACKER)
#if MPT_OS_WINDOWS
// Default WinAPI thread
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; // For Win9x
threadHandle = CreateThread(NULL, 0, function, userData, 0, &dummy);
}
UnmanagedThread(UnmanagedThread &&) = default;
UnmanagedThread & operator=(UnmanagedThread &&) = default;
UnmanagedThread(const UnmanagedThread &) = delete;
UnmanagedThread & operator=(const UnmanagedThread &) = delete;
// unmanaged, user has to free resources
~UnmanagedThread()
{
}
};
// Thread that operates on a member function
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 // MPT_OS_WINDOWS
#endif // MODPLUG_TRACKER
} // namespace mpt
#endif // MPT_ENABLE_THREAD
OPENMPT_NAMESPACE_END