public/IThreader.h
author David Anderson <dvander@alliedmods.net>
Wed Jul 25 01:18:11 2007 +0000 (2007-07-25)
changeset 1163 0bb03cb6277b
parent 1090 5c54e353c019
child 1226 478550a4d5ec
permissions -rw-r--r--
- added MenuAction_DisplayItem callback for plugins
- fixed various bugs in MenuAction_Display
- added an "access" parameter for IMenuManager. better to do this now than later, even though it's not used yet
- hard bumped menu api to change the OnMenuDisplayItem callback. sorry!
dvander@1084
     1
/**
dvander@1084
     2
 * vim: set ts=4 :
dvander@1084
     3
 * ===============================================================
dvander@1084
     4
 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
dvander@1084
     5
 * All rights reserved.
dvander@1084
     6
 * ===============================================================
dvander@1084
     7
 *
dvander@1084
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be 
dvander@1084
     9
 * used or modified under the Terms and Conditions of its License Agreement, 
dvander@1084
    10
 * which is found in public/licenses/LICENSE.txt.  As of this notice, derivative 
dvander@1084
    11
 * works must be licensed under the GNU General Public License (version 2 or 
dvander@1084
    12
 * greater).  A copy of the GPL is included under public/licenses/GPL.txt.
dvander@1084
    13
 * 
dvander@1084
    14
 * To view the latest information, see: http://www.sourcemod.net/license.php
dvander@1084
    15
 *
dvander@1084
    16
 * Version: $Id$
dvander@1084
    17
 */
dvander@1084
    18
dvander@1084
    19
#ifndef _INCLUDE_SOURCEMOD_THREADER_H
dvander@1084
    20
#define _INCLUDE_SOURCEMOD_THREADER_H
dvander@1084
    21
dvander@1084
    22
/**
dvander@1084
    23
 * @file IThreader.h
dvander@1084
    24
 * @brief Contains platform independent routines for threading.
dvander@1084
    25
 */
dvander@1084
    26
dvander@1084
    27
#include <IShareSys.h>
dvander@1084
    28
dvander@1084
    29
#define SMINTERFACE_THREADER_NAME		"IThreader"
dvander@1090
    30
#define SMINTERFACE_THREADER_VERSION	2
dvander@1084
    31
dvander@1084
    32
