diff options
Diffstat (limited to 'include/mts/MTS_Thread.h')
-rw-r--r-- | include/mts/MTS_Thread.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/include/mts/MTS_Thread.h b/include/mts/MTS_Thread.h new file mode 100644 index 0000000..7a3472c --- /dev/null +++ b/include/mts/MTS_Thread.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015 by Multi-Tech Systems + * + * This file is part of libmts. + * + * libmts is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * libmts is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libmts. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/*! \file MTS_Thread.h + \brief A thread + \date 15JUN11 + \author Sean Godinez + + A platform independent thread. + */ +#ifndef _MTS_THREAD_H_ +#define _MTS_THREAD_H_ + +#include <mts/MTS_AutoPtr.h> +#include <mts/MTS_Lock.h> +#include <mts/MTS_Condition.h> +#include <mts/MTS_Stdint.h> +#include <mts/MTS_NonCopyable.h> +#include <string> + +#ifdef WIN32 +#include <windows.h> +#else +#include <pthread.h> +#endif + +namespace MTS { + + //! An abstract thread + /*! + A platform independent abstract thread class + + \sa Condition, Lock + */ + + class Thread: private NonCopyable { + + public: + + virtual ~Thread(); //!< Destructs thread + + static void sleep(uint32_t iMillis); //!< Pauses calling thread for the given amount of milliseconds + + const std::string& getName() const; //!< Returns the name of thread + + virtual void start(); //!< Starts thread + virtual void stop(); //!< Ends thread + + void wait(); //!< Block until *this thread has finished executing + void wait(uint32_t millis); //!< Waits on signal for *this thread to finish executing or time is up + + bool isAlive() const; //!< Returns true if it is still running + bool isCanceled() const; //!< Returns true if it has been told to shutdown + bool isDone() const; //!< Returns true if it finished running + bool isManaged() const; //!< Returns true if it should not Destruct itself when done running + + protected: + explicit Thread(const std::string& name, bool managed = true); //!< Explicit Constructor + + private: + +#ifdef WIN32 + static DWORD WINAPI doInBackground(__in LPVOID lpParameter); //!< WIN32 function callback + HANDLE m_pThread;//!< WIN32 Thread Handle +#else + static void* doInBackground(void* parameters); //!< PTHREAD function callback + pthread_t* m_pThread; //!< PTHREAD Thread Handle +#endif + + const std::string m_sName; //!< Thread's name + const bool m_bManaged; //!< Self-cleanup flag + bool m_bComplete; //!< Completed flag + bool m_bCanceled; //!< Canceled/Shutdown flag + + AutoPtr<Lock> m_apThreadLock; //!< Thread Lock + AutoPtr<Lock> m_apStateLock; //!< State Lock + AutoPtr<Condition> m_apCompleteCondition; //!< Thread Completed Condition/Signal + + void cancel(); //!< Cancels thread by setting Canceled/Shutdown flag + void done(); //!< Triggers Thread Completed Condition/Signal + void reset(); //!< Resets Canceled and Completed flags + + + virtual void run() = 0; //!< main() of *this Thread + }; +} + +#endif |