54 行
1.2 KiB
C++
54 行
1.2 KiB
C++
|
#include <nall/thread.hpp>
|
||
|
|
||
|
namespace nall {
|
||
|
|
||
|
#if defined(API_WINDOWS)
|
||
|
|
||
|
NALL_HEADER_INLINE auto WINAPI _threadCallback(void* parameter) -> DWORD {
|
||
|
auto context = (thread::context*)parameter;
|
||
|
context->callback(context->parameter);
|
||
|
delete context;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
NALL_HEADER_INLINE auto thread::close() -> void {
|
||
|
if(handle) {
|
||
|
CloseHandle(handle);
|
||
|
handle = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
NALL_HEADER_INLINE auto thread::join() -> void {
|
||
|
if(handle) {
|
||
|
//wait until the thread has finished executing ...
|
||
|
WaitForSingleObject(handle, INFINITE);
|
||
|
CloseHandle(handle);
|
||
|
handle = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
NALL_HEADER_INLINE auto thread::create(const function<void (uintptr)>& callback, uintptr parameter, u32 stacksize) -> thread {
|
||
|
thread instance;
|
||
|
|
||
|
auto context = new thread::context;
|
||
|
context->callback = callback;
|
||
|
context->parameter = parameter;
|
||
|
|
||
|
instance.handle = CreateThread(nullptr, stacksize, _threadCallback, (void*)context, 0, nullptr);
|
||
|
return instance;
|
||
|
}
|
||
|
|
||
|
NALL_HEADER_INLINE auto thread::detach() -> void {
|
||
|
//Windows threads do not use this concept:
|
||
|
//~thread() frees resources via CloseHandle()
|
||
|
//thread continues to run even after handle is closed
|
||
|
}
|
||
|
|
||
|
NALL_HEADER_INLINE auto thread::exit() -> void {
|
||
|
ExitThread(0);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
}
|