namespace SourceMod
dvander@1084
    33
{
dvander@1084
    34
	/**
dvander@1084
    35
	 * @brief Thread creation flags
dvander@1084
    36
	 */
dvander@1084
    37
	enum ThreadFlags
dvander@1084
    38
	{
dvander@1084
    39
		Thread_Default = 0,
dvander@1084
    40
		/**
dvander@1084
    41
		 * @brief Auto-release handle on finish
dvander@1084
    42
		 *
dvander@1084
    43
		 * You are not guaranteed the handle for this is valid after
dvander@1084
    44
		 * calling MakeThread(), so never use it until OnTerminate is called.
dvander@1084
    45
		 */
dvander@1084
    46
		Thread_AutoRelease = 1,
dvander@1084
    47
		/**
dvander@1084
    48
		 * @brief Thread is created "suspended", meaning it is inactive until unpaused.
dvander@1084
    49
		 */
dvander@1084
    50
		Thread_CreateSuspended = 2,
dvander@1084
    51
	};
dvander@1084
    52
dvander@1084
    53
	/**
dvander@1084
    54
	 * @brief Specifies thread priority levels.
dvander@1084
    55
	 */
dvander@1084
    56
	enum ThreadPriority
dvander@1084
    57
	{
dvander@1084
    58
		ThreadPrio_Minimum = -8,
dvander@1084
    59
		ThreadPrio_Low = -3,
dvander@1084
    60
		ThreadPrio_Normal = 0,
dvander@1084
    61
		ThreadPrio_High = 3,
dvander@1084
    62
		ThreadPrio_Maximum = 8,
dvander@1084
    63
	};
dvander@1084
    64
dvander@1084
    65
	/**
dvander@1084
    66
	 * @brief The current state of a thread.
dvander@1084
    67
	 */
dvander@1084
    68
	enum ThreadState
dvander@1084
    69
	{
dvander@1084
    70
		Thread_Running = 0,
dvander@1084
    71
		Thread_Paused = 1,
dvander@1084
    72
		Thread_Done = 2,
dvander@1084
    73
	};
dvander@1084
    74
dvander@1084
    75
	/**
dvander@1084
    76
	 * @brief Thread-specific parameters.
dvander@1084
    77
	 */
dvander@1084
    78
	struct ThreadParams
dvander@1084
    79
	{
dvander@1084
    80
		/** Constructor */
dvander@1084
    81
		ThreadParams() : 
dvander@1084
    82
			flags(Thread_Default), 
dvander@1084
    83
			prio(ThreadPrio_Normal)
dvander@1084
    84
		{
dvander@1084
    85
		};
dvander@1084
    86
		ThreadFlags flags;		/**< Flags to set on the thread */
dvander@1084
    87
		ThreadPriority prio;	/**< Priority to set on the thread */
dvander@1084
    88
	};
dvander@1084
    89
dvander@1084
    90
	class IThreadCreator;
dvander@1084
    91
dvander@1084
    92
	/**
dvander@1084
    93
	 * @brief Describes a handle to a thread.
dvander@1084
    94
	 */
dvander@1084
    95
	class IThreadHandle
dvander@1084
    96
	{
dvander@1084
    97
	public:
dvander@1084
    98
		/** Virtual destructor */
dvander@1084
    99
		virtual ~IThreadHandle() { };
dvander@1084
   100
	public:
dvander@1084
   101
		/**
dvander@1084
   102
		 * @brief Pauses parent thread until this thread completes.
dvander@1084
   103
		 * 
dvander@1084
   104
		 * @return			True if successful, false otherwise.
dvander@1084
   105
		 */
dvander@1084
   106
		virtual bool WaitForThread() =0;
dvander@1084
   107
dvander@1084
   108
		/**
dvander@1084
   109
		 * @brief Destroys the thread handle.  This will not necessarily cancel the thread.
dvander@1084
   110
		 */
dvander@1084
   111
		virtual void DestroyThis() =0;
dvander@1084
   112
dvander@1084
   113
		/**
dvander@1084
   114
		 * @brief Returns the parent threader.
dvander@1084
   115
		 *
dvander@1084
   116
		 * @return			IThreadCreator that created this thread.
dvander@1084
   117
		 */
dvander@1084
   118
		virtual IThreadCreator *Parent() =0;
dvander@1084
   119
dvander@1084
   120
		/**
dvander@1084
   121
		 * @brief Returns the thread states.
dvander@1084
   122
		 *
dvander@1084
   123
		 * @param ptparams	Pointer to a ThreadParams buffer.
dvander@1084
   124
		 */
dvander@1084
   125
		virtual void GetParams(ThreadParams *ptparams) =0;
dvander@1084
   126
dvander@1084
   127
		/**
dvander@1084
   128
		 * @brief Returns the thread priority.
dvander@1084
   129
		 *
dvander@1084
   130
		 * @return			Thread priority.
dvander@1084
   131
		 */
dvander@1084
   132
		virtual ThreadPriority GetPriority() =0;
dvander@1084
   133
dvander@1084
   134
		/**
dvander@1084
   135
		 * @brief Sets thread priority.
dvander@1084
   136
		 * NOTE: On Linux, this always returns false.
dvander@1084
   137
		 *
dvander@1084
   138
		 * @param prio		Thread priority to set.
dvander@1084
   139
		 * @return			True if successful, false otherwise.
dvander@1084
   140
		 */
dvander@1084
   141
		virtual bool SetPriority(ThreadPriority prio) =0;
dvander@1084
   142
dvander@1084
   143
		/**
dvander@1084
   144
		 * @brief Returns the thread state.
dvander@1084
   145
		 * 
dvander@1084
   146
		 * @return			Current thread state.
dvander@1084
   147
		 */
dvander@1084
   148
		virtual ThreadState GetState() =0;
dvander@1084
   149
dvander@1084
   150
		/**
dvander@1084
   151
		 * @brief Attempts to unpause a paused thread.
dvander@1084
   152
		 *
dvander@1084
   153
		 * @return			True on success, false otherwise.
dvander@1084
   154
		 */
dvander@1084
   155
		virtual bool Unpause() =0;
dvander@1084
   156
	};
dvander@1084
   157
dvander@1084
   158
	/**
dvander@1084
   159
	 * @brief Handles a single thread's execution.
dvander@1084
   160
	 */
dvander@1084
   161
	class IThread
dvander@1084
   162
	{
dvander@1084
   163
	public:
dvander@1084
   164
		/** Virtual destructor */
dvander@1084
   165
		virtual ~IThread() { };
dvander@1084
   166
	public:
dvander@1084
   167
		/**
dvander@1084
   168
		 * @brief Called when the thread runs (in its own thread).
dvander@1084
   169
		 *
dvander@1084
   170
		 * @param pHandle		Pointer to the thread's handle.
dvander@1084
   171
		 */
dvander@1084
   172
		virtual void RunThread(IThreadHandle *pHandle) =0;
dvander@1084
   173
dvander@1084
   174
		/**
dvander@1084
   175
		 * @brief Called when the thread terminates.  This occurs inside the thread as well.
dvander@1084
   176
		 *
dvander@1084
   177
		 * @param pHandle		Pointer to the thread's handle.
dvander@1084
   178
		 * @param cancel		True if the thread did not finish, false otherwise.
dvander@1084
   179
		 */
dvander@1084
   180
		virtual void OnTerminate(IThreadHandle *pHandle, bool cancel) =0;
dvander@1084
   181
	};
dvander@1084
   182
dvander@1084
   183
dvander@1084
   184
	/**
dvander@1084
   185
	 * @brief Describes a thread creator
dvander@1084
   186
	 */
dvander@1084
   187
	class IThreadCreator
dvander@1084
   188
	{
dvander@1084
   189
	public:
dvander@1084
   190
		/** Virtual Destructor */
dvander@1084
   191
		virtual ~IThreadCreator() { };
dvander@1084
   192
	public:
dvander@1084
   193
		/**
dvander@1084
   194
		 * @brief Creates a basic thread.
dvander@1084
   195
		 *
dvander@1084
   196
		 * @param pThread		IThread pointer for callbacks.
dvander@1084
   197
		 */
dvander@1084
   198
		virtual void MakeThread(IThread *pThread) =0;
dvander@1084
   199
dvander@1084
   200
		/**
dvander@1084
   201
		 * @brief Creates a thread with specific options.
dvander@1084
   202
		 *
dvander@1084
   203
		 * @param pThread		IThread pointer for callbacks.
dvander@1084
   204
		 * @param flags			Flags for the thread.
dvander@1084
   205
		 * @return				IThreadHandle pointer (must be released).
dvander@1084
   206
		 */
dvander@1084
   207
		virtual IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags) =0;
dvander@1084
   208
dvander@1084
   209
		/**
dvander@1084
   210
		 * @brief Creates a thread with specific options.
dvander@1084
   211
		 *
dvander@1084
   212
		 * @param pThread		IThread pointer for callbacks.
dvander@1084
   213
		 * @param params		Extended options for the thread.
dvander@1084
   214
		 * @return				IThreadHandle pointer (must be released).
dvander@1084
   215
		 */
dvander@1084
   216
		virtual IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params) =0;
