hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ComponentManager.cpp
Go to the documentation of this file.
1 #include <Poco/ScopedLock.h>
2 
3 #include "ComponentManager.hpp"
7 
8 #include <unistd.h>
9 
10 #define COMPONENT_WAIT_TIME 10000
11 
12 namespace HCE
13 {
14  namespace component
15  {
16  Poco::SharedPtr<ComponentBase> ComponentManager::getFreeComponent()
17  {
18  Poco::SharedPtr<ComponentBase> retComponent = nullptr;
19  insertComponentMutex.lock();
20  while(retComponent.isNull())
21  {
22  for(auto it = componentsList.begin(); it != componentsList.end(); ++it)
23  {
24  if(!((*it)->getIsBusy()))
25  {
26  retComponent = (*it);
27  (*it)->setIsBusy(true);
28  break;
29  }
30  }
31  if(retComponent.isNull())
32  {
33  usleep(COMPONENT_WAIT_TIME);
34  }
35  }
36  insertComponentMutex.unlock();
37  return retComponent;
38  }
39 
40  void ComponentManager::addComponent(Poco::SharedPtr<ComponentBase> componentPtr)
41  {
42  if(!componentPtr.isNull())
43  {
44  insertComponentMutex.lock();
45  componentsList.push_back(componentPtr);
46  insertComponentMutex.unlock();
47  }
48  }
49 
50  void ComponentManager::setTaskManager(Poco::SharedPtr<Poco::TaskManager> taskManager)
51  {
52  if(_taskManager.isNull())
53  {
54  _taskManager = taskManager;
55  }
56  }
57 
58  void ComponentManager::addTask(Poco::SharedPtr<TaskWaitObject> task)
59  {
60  if(_taskManager.isNull())
61  {
62  throw TaskManagerEmptyException("TaskManagerEmpty");
63  }
64  else
65  {
66  Poco::ScopedLock<Poco::FastMutex> sLock(incomeDataMutex);
67  taskQueue.push(task);
68  conditionVar.signal();
69  }
70  }
71 
73  {
74  Poco::ScopedLock<Poco::FastMutex> sLock(incomeDataMutex);
75  while(!taskQueue.empty())
76  {
77  taskQueue.pop();
78  }
79  }
80 
82  {
83  if(!ownThread.isRunning())
84  {
85  ownThread.start(*this);
86  }
87  else
88  {
89  throw ThreadAlreadyRunException("ThreadAlreadyRun");
90  }
91  }
92 
94  {
95  exitFlag = true;
96  Poco::ScopedLock<Poco::FastMutex> sLock(incomeDataMutex);
97  conditionVar.signal();
98  }
99 
101  {
102  Poco::SharedPtr<ComponentBase> localObjectPtr;
103  while(!exitFlag)
104  {
105  incomeDataMutex.lock();
106  while(!taskQueue.empty())
107  {
108  Poco::SharedPtr<TaskWaitObject> taskPtr = taskQueue.front();
109  taskQueue.pop();
110  incomeDataMutex.unlock();
111  localObjectPtr = getFreeComponent();
112 //------------------------ insert task ---------------------------------------------------------------------------
113  while(true)
114  {
115  TaskWaitObjectWrapper *taskWrapper = new TaskWaitObjectWrapper(taskPtr, localObjectPtr);
116  try
117  {
118  _taskManager->start(taskWrapper);
119  break;
120  }
121  catch(Poco::NoThreadAvailableException &excp)
122  {
123  usleep(COMPONENT_WAIT_TIME);
124  }
125  catch(Poco::Exception &exp)
126  {
127 // std::string what = exp.what();
128  usleep(COMPONENT_WAIT_TIME);
129  }
130  }
131 //------------------------ insert task END -----------------------------------------------------------------------
132  incomeDataMutex.lock();
133  }
134  if(exitFlag)
135  {
136  incomeDataMutex.unlock();
137  break;
138  }
140  incomeDataMutex.unlock();
141  }
142  if(!_threadPool.isNull())
143  {
144  _threadPool->stopAll();
145  _threadPool->joinAll();
146  }
147  }
148  }
149 }