core/thread/BaseWorker.h
author David Anderson <dvander@alliedmods.net>
Thu Jul 12 16:57:26 2007 +0000 (2007-07-12)
changeset 1090 5c54e353c019
parent 1084 241c1b9b4048
child 1231 17badaf66ce4
permissions -rw-r--r--
- added callback functionality to IThreadWorker
- added exposure of IThreader to sample sdk
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_SOURCEMOD_BASEWORKER_H
dvander@1084
    16
#define _INCLUDE_SOURCEMOD_BASEWORKER_H
dvander@1084
    17
dvander@1084
    18
#include "sh_list.h"
dvander@1084
    19
#include "ThreadSupport.h"
dvander@1084
    20
dvander@1084
    21
#define SM_DEFAULT_THREADS_PER_FRAME	1
dvander@1084
    22
dvander@1084
    23
class BaseWorker;
dvander@1084
    24
dvander@1084
    25
//SW = Simple Wrapper
dvander@1084
    26
class SWThreadHandle : public IThreadHandle
dvander@1084
    27
{
dvander@1084
    28
	friend class BaseWorker;
dvander@1084
    29
public:
dvander@1084
    30
	SWThreadHandle(IThreadCreator *parent, const ThreadParams *p, IThread *thread);
dvander@1084
    31
	IThread *GetThread();
dvander@1084
    32
public:
dvander@1084
    33
	//NOTE: We don't support this by default.
dvander@1084
    34
	//It's specific usage that'd require many mutexes
dvander@1084
    35
	virtual bool WaitForThread();
dvander@1084
    36
public:
dvander@1084
    37
	virtual void DestroyThis();
dvander@1084
    38
	virtual IThreadCreator *Parent();
dvander@1084
    39
	virtual void GetParams(ThreadParams *ptparams);
dvander@1084
    40
public:
dvander@1084
    41
	//Priorities not supported by default.
dvander@1084
    42
	virtual ThreadPriority GetPriority();
dvander@1084
    43
	virtual bool SetPriority(ThreadPriority prio);
dvander@1084
    44
public:
dvander@1084
    45
	virtual ThreadState GetState();
dvander@1084
    46
	virtual bool Unpause();
dvander@1084
    47
private:
dvander@1084
    48
	ThreadState m_state;
dvander@1084
    49
	ThreadParams m_params;
dvander@1084
    50
	IThreadCreator *m_parent;
dvander@1084
    51
	IThread *pThread;
dvander@1084
    52
};
dvander@1084
    53
dvander@1084
    54
class BaseWorker : public IThreadWorker
dvander@1084
    55
{
dvander@1084
    56
public:
dvander@1090
    57
	BaseWorker(IThreadWorkerCallbacks *hooks);
dvander@1084
    58
	virtual ~BaseWorker();
dvander@1084
    59
public:	//IWorker
dvander@1084
    60
	virtual unsigned int RunFrame();
dvander@1084
    61
	//Controls the worker
dvander@1084
    62
	virtual bool Pause();
dvander@1084
    63
	virtual bool Unpause();
dvander@1084
    64
	virtual bool Start();
dvander@1084
    65
	virtual bool Stop(bool flush_cancel);
dvander@1084
    66
	//Flushes out any remaining threads
dvander@1084
    67
	virtual unsigned int Flush(bool flush_cancel);
dvander@1084
    68
	//returns status and number of threads in queue
dvander@1084
    69
	virtual WorkerState GetStatus(unsigned int *numThreads);
dvander@1084
    70
public:	//IThreadCreator
dvander@1084
    71
	virtual void MakeThread(IThread *pThread);
dvander@1084
    72
	virtual IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags);
dvander@1084
    73
	virtual IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params);
dvander@1084
    74
	virtual void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min);
dvander@1084
    75
public:	//BaseWorker
dvander@1084
    76
	virtual void AddThreadToQueue(SWThreadHandle *pHandle);
dvander@1084
    77
	virtual SWThreadHandle *PopThreadFromQueue();
dvander@1084
    78
	virtual void SetMaxThreadsPerFrame(unsigned int threads);
dvander@1084
    79
	virtual unsigned int GetMaxThreadsPerFrame();
dvander@1084
    80
protected:
dvander@1084
    81
	SourceHook::List<SWThreadHandle *> m_ThreadQueue;
dvander@1084
    82
	unsigned int m_perFrame;
dvander@1084
    83
	volatile WorkerState m_state;
dvander@1090
    84
	IThreadWorkerCallbacks *m_pHooks;
dvander@1084
    85
};
dvander@1084
    86
dvander@1084
    87
#endif //_INCLUDE_SOURCEMOD_BASEWORKER_H