summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-02-21 17:27:55 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-02-21 17:27:55 +0000
commit4d4882d667c2c2eea180219e0c76d15cc1f49415 (patch)
tree86acc379875db7359b342812bd18b7edbe3ee60a
parent4e5244a4d82ea5083c401ac04440cb8dd6003941 (diff)
Working thread test!!!
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8983 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/threadengine.h19
-rw-r--r--src/testsuite.cpp18
-rw-r--r--src/threadengines/threadengine_pthread.cpp7
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;
}
}