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 __COUT__ << "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 __COUT__ << "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 __COUT__ << "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 __COUT__ << "Stopping WorkLoop: " << cWorkLoopName_ << std::endl;
00075
00076 continueWorkLoop_ = false;
00077 if(workLoop_ == 0)
00078 {
00079 __COUT__ << "MEASSAGE: WorkLoop " << cWorkLoopName_ << " was not created at all! This message will be commented in the future" << std::endl;
00080 return false;
00081 }
00082
00083 __COUT__ << "initially workLoop_->isActive() " << (workLoop_->isActive()?"yes":"no") << std::endl;
00084
00085 try
00086 {
00087
00088 workLoop_->cancel();
00089 }
00090 catch (xcept::Exception & e)
00091 {
00092 __COUT__ << "WARNING: Can't cancel WorkLoop job for " << cWorkLoopName_ <<
00093 " because probably it has never been activated!" << std::endl;
00094
00095 __COUT__ << "workLoop_->isActive() " << (workLoop_->isActive()?"yes":"no") << std::endl;
00096 return true;
00097 }
00098
00099 try
00100 {
00101 workLoop_->remove(job_);
00102 }
00103 catch (xcept::Exception & e)
00104 {
00105
00106
00107
00108
00109 __COUT__ << "WARNING: Can't remove request WorkLoop: " << cWorkLoopName_ << std::endl;
00110 __COUT__ << "workLoop_->isActive() " << (workLoop_->isActive()?"yes":"no") << std::endl;
00111 }
00112
00113 __COUT__ << "Stopped WorkLoop: " << cWorkLoopName_ << std::endl;
00114 __COUT__ << "workLoop_->isActive() " << (workLoop_->isActive()?"yes":"no") << std::endl;
00115 return true;
00116 }
00117
00118
00119 const std::string& WorkLoop::getWorkLoopName(void)
00120 {
00121 return cWorkLoopName_;
00122 }
00123
00124
00125 bool WorkLoop::isActive(void)
00126 {
00127 return workLoop_->isActive() && continueWorkLoop_;
00128 }