dvander@1084
   217
dvander@1084
   218
		/**
dvander@1084
   219
		 * @brief Returns the priority bounds.
dvander@1084
   220
		 * Note: On Linux, the min and max are both Thread_Normal.
dvander@1084
   221
		 *
dvander@1084
   222
		 * @param max			Stores the maximum priority level.
dvander@1084
   223
		 * @param min			Stores the minimum priority level.
dvander@1084
   224
		 */
dvander@1084
   225
		virtual void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min) =0;
dvander@1084
   226
	};
dvander@1084
   227
dvander@1084
   228
	/**
dvander@1084
   229
	 * @brief Describes a simple locking mutex.
dvander@1084
   230
	 */
dvander@1084
   231
	class IMutex
dvander@1084
   232
	{
dvander@1084
   233
	public:
dvander@1084
   234
		/** Virtual Destructor */
dvander@1084
   235
		virtual ~IMutex() { };
dvander@1084
   236
	public:
dvander@1084
   237
		/**
dvander@1084
   238
		 * @brief Attempts to lock, but returns instantly.
dvander@1084
   239
		 *
dvander@1084
   240
		 * @return		True if lock was obtained, false otherwise.
dvander@1084
   241
		 */
dvander@1084
   242
		virtual bool TryLock() =0;
dvander@1084
   243
dvander@1084
   244
		/**
dvander@1084
   245
 		 * @brief Attempts to lock by waiting for release.
dvander@1084
   246
		 */
dvander@1084
   247
		virtual void Lock() =0;
dvander@1084
   248
dvander@1084
   249
		/**
dvander@1084
   250
		 * @brief Unlocks the mutex.
dvander@1084
   251
		 */
dvander@1084
   252
		virtual void Unlock() =0;
dvander@1084
   253
dvander@1084
   254
		/**
dvander@1084
   255
		 * @brief Destroys the mutex handle.
dvander@1084
   256
		 */
dvander@1084
   257
		virtual void DestroyThis() =0;
dvander@1084
   258
	};
dvander@1084
   259
dvander@1084
   260
	/**
dvander@1084
   261
	 * @brief Describes a simple "condition variable"/signal lock.
dvander@1084
   262
	 */
