dvander@1084: /** dvander@1084: * vim: set ts=4 : dvander@1084: * =============================================================== dvander@1084: * SourceMod Threader API dvander@1084: * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. dvander@1084: * =============================================================== dvander@1084: * dvander@1084: * This program is free software; you can redistribute it and/or dvander@1084: * modify it under the terms of the GNU General Public License dvander@1084: * as published by the Free Software Foundation; either version 2 dvander@1084: * of the License, or (at your option) any later version. dvander@1084: * This program is distributed in the hope that it will be useful, dvander@1084: * but WITHOUT ANY WARRANTY; without even the implied warranty of dvander@1084: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dvander@1084: * GNU General Public License for more details. dvander@1084: * dvander@1084: * You should have received a copy of the GNU General Public License dvander@1084: * along with this program; if not, write to the Free Software dvander@1084: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. dvander@1084: * dvander@1084: * Version: $Id$ dvander@1084: */ dvander@1084: dvander@1084: #ifndef _INCLUDE_POSIXTHREADS_H_ dvander@1084: #define _INCLUDE_POSIXTHREADS_H_ dvander@1084: dvander@1084: #include dvander@1084: #include "IThreader.h" dvander@1084: dvander@1084: using namespace SourceMod; dvander@1084: dvander@1084: void *Posix_ThreadGate(void *param); dvander@1084: dvander@1084: class PosixThreader : public IThreader dvander@1084: { dvander@1084: public: dvander@1084: class ThreadHandle : public IThreadHandle dvander@1084: { dvander@1084: friend class PosixThreader; dvander@1084: friend void *Posix_ThreadGate(void *param); dvander@1084: public: dvander@1084: ThreadHandle(IThreader *parent, IThread *run, const ThreadParams *params); dvander@1084: virtual ~ThreadHandle(); dvander@1084: public: dvander@1084: virtual bool WaitForThread(); dvander@1084: virtual void DestroyThis(); dvander@1084: virtual IThreadCreator *Parent(); dvander@1084: virtual void GetParams(ThreadParams *ptparams); dvander@1084: virtual ThreadPriority GetPriority(); dvander@1084: virtual bool SetPriority(ThreadPriority prio); dvander@1084: virtual ThreadState GetState(); dvander@1084: virtual bool Unpause(); dvander@1084: protected: dvander@1084: IThreader *m_parent; //Parent handle dvander@1084: pthread_t m_thread; //Windows HANDLE dvander@1084: ThreadParams m_params; //Current Parameters dvander@1084: IThread *m_run; //Runnable context dvander@1084: pthread_mutex_t m_statelock; dvander@1084: pthread_mutex_t m_runlock; dvander@1084: ThreadState m_state; //internal state dvander@1084: }; dvander@1084: class PosixMutex : public IMutex dvander@1084: { dvander@1084: public: dvander@1084: PosixMutex(pthread_mutex_t m) : m_mutex(m) dvander@1084: { dvander@1084: }; dvander@1084: virtual ~PosixMutex(); dvander@1084: public: dvander@1084: virtual bool TryLock(); dvander@1084: virtual void Lock(); dvander@1084: virtual void Unlock(); dvander@1084: virtual void DestroyThis(); dvander@1084: protected: dvander@1084: pthread_mutex_t m_mutex; dvander@1084: }; dvander@1084: class PosixEventSignal : public IEventSignal dvander@1084: { dvander@1084: public: dvander@1084: PosixEventSignal(); dvander@1084: virtual ~PosixEventSignal(); dvander@1084: public: dvander@1084: virtual void Wait(); dvander@1084: virtual void Signal(); dvander@1084: virtual void DestroyThis(); dvander@1084: protected: dvander@1084: pthread_cond_t m_cond; dvander@1084: pthread_mutex_t m_mutex; dvander@1084: }; dvander@1084: public: dvander@1084: IMutex *MakeMutex(); dvander@1084: void MakeThread(IThread *pThread); dvander@1084: IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags); dvander@1084: IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params); dvander@1084: void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min); dvander@1084: void ThreadSleep(unsigned int ms); dvander@1084: IEventSignal *MakeEventSignal(); dvander@1090: IThreadWorker *MakeWorker(IThreadWorkerCallbacks *hooks, bool threaded); dvander@1084: void DestroyWorker(IThreadWorker *pWorker); dvander@1084: }; dvander@1084: dvander@1084: #if defined SM_DEFAULT_THREADER && !defined SM_MAIN_THREADER dvander@1084: #define SM_MAIN_THREADER PosixThreader; dvander@1084: typedef class PosixThreader MainThreader; dvander@1084: #endif dvander@1084: dvander@1084: #endif //_INCLUDE_POSIXTHREADS_H_