//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: thread.inl
//      Краткое описание: класс, представляющий поток
//

namespace ker
{
	inline Thread::Thread()
	{
		thread_handle = NULL;
		thread_id = 0;
	};

	inline Thread::Thread(LPTHREAD_START_ROUTINE threadproc, LPVOID params, bool is_suspend)
	{
		create(threadproc, params, is_suspend);
	};

	inline Thread::~Thread()
	{
		if(thread_handle)
		{
			DWORD exitCode;
			GetExitCodeThread(thread_handle, &exitCode);
			TerminateThread(thread_handle, exitCode);
			thread_handle = NULL;
		};
	};

	inline bool Thread::create(LPTHREAD_START_ROUTINE threadproc, LPVOID params, bool is_suspend)
	{
		DWORD flags = is_suspend ? CREATE_SUSPENDED : 0;
		thread_handle = CreateThread(NULL, 0, threadproc, params, flags, &thread_id);
		priority = NORMAL_PRIORITY;
		if(!thread_handle)
			return false;
		return true;
	};

	inline bool Thread::resume()
	{
		return ResumeThread(thread_handle) != -1;
	};

	inline bool Thread::suspend()
	{
		return SuspendThread(thread_handle) != -1;
	};

	inline bool Thread::setThreadPriority(const ThreadPriority& thread_pr)
	{
		if(!SetThreadPriority(thread_handle, thread_pr))
			return false;
		priority = thread_pr;
		return true;
	};

	inline const ThreadPriority& Thread::getThreadPriority() const
	{
		return priority;
	};

	inline HANDLE Thread::getThreadHandle() const
	{
		return thread_handle;
	};

	inline DWORD Thread::getThreadID() const
	{
		return thread_id;
	};
};
