00001 #include "otsdaq-core/WorkLoopManager/WorkLoop.h"
00002 #include "otsdaq-core/MessageFacility/MessageFacility.h"
00003 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
00004
00005 #include <toolbox/task/WorkLoopFactory.h>
00006
00007 #include <iostream>
00008 #include <unistd.h>
00009
00010 using namespace ots;
00011
00012
00013
00014 WorkLoop::WorkLoop(std::string name)
00015 : continueWorkLoop_(false)
00016 , cWorkLoopName_ (name)
00017 , cWorkLoopType_ ("waiting")
00018 , workLoop_ (0)
00019 , job_ (toolbox::task::bind(this, &WorkLoop::workLoopThread, cWorkLoopName_))
00020 {
00021 }
00022
00023
00024 WorkLoop::~WorkLoop(void)
00025 {
00026 mf::LogDebug("WorkLoop") << "Destroying WorkLoop: " << cWorkLoopName_ << std::endl;
00027 if(stopWorkLoop())
00028 toolbox::task::getWorkLoopFactory()->removeWorkLoop(cWorkLoopName_, cWorkLoopType_);
00029 mf::LogDebug("WorkLoop") << "Destroyed WorkLoop: " << cWorkLoopName_ << std::endl;
00030 }
00031
00032
00033 void WorkLoop::startWorkLoop(void)
00034 {
00035
00036 continueWorkLoop_ = true;
00037 try
00038 {
00039 workLoop_ = toolbox::task::getWorkLoopFactory()->getWorkLoop(cWorkLoopName_, cWorkLoopType_);
00040 }
00041 catch (xcept::Exception & e)
00042 {
00043 std::cout << __COUT_HDR_FL__ << "ERROR: Can't create WorkLoop job for " << cWorkLoopName_ << std::endl;
00044 stopWorkLoop();
00045 }
00046
00047 if(workLoop_->isActive()) return;
00048
00049 try
00050 {
00051 workLoop_->submit(job_);
00052 }
00053 catch (xcept::Exception & e)
00054 {
00055 std::cout << __COUT_HDR_FL__ << "ERROR: Can't submit WorkLoop job for " << cWorkLoopName_ << std::endl;
00056 stopWorkLoop();
00057 }
00058
00059 try
00060 {
00061 workLoop_->activate();
00062 }
00063 catch (xcept::Exception & e)
00064 {
00065 std::cout << __COUT_HDR_FL__ << "ERROR: Can't activate WorkLoop job for " << cWorkLoopName_
00066 << " Very likely because the name " << cWorkLoopName_ << " is not unique!" << std::endl;
00067 stopWorkLoop();
00068 }
00069 }
00070
00071
00072 bool WorkLoop::stopWorkLoop()
00073 {
00074
00075 continueWorkLoop_ = false;
00076 if(workLoop_ == 0)
00077 {
00078
00079 return false;
00080 }
00081
00082 try
00083 {
00084
00085 workLoop_->cancel();
00086 }
00087 catch (xcept::Exception & e)
00088 {
00089 std::cout << __COUT_HDR_FL__ << "WARNING: Can't cancel WorkLoop job for " << cWorkLoopName_ << " because probably it has never been activated!"<< std::endl;
00090 return true;
00091 }
00092 try
00093 {
00094 workLoop_->remove(job_);
00095 }
00096 catch (xcept::Exception & e)
00097 {
00098
00099
00100
00101
00102 std::cout << __COUT_HDR_FL__ << "WARNING: Can't remove request WorkLoop: " << cWorkLoopName_ << std::endl;
00103 }
00104
00105 return true;
00106 }
00107
00108
00109 const std::string& WorkLoop::getWorkLoopName(void)
00110 {
00111 return cWorkLoopName_;
00112 }