dvander@1084
   263
	class IEventSignal
dvander@1084
   264
	{
dvander@1084
   265
	public:
dvander@1084
   266
		/** Virtual Destructor */
dvander@1084
   267
		virtual ~IEventSignal() { };
dvander@1084
   268
	public:
dvander@1084
   269
		/**
dvander@1084
   270
		 * @brief Waits for a signal.
dvander@1084
   271
		 */
dvander@1084
   272
		virtual void Wait() =0;
dvander@1084
   273
dvander@1084
   274
		/** 
dvander@1084
   275
		 * @brief Triggers the signal and resets the signal after triggering.
dvander@1084
   276
		 */
dvander@1084
   277
		virtual void Signal() =0;
dvander@1084
   278
dvander@1084
   279
		/**
dvander@1084
   280
		 * @brief Frees the signal handle.
dvander@1084
   281
		 */
dvander@1084
   282
		virtual void DestroyThis() =0;
dvander@1084
   283
	};
dvander@1084
   284
dvander@1084
   285
	/**
dvander@1084
   286
	 * @brief Describes possible worker states
dvander@1084
   287
	 */
dvander@1084
   288
	enum WorkerState
dvander@1084
   289
	{
dvander@1084
   290
		Worker_Invalid = -3,
dvander@1084
   291
		Worker_Stopped = -2,
dvander@1084
   292
		Worker_Paused = -1,
dvander@1084
   293
		Worker_Running,
dvander@1084
   294
	};
dvander@1084
   295
dvander@1084
   296
	/**
dvander@1084
   297
	 * @brief This is a "worker pool."  A single thread places tasks in a queue.
dvander@1084
   298
	 * Each IThread is then a task, rather than its own separate thread.
dvander@1084
   299
	 */
dvander@1084
   300
	class IThreadWorker : public IThreadCreator
dvander@1084
   301
	{
dvander@1084
   302
	public:
dvander@1084
   303
		/** Virtual Destructor */
dvander@1084
   304
		virtual ~IThreadWorker()
dvander@1084
   305
		{
dvander@1084
   306
		};
dvander@1084
   307
	public:
dvander@1084
   308
		/**
dvander@1084
   309
		 * @brief Runs one "frame" of the worker.
dvander@1084
   310
		 *
dvander@1084
   311
		 * @return			Number of tasks processed.
dvander@1084
   312
		 */
dvander@1084
   313
		virtual unsigned int RunFrame() =0;
dvander@1084
   314
	public:
dvander@1084
   315
		/**
dvander@1084
   316
		 * @brief Pauses the worker.
dvander@1084
   317
		 *
dvander@1084
   318
		 * @return			True on success, false otherwise.
dvander@1084
   319
		 */
dvander@1084
   320
		virtual bool Pause() =0;
dvander@1084
   321
dvander@1084
   322
		/**
dvander@1084
   323
		 * @brief Unpauses the worker.
dvander@1084
   324
		 *
dvander@1084
   325
		 * @return			True on success, false otherwise.
dvander@1084
   326
		 */
dvander@1084
   327
		virtual bool Unpause() =0;
dvander@1084
   328
dvander@1084
   329
		/** 
dvander@1084
   330
		 * @brief Starts the worker thread.
dvander@1084
   331
		 *
dvander@1084
   332
		 * @return			True on success, false otherwise.
dvander@1084
   333
		 */
dvander@1084
   334
		virtual bool Start() =0;
dvander@1084
   335
dvander@1084
   336
		/**
dvander@1084
   337
		 * @brief Stops the worker thread.
dvander@1084
   338
		 *
dvander@1084
   339
		 * @param flush		If true, all remaining tasks will be cancelled.
dvander@1084
   340
		 *					Otherwise, the threader will wait until the queue is empty.
dvander@1084
   341
		 * @return			True on success, false otherwise.
dvander@1084
   342
		 */
dvander@1084
   343
		virtual bool Stop(bool flush) =0;
dvander@1084
   344
dvander@1084
   345
		/**
dvander@1084
   346
		 * @brief Returns the status of the worker.
dvander@1084
   347
		 *
dvander@1084
   348
		 * @param numThreads	Pointer to store number of threads in the queue.
dvander@1084
   349
		 * @return				State of the worker.
dvander@1084
   350
		 */
dvander@1084
   351
		virtual WorkerState GetStatus(unsigned int *numThreads) =0;
dvander@1084
   352
	};
dvander@1084
   353
dvander@1084
   354
	/**
dvander@1090
   355
	 * @brief Describes thread worker callbacks.
dvander@1090
   356
	 */
