summaryrefslogtreecommitdiff
path: root/src/uThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/uThread.cpp')
-rw-r--r--src/uThread.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/uThread.cpp b/src/uThread.cpp
new file mode 100644
index 0000000..6a7a4a5
--- /dev/null
+++ b/src/uThread.cpp
@@ -0,0 +1,156 @@
+/*
+ * uThread.cpp
+ *
+ * Created on: 2013. 9. 10.
+ * Author: kos
+ */
+
+#include "uThread.h"
+
+#include <stdio.h>
+#include <pthread.h>
+
+//#include "uLogger.h"
+
+using namespace std;
+//-------------------------------------------------------------------------------
+
+uThread::uThread(std::string aName, uThread::EXIT_TYPE aExitType)
+ : mTid(0), mState(uThread::STATE_READY), mExitType(aExitType), mName(aName)
+{
+}
+//-------------------------------------------------------------------------------
+
+uThread::~uThread()
+{
+ if(mState == uThread::STATE_ZOMBIE) {
+ Join(mTid);
+ }
+}
+//-------------------------------------------------------------------------------
+
+bool uThread::Start()
+{
+#ifdef SUPPORT_PTHREAD_ATTR
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ if(mExitType == uThread::TYPE_JOINABLE) {
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ } else {
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ }
+#endif /* SUPPORT_PTHREAD_ATTR */
+ if(pthread_create(&mTid, NULL, ThreadMain, reinterpret_cast<void *>(this)) == 0) {
+#ifndef SUPPORT_PTHREAD_ATTR
+ if(mExitType == uThread::TYPE_DETACHABLE) {
+ pthread_detach(mTid);
+ }
+#endif /* !SUPPORT_PTHREAD_ATTR */
+ } else {
+ SetState(uThread::STATE_ABORTED);
+#ifdef SUPPORT_PTHREAD_ATTR
+ pthread_attr_destroy(&attr);
+#endif /* SUPPORT_PTHREAD_ATTR */
+ return false;
+ }
+ //cout << mTid << endl;
+#ifdef SUPPORT_PTHREAD_ATTR
+ pthread_attr_destroy(&attr);
+#endif /* SUPPORT_PTHREAD_ATTR */
+ return true;
+}
+//-------------------------------------------------------------------------------
+
+void* uThread::ThreadMain(void* aParam)
+{
+ uThread* thiz = reinterpret_cast<uThread*>(aParam);
+
+ std::string threadName = thiz->GetName();
+ //INFO("start thread...[%s]", threadName.c_str());
+
+ thiz->SetState(uThread::STATE_RUNNING);
+ thiz->Run();
+
+ if(thiz->GetExitType() == uThread::TYPE_DETACHABLE)
+ thiz->SetState(uThread::STATE_TERMINATED);
+ else thiz->SetState(uThread::STATE_ZOMBIE);
+
+ pthread_exit((void*)0);
+
+ //INFO("terminated thread...[%s]", threadName.c_str());
+ return NULL;
+}
+//-------------------------------------------------------------------------------
+
+void uThread::Stop()
+{
+ switch(mState) {
+ case uThread::STATE_RUNNING: {
+ switch(mExitType) {
+ case uThread::TYPE_DETACHABLE: {
+ Terminate();
+ } break;
+ case uThread::TYPE_JOINABLE: {
+ Terminate();
+ Join(mTid);
+ } break;
+ }
+ } break;
+ case uThread::STATE_ZOMBIE: {
+ Join(mTid);
+ } break;
+ }
+}
+//-------------------------------------------------------------------------------
+
+bool uThread::Join(pthread_t aTid)
+{
+ if (!pthread_join(aTid, NULL)) {
+ SetState(uThread::STATE_TERMINATED);
+ return true;
+ }
+ return false;
+}
+//-------------------------------------------------------------------------------
+
+void uThread::SetState(uThread::STATE aState)
+{
+ mState = aState;
+}
+//-------------------------------------------------------------------------------
+
+uThread::STATE uThread::GetState() const
+{
+ return mState;
+}
+//-------------------------------------------------------------------------------
+
+uThread::EXIT_TYPE uThread::GetExitType() const
+{
+ return mExitType;
+}
+//-------------------------------------------------------------------------------
+
+std::string uThread::GetName() const
+{
+ return mName;
+}
+//-------------------------------------------------------------------------------
+
+bool uThread::IsTerminated() const
+{
+ return (mState == uThread::STATE_TERMINATED) ? true : false;
+}
+//-------------------------------------------------------------------------------
+
+bool uThread::IsRunning() const
+{
+ return mState == uThread::STATE_RUNNING ? true : false;
+}
+//-------------------------------------------------------------------------------
+
+bool uThread::Join()
+{
+ return Join(mTid);
+}
+//-------------------------------------------------------------------------------