core/thread/WinThreads.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 09 16:10:23 2007 +0000 (2007-07-09)
changeset 1084 241c1b9b4048
child 1087 a7ee64117faf
permissions -rw-r--r--
added threader to core (not used yet)
dvander@1084
     1
/**
dvander@1084
     2
 * vim: set ts=4 :
dvander@1084
     3
 * ===============================================================
dvander@1084
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1084
     5
 * ===============================================================
dvander@1084
     6
 *
dvander@1084
     7
 * This file is not open source and may not be copied without explicit
dvander@1084
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@1084
     9
 * in whole or significant part.
dvander@1084
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@1084
    11
 *
dvander@1084
    12
 * Version: $Id$
dvander@1084
    13
 */
dvander@1084
    14
dvander@1084
    15
#ifndef _INCLUDE_WINTHREADS_H_
dvander@1084
    16
#define _INCLUDE_WINTHREADS_H_
dvander@1084
    17
dvander@1084
    18
#include <windows.h>
dvander@1084
    19
#include "IThreader.h"
dvander@1084
    20
dvander@1084
    21
using namespace SourceMod;
dvander@1084
    22
dvander@1084
    23
DWORD WINAPI Win32_ThreadGate(LPVOID param);
dvander@1084
    24
dvander@1084
    25
class WinThreader : public IThreader
dvander@1084
    26
{
dvander@1084
    27
public:
dvander@1084
    28
	class ThreadHandle : public IThreadHandle
dvander@1084
    29
	{
dvander@1084
    30
		friend class WinThreader;
dvander@1084
    31
		friend DWORD WINAPI Win32_ThreadGate(LPVOID param);
dvander@1084
    32
	public:
dvander@1084
    33
		ThreadHandle(IThreader *parent, HANDLE hthread, IThread *run, const ThreadParams *params);
dvander@1084
    34
		virtual ~ThreadHandle();
dvander@1084
    35
	public:
dvander@1084
    36
		virtual bool WaitForThread();
dvander@1084
    37
		virtual void DestroyThis();
dvander@1084
    38
		virtual IThreadCreator *Parent();
dvander@1084
    39
		virtual void GetParams(ThreadParams *ptparams);
dvander@1084
    40
		virtual ThreadPriority GetPriority();
dvander@1084
    41
		virtual bool SetPriority(ThreadPriority prio);
dvander@1084
    42
		virtual ThreadState GetState();
dvander@1084
    43
		virtual bool Unpause();
dvander@1084
    44
	protected:
dvander@1084
    45
		IThreader *m_parent;		//Parent handle
dvander@1084
    46
		HANDLE m_thread;			//Windows HANDLE	
dvander@1084
    47
		ThreadParams m_params;		//Current Parameters
dvander@1084
    48
		IThread *m_run;	//Runnable context
dvander@1084
    49
		ThreadState m_state;		//internal state
dvander@1084
    50
		CRITICAL_SECTION m_crit;
dvander@1084
    51
	};
dvander@1084
    52
	class WinMutex : public IMutex
dvander@1084
    53
	{
dvander@1084
    54
	public:
dvander@1084
    55
		WinMutex(HANDLE mutex) : m_mutex(mutex)
dvander@1084
    56
		{
dvander@1084
    57
		};
dvander@1084
    58
		virtual ~WinMutex();
dvander@1084
    59
	public:
dvander@1084
    60
		virtual bool TryLock();
dvander@1084
    61
		virtual void Lock();
dvander@1084
    62
		virtual void Unlock();
dvander@1084
    63
		virtual void DestroyThis();
dvander@1084
    64
	protected:
dvander@1084
    65
		HANDLE m_mutex;
dvander@1084
    66
	};
dvander@1084
    67
	class WinEvent : public IEventSignal
dvander@1084
    68
	{
dvander@1084
    69
	public:
dvander@1084
    70
		WinEvent(HANDLE event) : m_event(event)
dvander@1084
    71
		{
dvander@1084
    72
		};
dvander@1084
    73
		virtual ~WinEvent();
dvander@1084
    74
	public:
dvander@1084
    75
		virtual void Wait();
dvander@1084
    76
		virtual void Signal();
dvander@1084
    77
		virtual void DestroyThis();
dvander@1084
    78
	public:
dvander@1084
    79
		HANDLE m_event;
dvander@1084
    80
	};
dvander@1084
    81
public:
dvander@1084
    82
	IMutex *MakeMutex();
dvander@1084
    83
	void MakeThread(IThread *pThread);
dvander@1084
    84
	IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags);
dvander@1084
    85
	IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params);
dvander@1084
    86
	void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min);
dvander@1084
    87
	void ThreadSleep(unsigned int ms);
dvander@1084
    88
	IEventSignal *MakeEventSignal();
dvander@1084
    89
	IThreadWorker *MakeWorker(bool threaded);
dvander@1084
    90
	void DestroyWorker(IThreadWorker *pWorker);
dvander@1084
    91
};
dvander@1084
    92
dvander@1084
    93
#if defined SM_DEFAULT_THREADER && !defined SM_MAIN_THREADER
dvander@1084
    94
#define SM_MAIN_THREADER WinThreader;
dvander@1084
    95
typedef class WinThreader MainThreader;
dvander@1084
    96
#endif
dvander@1084
    97
dvander@1084
    98
#endif //_INCLUDE_WINTHREADS_H_