dvander@1090
   357
	class IThreadWorkerCallbacks
dvander@1090
   358
	{
dvander@1090
   359
	public:
dvander@1090
   360
		/**
dvander@1090
   361
		 * @brief Called when the worker thread is initialized.
dvander@1090
   362
		 *
dvander@1090
   363
		 * @param pWorker		Pointer to the worker.
dvander@1090
   364
		 */
dvander@1090
   365
		virtual void OnWorkerStart(IThreadWorker *pWorker)
dvander@1090
   366
		{
dvander@1090
   367
		}
dvander@1090
   368
dvander@1090
   369
		/**
dvander@1090
   370
		 * @brief Called when the worker thread is cleaning up.
dvander@1090
   371
		 *
dvander@1090
   372
		 * @param pWorker		Pointer to the worker.
dvander@1090
   373
		 */
dvander@1090
   374
		virtual void OnWorkerStop(IThreadWorker *pWorker)
dvander@1090
   375
		{
dvander@1090
   376
		}
dvander@1090
   377
	};
dvander@1090
   378
dvander@1090
   379
	/**
dvander@1084
   380
	 * @brief Describes a threading system
dvander@1084
   381
	 */
dvander@1084
   382
	class IThreader : public SMInterface, public IThreadCreator
dvander@1084
   383
	{
dvander@1084
   384
	public:
dvander@1084
   385
		virtual const char *GetInterfaceName()
dvander@1084
   386
		{
dvander@1084
   387
			return SMINTERFACE_THREADER_NAME;
dvander@1084
   388
		}
dvander@1084
   389
		virtual unsigned int GetInterfaceVersion()
dvander@1084
   390
		{
dvander@1084
   391
			return SMINTERFACE_THREADER_VERSION;
dvander@1084
   392
		}
dvander@1090
   393
		virtual bool IsVersionCompatible(unsigned int version)
dvander@1090
   394
		{
dvander@1090
   395
			if (version < 2)
dvander@1090
   396
			{
dvander@1090
   397
				return false;
dvander@1090
   398
			}
dvander@1090
   399
			return SMInterface::IsVersionCompatible(version);
dvander@1090
   400
		}
dvander@1084
   401
	public:
dvander@1084
   402
		/**
dvander@1084
   403
		 * @brief Creates a mutex (mutual exclusion lock).
dvander@1084
   404
		 *
dvander@1084
   405
		 * @return			A new IMutex pointer (must be destroyed).
dvander@1084
   406
		 */
dvander@1084
   407
		virtual IMutex *MakeMutex() =0;
dvander@1084
   408
dvander@1084
   409
		/**
dvander@1084
   410
		 * @brief Sleeps the calling thread for a number of milliseconds.
dvander@1084
   411
		 *
dvander@1084
   412
		 * @param ms		Millisecond count to sleep.
dvander@1084
   413
		 */
dvander@1084
   414
		virtual void ThreadSleep(unsigned int ms) =0;
dvander@1084
   415
dvander@1084
   416
		/**
dvander@1084
   417
		 * @brief Creates a non-signalled event.
dvander@1084
   418
		 *
dvander@1084
   419
		 * @return			A new IEventSignal pointer (must be destroyed).
dvander@1084
   420
		 */
dvander@1084
   421
		virtual IEventSignal *MakeEventSignal() =0;
dvander@1084
   422
dvander@1084
   423
		/**
dvander@1084
   424
		 * @brief Creates a thread worker.
dvander@1084
   425
		 *
dvander@1090
   426
		 * @param hooks		Optional pointer to callback interface.
dvander@1084
   427
		 * @param threaded	If true, the worker will be threaded.
dvander@1084
   428
		 *					If false, the worker will require manual frame execution.
dvander@1084
   429
		 * @return			A new IThreadWorker pointer (must be destroyed).
dvander@1084
   430
		 */
dvander@1090
   431
		virtual IThreadWorker *MakeWorker(IThreadWorkerCallbacks *hooks, bool threaded) =0;
dvander@1084
   432
dvander@1084
   433
		/**
dvander@1084
   434
		 * @brief Destroys an IThreadWorker pointer.
dvander@1084
   435
		 *
dvander@1084
   436
		 * @param pWorker	IThreadWorker pointer to destroy.
dvander@1084
   437
		 */
dvander@1084
   438
		virtual void DestroyWorker(IThreadWorker *pWorker) =0;
dvander@1084
   439
	};
dvander@1084
   440
};
dvander@1084
   441
dvander@1084
   442
#endif //_INCLUDE_SOURCEMOD_THREADER_H