aboutsummaryrefslogtreecommitdiff
path: root/src/3rdParty/efsw/platform/win/ThreadImpl.cpp
blob: d0fde8b3dc2464734cbe971ab00c56a3bb7f9e41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <assert.h>
#include <efsw/Thread.hpp>
#include <efsw/platform/win/ThreadImpl.hpp>

#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32

#include <efsw/Debug.hpp>

namespace efsw { namespace Platform {

ThreadImpl::ThreadImpl( Thread* owner ) {
	mThread = reinterpret_cast<HANDLE>(
		_beginthreadex( NULL, 0, &ThreadImpl::entryPoint, owner, 0, &mThreadId ) );

	if ( !mThread ) {
		efDEBUG( "Failed to create thread\n" );
	}
}

ThreadImpl::~ThreadImpl() {
	if ( mThread ) {
		CloseHandle( mThread );
	}
}

void ThreadImpl::wait() {
	// Wait for the thread to finish, no timeout
	if ( mThread ) {
		assert( mThreadId != GetCurrentThreadId() ); // A thread cannot wait for itself!

		WaitForSingleObject( mThread, INFINITE );
	}
}

void ThreadImpl::terminate() {
	if ( mThread ) {
		TerminateThread( mThread, 0 );
	}
}

unsigned int __stdcall ThreadImpl::entryPoint( void* userData ) {
	// The Thread instance is stored in the user data
	Thread* owner = static_cast<Thread*>( userData );

	// Forward to the owner
	owner->run();

	// Optional, but it is cleaner
	_endthreadex( 0 );

	return 0;
}

}} // namespace efsw::Platform

#endif