core/thread/PosixThreads.h
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
child 2289 44045ead61cd
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
ds@1952
     1
/**
ds@1952
     2
 * vim: set ts=4 :
ds@1952
     3
 * =============================================================================
ds@1952
     4
 * SourceMod
ds@1952
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1952
     6
 * =============================================================================
ds@1952
     7
 *
ds@1952
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1952
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1952
    10
 * Free Software Foundation.
ds@1952
    11
 * 
ds@1952
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1952
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1952
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1952
    15
 * details.
ds@1952
    16
 *
ds@1952
    17
 * You should have received a copy of the GNU General Public License along with
ds@1952
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1952
    19
 *
ds@1952
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1952
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1952
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1952
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1952
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1952
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1952
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1952
    27
 * or <http://www.sourcemod.net/license.php>.
ds@1952
    28
 *
ds@1952
    29
 * Version: $Id$
ds@1952
    30
 */
ds@1952
    31
ds@1952
    32
#ifndef _INCLUDE_POSIXTHREADS_H_
ds@1952
    33
#define _INCLUDE_POSIXTHREADS_H_
ds@1952
    34
ds@1952
    35
#include <pthread.h>
ds@1952
    36
#include "IThreader.h"
ds@1952
    37
ds@1952
    38
using namespace SourceMod;
ds@1952
    39
ds@1952
    40
void *Posix_ThreadGate(void *param);
ds@1952
    41
ds@1952
    42
class PosixThreader : public IThreader
ds@1952
    43
{
ds@1952
    44
public:
ds@1952
    45
	class ThreadHandle : public IThreadHandle
ds@1952
    46
	{
ds@1952
    47
		friend class PosixThreader;
ds@1952
    48
		friend void *Posix_ThreadGate(void *param);
ds@1952
    49
	public:
ds@1952
    50
		ThreadHandle(IThreader *parent, IThread *run, const ThreadParams *params);
ds@1952
    51
		virtual ~ThreadHandle();
ds@1952
    52
	public:
ds@1952
    53
		virtual bool WaitForThread();
ds@1952
    54
		virtual void DestroyThis();
ds@1952
    55
		virtual IThreadCreator *Parent();
ds@1952
    56
		virtual void GetParams(ThreadParams *ptparams);
ds@1952
    57
		virtual ThreadPriority GetPriority();
ds@1952
    58
		virtual bool SetPriority(ThreadPriority prio);
ds@1952
    59
		virtual ThreadState GetState();
ds@1952
    60
		virtual bool Unpause();
ds@1952
    61
	protected:
ds@1952
    62
		IThreader *m_parent;		//Parent handle
ds@1952
    63
		pthread_t m_thread;			//Windows HANDLE	
ds@1952
    64
		ThreadParams m_params;		//Current Parameters
ds@1952
    65
		IThread *m_run;	//Runnable context
ds@1952
    66
		pthread_mutex_t m_statelock;
ds@1952
    67
		pthread_mutex_t m_runlock;
ds@1952
    68
		ThreadState m_state;		//internal state
ds@1952
    69
	};
ds@1952
    70
	class PosixMutex : public IMutex
ds@1952
    71
	{
ds@1952
    72
	public:
ds@1952
    73
		PosixMutex(pthread_mutex_t m) : m_mutex(m)
ds@1952
    74
		{
ds@1952
    75
		};
ds@1952
    76
		virtual ~PosixMutex();
ds@1952
    77
	public:
ds@1952
    78
		virtual bool TryLock();
ds@1952
    79
		virtual void Lock();
ds@1952
    80
		virtual void Unlock();
ds@1952
    81
		virtual void DestroyThis();
ds@1952
    82
	protected:
ds@1952
    83
		pthread_mutex_t m_mutex;
ds@1952
    84
	};
ds@1952
    85
	class PosixEventSignal : public IEventSignal
ds@1952
    86
	{
ds@1952
    87
	public:
ds@1952
    88
		PosixEventSignal();
ds@1952
    89
		virtual ~PosixEventSignal();
ds@1952
    90
	public:
ds@1952
    91
		virtual void Wait();
ds@1952
    92
		virtual void Signal();
ds@1952
    93
		virtual void DestroyThis();
ds@1952
    94
	protected:
ds@1952
    95
		pthread_cond_t m_cond;
ds@1952
    96
		pthread_mutex_t m_mutex;
ds@1952
    97
	};
ds@1952
    98
public:
ds@1952
    99
	IMutex *MakeMutex();
ds@1952
   100
	void MakeThread(IThread *pThread);
ds@1952
   101
	IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags);
ds@1952
   102
	IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params);
ds@1952
   103
	void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min);
ds@1952
   104
	void ThreadSleep(unsigned int ms);
ds@1952
   105
	IEventSignal *MakeEventSignal();
ds@1952
   106
	IThreadWorker *MakeWorker(IThreadWorkerCallbacks *hooks, bool threaded);
ds@1952
   107
	void DestroyWorker(IThreadWorker *pWorker);
ds@1952
   108
};
ds@1952
   109
ds@1952
   110
#if defined SM_DEFAULT_THREADER && !defined SM_MAIN_THREADER
ds@1952
   111
#define SM_MAIN_THREADER PosixThreader;
ds@1952
   112
typedef class PosixThreader MainThreader;
ds@1952
   113
#endif
ds@1952
   114
ds@1952
   115
#endif //_INCLUDE_POSIXTHREADS_H_