From 4d4882d667c2c2eea180219e0c76d15cc1f49415 Mon Sep 17 00:00:00 2001 From: brain Date: Thu, 21 Feb 2008 17:27:55 +0000 Subject: Working thread test!!! git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8983 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/threadengine.h | 19 ++++++++++++++++++- src/testsuite.cpp | 18 +++++++++++------- src/threadengines/threadengine_pthread.cpp | 7 +++++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/include/threadengine.h b/include/threadengine.h index 56ccce423..397b0085e 100644 --- a/include/threadengine.h +++ b/include/threadengine.h @@ -82,6 +82,8 @@ class CoreExport ThreadEngine : public Extensible */ class CoreExport Thread : public Extensible { + private: + bool ExitFlag; public: /** Creator thread engine @@ -90,7 +92,7 @@ class CoreExport Thread : public Extensible /** Set Creator to NULL at this point */ - Thread() : Creator(NULL) + Thread() : ExitFlag(false), Creator(NULL) { } @@ -107,6 +109,21 @@ class CoreExport Thread : public Extensible * threaded code here */ virtual void Run() = 0; + + void SetExitFlag() + { + ExitFlag = true; + } + + void ClearExitFlag() + { + ExitFlag = false; + } + + bool GetExitFlag() + { + return ExitFlag; + } }; diff --git a/src/testsuite.cpp b/src/testsuite.cpp index 608179703..719da0313 100644 --- a/src/testsuite.cpp +++ b/src/testsuite.cpp @@ -33,10 +33,10 @@ class TestSuiteThread : public Thread virtual void Run() { - while (1) + while (GetExitFlag() == false) { cout << "Test suite thread run...\n"; - sleep(10); + sleep(5); } } }; @@ -110,19 +110,23 @@ bool TestSuite::DoThreadTests() } cout << "Creation success!\n"; - cout << "Creating new thread of type TestSuiteThread\n"; - + cout << "Creating new thread of type TestSuiteThread...\n"; TestSuiteThread* tst = new TestSuiteThread(); + cout << "Create new thread based on TestSuiteThread...\n"; te->Create(tst); - cout << "Press enter to end test."; - cin >> anything; + cout << "Press any key to end test.\n"; + getchar(); - /* Auto frees thread */ + /* Thread engine auto frees thread on delete */ + cout << "Waiting for thread to exit..."; delete tst; + cout << "Done!\n"; + cout << "Delete ThreadEngine... "; delete te; + cout << "Done!\n"; return true; } diff --git a/src/threadengines/threadengine_pthread.cpp b/src/threadengines/threadengine_pthread.cpp index da120bfab..8bdcd6d96 100644 --- a/src/threadengines/threadengine_pthread.cpp +++ b/src/threadengines/threadengine_pthread.cpp @@ -36,6 +36,7 @@ void PThreadEngine::Create(Thread* thread_to_init) { pthread_attr_t attribs; pthread_attr_init(&attribs); + pthread_attr_setdetachstate(&attribs, PTHREAD_CREATE_JOINABLE); pthread_t* MyPThread = new pthread_t; if (pthread_create(MyPThread, &attribs, PThreadEngine::Entry, (void*)this) != 0) @@ -44,6 +45,8 @@ void PThreadEngine::Create(Thread* thread_to_init) throw CoreException("Unable to create new PThreadEngine: " + std::string(strerror(errno))); } + pthread_attr_destroy(&attribs); + NewThread = thread_to_init; NewThread->Creator = this; NewThread->Extend("pthread", MyPThread); @@ -81,6 +84,10 @@ void PThreadEngine::FreeThread(Thread* thread) pthread_t* pthread = NULL; if (thread->GetExt("pthread", pthread)) { + thread->SetExitFlag(); + int rc; + void* status; + rc = pthread_join(*pthread, &status); delete pthread; } } -- cgit v1.2.3