version 0.1.9
[fms.git] / src / pthreadwrapper / threadedexecutor.cpp
diff --git a/src/pthreadwrapper/threadedexecutor.cpp b/src/pthreadwrapper/threadedexecutor.cpp
new file mode 100644 (file)
index 0000000..52377b5
--- /dev/null
@@ -0,0 +1,59 @@
+#include "../../include/pthreadwrapper/threadedexecutor.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+namespace PThread\r
+{\r
+\r
+ThreadedExecutor::~ThreadedExecutor()\r
+{\r
+       for(std::vector<Thread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
+       {\r
+               (*i)->Cancel();\r
+               (*i)->Join();\r
+               delete (*i);\r
+       }\r
+}\r
+\r
+void ThreadedExecutor::Cancel()\r
+{\r
+       for(std::vector<Thread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
+       {\r
+               (*i)->Cancel(); \r
+       }\r
+}\r
+\r
+void ThreadedExecutor::CleanupFinished()\r
+{\r
+       for(std::vector<Thread *>::iterator i=m_threads.begin(); i!=m_threads.end(); )\r
+       {\r
+               if((*i)->IsRunning()==false)\r
+               {\r
+                       delete (*i);\r
+                       i=m_threads.erase(i);\r
+               }\r
+               else\r
+               {\r
+                       i++;\r
+               }\r
+       }\r
+}\r
+\r
+void ThreadedExecutor::Execute(Runnable *runnable)\r
+{\r
+       CleanupFinished();\r
+       m_threads.push_back(new Thread(runnable));      \r
+}\r
+\r
+void ThreadedExecutor::Join()\r
+{\r
+       for(std::vector<Thread *>::iterator     i=m_threads.begin(); i!=m_threads.end(); i++)\r
+       {\r
+               (*i)->Join();\r
+       }\r
+       CleanupFinished();\r
+}\r
+\r
+}      // namespace\r