RemoteReferenceCount.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2017, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package ArmarX
19  * @author Raphael Grimm( raphael dor grimm at kit dot edu)
20  * @date 2017
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 #pragma once
25 
26 #include <atomic>
27 #include <functional>
28 #include <map>
29 #include <mutex>
30 #include <queue>
31 #include <set>
32 #include <string>
33 #include <thread>
34 
35 #include <IceUtil/UUID.h>
36 
37 #include <ArmarXCore/interface/core/RemoteReferenceCount.h>
38 
39 #include "logging/Logging.h"
40 
41 //internal base impl
42 namespace armarx
43 {
44  class ArmarXManager;
45  class RemoteReferenceCountControlBlockManager;
46 } // namespace armarx
47 
48 namespace armarx::detail
49 {
50  class RemoteReferenceCountControlBlockManagementInterface : virtual public Ice::Object
51  {
52  public:
54 
55  void
57  {
58  countingActivated_ = true;
59  }
60 
61  bool
63  {
64  return countingActivated_;
65  }
66 
67  bool
69  {
70  return countReachedZero_;
71  }
72 
73  Ice::ObjectPrx
74  getProxy() const
75  {
76  return selfProxy;
77  }
78 
80  const std::string& id);
81 
83 
84  protected:
85  friend class ::armarx::RemoteReferenceCountControlBlockManager;
86  /**
87  * @brief Returns the next timepoint when this ControlBlock should be checked.
88  * If the returned time is in the past and counting was activated, this Block
89  * is removed from counting and onCountReachedZero is called.
90  * @return
91  */
92  virtual IceUtil::Time nextCheckTimePoint() = 0;
93  virtual void onCountReachedZero() = 0;
94 
95  void countReachedZero();
96 
98  Ice::ObjectPrx selfProxy;
99 
100  std::mutex mtx;
102 
103  const std::string id;
104 
105  private:
106  std::atomic_bool countingActivated_{false};
107  std::atomic_bool countReachedZero_{false};
108  };
109 
112 } // namespace armarx::detail
113 
114 //internal base impl AbstractRemoteReferenceCountControlBlock
115 namespace armarx::detail
116 {
118  virtual public RemoteReferenceCountControlBlockInterface,
120  {
121  public:
123  RemoteReferenceCounterBasePtr getReferenceCounter();
124 
125  void heartbeat(const std::string& counterId,
126  const Ice::Current& = Ice::emptyCurrent) final override;
127  void addCounter(const std::string& counterId,
128  const Ice::Current& = Ice::emptyCurrent) final override;
129  void removeCounter(const std::string& counterId,
130  const Ice::Current& = Ice::emptyCurrent) final override;
131 
132  protected:
134  const std::string& id,
135  IceUtil::Time deletionDelay,
136  IceUtil::Time orphantDeletionDelay,
137  long heartBeatMs);
138 
139  private:
140  IceUtil::Time nextCheckTimePoint() final override;
141 
142  std::map<std::string, IceUtil::Time> counterIds;
143  const IceUtil::Time deletionDelay;
144  const IceUtil::Time orphantDeletionDelay;
145  const long heartBeatMs;
146  };
147 } // namespace armarx::detail
148 
149 //internal base impl AbstractSimpleRemoteReferenceCountControlBlock
150 namespace armarx::detail
151 {
153  virtual public SimpleRemoteReferenceCountControlBlockInterface,
155  {
156  public:
158  SimpleRemoteReferenceCounterBasePtr getReferenceCounter();
159 
160  void addCounter(const std::string& counterId, const Ice::Current&) final override;
161  void removeCounter(const std::string& counterId, const Ice::Current&) final override;
162 
163  protected:
165  const std::string& id,
166  IceUtil::Time deletionDelay);
167 
168  private:
169  IceUtil::Time nextCheckTimePoint() final override;
170 
171  std::set<std::string> counterIds;
172  const IceUtil::Time deletionDelay;
173  };
174 } // namespace armarx::detail
175 
176 //impl RemoteReferenceCountControlBlock
177 namespace armarx
178 {
179  template <class FunctionType = std::function<void(void)>, class DataType = void>
182  {
184  const std::string& id,
185  FunctionType f,
186  DataType d,
187  IceUtil::Time deletionDelay,
188  IceUtil::Time orphantDeletionDelay,
189  long heartBeatMs) :
192  id,
193  deletionDelay,
194  orphantDeletionDelay,
195  heartBeatMs),
196  data{std::move(d)},
197  function{std::move(f)}
198  {
199  }
200 
201  DataType data;
202  FunctionType function;
203 
204  void
205  onCountReachedZero() final override
206  {
207  function(data);
208  }
209  friend class ArmarXManager;
211  };
212 
213  template <class FunctionType>
214  class RemoteReferenceCountControlBlock<FunctionType, void> :
216  {
218  const std::string& id,
219  FunctionType f,
220  IceUtil::Time deletionDelay,
221  IceUtil::Time orphantDeletionDelay,
222  long heartBeatMs) :
225  id,
226  deletionDelay,
227  orphantDeletionDelay,
228  heartBeatMs),
229  function{std::move(f)}
230  {
231  }
232 
233  FunctionType function;
234 
235  void
236  onCountReachedZero() final override
237  {
238  function();
239  }
240  friend class ArmarXManager;
242  };
243 
244  template <class FunctionType, class DataType = void>
247 } // namespace armarx
248 
249 //impl SimpleRemoteReferenceCountControlBlock
250 namespace armarx
251 {
252  template <class FunctionType = std::function<void(void)>, class DataType = void>
255  {
257  const std::string& id,
258  FunctionType f,
259  DataType d,
260  IceUtil::Time deletionDelay) :
262  detail::AbstractSimpleRemoteReferenceCountControlBlock(manager, id, deletionDelay),
263  data{std::move(d)},
264  function{std::move(f)}
265  {
266  }
267 
268  DataType data;
269  FunctionType function;
270 
271  void
272  onCountReachedZero() final override
273  {
274  function(data);
275  }
276  friend class ArmarXManager;
278  };
279 
280  template <class FunctionType>
281  class SimpleRemoteReferenceCountControlBlock<FunctionType, void> :
283  {
285  const std::string& id,
286  FunctionType f,
287  IceUtil::Time deletionDelay) :
289  detail::AbstractSimpleRemoteReferenceCountControlBlock(manager, id, deletionDelay),
290  function{std::move(f)}
291  {
292  }
293 
294  FunctionType function;
295 
296  void
297  onCountReachedZero() final override
298  {
299  function();
300  }
301  friend class ArmarXManager;
303  };
304 
305  template <class FunctionType, class DataType = void>
308 } // namespace armarx
309 
310 //impl manager
311 namespace armarx
312 {
314  {
315  public:
317  {
318  }
319 
321  {
322  stop();
323  }
324 
327 
329  void stop();
330 
331  private:
332  void manage();
333 
334  const IceUtil::Time period;
335  using PqEntry = std::pair<IceUtil::Time,
337 
338  struct PqEntryCompare
339  {
340  bool
341  operator()(const PqEntry& lhs, const PqEntry& rhs) const
342  {
343  return std::make_pair(lhs.first, lhs.second.get()) >
344  std::make_pair(rhs.first, rhs.second.get());
345  }
346  };
347 
348  struct RRCBMIPtr
349  {
350  bool
351  operator()(
354  {
355  return lhs.get() < rhs.get();
356  }
357  };
358 
359  std::mutex stateMutex;
360  std::set<detail::RemoteReferenceCountControlBlockManagementInterfacePtr, RRCBMIPtr>
361  pendingForActivation;
362  std::priority_queue<PqEntry, std::vector<PqEntry>, PqEntryCompare> rrccbs;
363  std::thread thread;
364  std::atomic_bool shutdown{false};
365  };
366 } // namespace armarx
armarx::detail::AbstractRemoteReferenceCountControlBlock::AbstractRemoteReferenceCountControlBlock
AbstractRemoteReferenceCountControlBlock(const ArmarXManagerPtr &manager, const std::string &id, IceUtil::Time deletionDelay, IceUtil::Time orphantDeletionDelay, long heartBeatMs)
Definition: RemoteReferenceCount.cpp:482
armarx::detail::AbstractRemoteReferenceCountControlBlock::removeCounter
void removeCounter(const std::string &counterId, const Ice::Current &=Ice::emptyCurrent) final override
Definition: RemoteReferenceCount.cpp:462
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::activateCounting
void activateCounting()
Definition: RemoteReferenceCount.h:56
armarx::RemoteReferenceCountControlBlockManager::DefaultOrphantDeletionDelayMs
static const Ice::Long DefaultOrphantDeletionDelayMs
Definition: RemoteReferenceCount.h:326
armarx::RemoteReferenceCountControlBlockManager::DefaultDeletionDelayMs
static const Ice::Long DefaultDeletionDelayMs
Definition: RemoteReferenceCount.h:325
armarx::detail::AbstractSimpleRemoteReferenceCountControlBlock
Definition: RemoteReferenceCount.h:152
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::getProxy
Ice::ObjectPrx getProxy() const
Definition: RemoteReferenceCount.h:74
detail
Definition: OpenCVUtil.cpp:128
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::isCountingActivated
bool isCountingActivated() const
Definition: RemoteReferenceCount.h:62
IceUtil
Definition: Instance.h:21
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::onCountReachedZero
virtual void onCountReachedZero()=0
armarx::detail::AbstractRemoteReferenceCountControlBlock::addCounter
void addCounter(const std::string &counterId, const Ice::Current &=Ice::emptyCurrent) final override
Definition: RemoteReferenceCount.cpp:432
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::nextCheckTimePoint
virtual IceUtil::Time nextCheckTimePoint()=0
Returns the next timepoint when this ControlBlock should be checked.
armarx::detail::RemoteReferenceCountControlBlockManagementInterfacePtr
IceUtil::Handle< detail::RemoteReferenceCountControlBlockManagementInterface > RemoteReferenceCountControlBlockManagementInterfacePtr
Definition: RemoteReferenceCount.h:111
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::SimpleRemoteReferenceCountControlBlock
Definition: RemoteReferenceCount.h:253
armarx::RemoteReferenceCountControlBlockManager
Definition: RemoteReferenceCount.h:313
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::countReachedZero
void countReachedZero()
Definition: RemoteReferenceCount.cpp:423
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::RemoteReferenceCountControlBlockManagementInterface
RemoteReferenceCountControlBlockManagementInterface(const ArmarXManagerPtr &manager, const std::string &id)
Definition: RemoteReferenceCount.cpp:384
armarx::VariantType::Long
const VariantTypeId Long
Definition: Variant.h:918
armarx::armem::server::ltm::detail::mixin::DataType
DataType
Definition: RESTStorageMixin.h:19
armarx::detail::AbstractRemoteReferenceCountControlBlock
Definition: RemoteReferenceCount.h:117
armarx::detail
Definition: ApplicationNetworkStats.cpp:36
armarx::detail::RemoteReferenceCountControlBlockManagementInterface
Definition: RemoteReferenceCount.h:50
armarx::RemoteReferenceCountControlBlock
Definition: RemoteReferenceCount.h:180
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::id
const std::string id
Definition: RemoteReferenceCount.h:103
armarx::detail::AbstractRemoteReferenceCountControlBlock::getReferenceCounter
RemoteReferenceCounterBasePtr getReferenceCounter()
Definition: RemoteReferenceCount.cpp:518
armarx::detail::AbstractRemoteReferenceCountControlBlock::heartbeat
void heartbeat(const std::string &counterId, const Ice::Current &=Ice::emptyCurrent) final override
Definition: RemoteReferenceCount.cpp:449
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::hasCountReachedZero
bool hasCountReachedZero() const
Definition: RemoteReferenceCount.h:68
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::lastTimeReachedZero
IceUtil::Time lastTimeReachedZero
Definition: RemoteReferenceCount.h:101
std
Definition: Application.h:66
set
set(LIBS ArmarXCoreInterfaces ${CMAKE_THREAD_LIBS_INIT} ${dl_LIBRARIES} ${rt_LIBRARIES} ${QT_LIBRARIES} ${Boost_LIBRARIES} BoostAssertionHandler ArmarXCPPUtility SimoxUtility) set(LIB_FILES ArmarXManager.cpp ArmarXMultipleObjectsScheduler.cpp ArmarXObjectScheduler.cpp ManagedIceObject.cpp ManagedIceObjectPlugin.cpp Component.cpp ComponentPlugin.cpp IceGridAdmin.cpp ArmarXObjectObserver.cpp IceManager.cpp PackagePath.cpp RemoteReferenceCount.cpp logging/LoggingUtil.cpp logging/Logging.cpp logging/LogSender.cpp logging/ArmarXLogBuf.cpp system/ArmarXDataPath.cpp system/DynamicLibrary.cpp system/ProcessWatcher.cpp system/FactoryCollectionBase.cpp system/cmake/CMakePackageFinder.cpp system/cmake/CMakePackageFinderCache.cpp system/cmake/ArmarXPackageToolInterface.cpp system/RemoteObjectNode.cpp services/sharedmemory/HardwareId.cpp services/tasks/RunningTask.cpp services/tasks/ThreadList.cpp services/tasks/ThreadPool.cpp services/profiler/Profiler.cpp services/profiler/FileLoggingStrategy.cpp services/profiler/IceLoggingStrategy.cpp application/Application.cpp application/ApplicationOptions.cpp application/ApplicationProcessFacet.cpp application/ApplicationNetworkStats.cpp application/properties/PropertyUser.cpp application/properties/Property.cpp application/properties/PropertyDefinition.cpp application/properties/PropertyDefinitionContainer.cpp application/properties/PropertyDefinitionHelpFormatter.cpp application/properties/PropertyDefinitionConfigFormatter.cpp application/properties/PropertyDefinitionBriefHelpFormatter.cpp application/properties/PropertyDefinitionXmlFormatter.cpp application/properties/PropertyDefinitionDoxygenFormatter.cpp application/properties/PropertyDefinitionDoxygenComponentPagesFormatter.cpp application/properties/PropertyDefinitionContainerBriefHelpFormatter.cpp application/properties/IceProperties.cpp exceptions/Exception.cpp exceptions/local/UnexpectedEnumValueException.cpp util/FileSystemPathBuilder.cpp util/StringHelpers.cpp util/IceReportSkipper.cpp util/Throttler.cpp util/distributed/AMDCallbackCollection.cpp util/distributed/RemoteHandle/ClientSideRemoteHandleControlBlock.cpp util/distributed/RemoteHandle/RemoteHandle.cpp util/distributed/RemoteHandle/RemoteHandleControlBlock.cpp time/ice_conversions.cpp time/json_conversions.cpp time/CallbackWaitLock.cpp time/Clock.cpp time/ClockType.cpp time/ClockTypeNames.cpp time/CycleUtil.cpp time/DateTime.cpp time/Duration.cpp time/Frequency.cpp time/LocalTimeServer.cpp time/Metronome.cpp time/ScopedStopWatch.cpp time/StopWatch.cpp time/Timer.cpp time/TimeKeeper.cpp time/TimeUtil.cpp csv/CsvWriter.cpp csv/CsvReader.cpp eigen/conversions.cpp eigen/ice_conversions.cpp) set(LIB_HEADERS ArmarXManager.h ArmarXDummyManager.h ArmarXMultipleObjectsScheduler.h ArmarXObjectObserver.h ArmarXObjectScheduler.h ArmarXFwd.h Component.h ComponentPlugin.h ComponentFactories.h CoreObjectFactories.h IceGridAdmin.h IceManager.h IceManagerImpl.h json_conversions.h ManagedIceObject.h ManagedIceObjectPlugin.h ManagedIceObjectImpl.h ManagedIceObjectDependency.h ManagedIceObjectRegistryInterface.h PackagePath.h RemoteReferenceCount.h system/ImportExport.h system/ImportExportComponent.h system/AbstractFactoryMethod.h system/FactoryCollectionBase.h system/Synchronization.h system/ArmarXDataPath.h system/DynamicLibrary.h system/ProcessWatcher.h system/ConditionSynchronization.h system/cmake/CMakePackageFinder.h system/cmake/CMakePackageFinderCache.h system/cmake/FindPackageX.cmake system/cmake/ArmarXPackageToolInterface.h system/RemoteObjectNode.h logging/LoggingUtil.h logging/LogSender.h logging/Logging.h logging/ArmarXLogBuf.h logging/SpamFilterData.h services/tasks/RunningTask.h services/tasks/PeriodicTask.h services/tasks/ThreadList.h services/tasks/TaskUtil.h services/tasks/ThreadPool.h services/sharedmemory/SharedMemoryProvider.h services/sharedmemory/SharedMemoryConsumer.h services/sharedmemory/IceSharedMemoryProvider.h services/sharedmemory/IceSharedMemoryConsumer.h services/sharedmemory/HardwareIdentifierProvider.h services/sharedmemory/HardwareId.h services/sharedmemory/exceptions/SharedMemoryExceptions.h services/profiler/Profiler.h services/profiler/LoggingStrategy.h services/profiler/FileLoggingStrategy.h services/profiler/IceLoggingStrategy.h application/Application.h application/ApplicationOptions.h application/ApplicationProcessFacet.h application/ApplicationNetworkStats.h application/properties/forward_declarations.h application/properties/Properties.h application/properties/Property.h application/properties/PluginEigen.h application/properties/PluginEnumNames.h application/properties/PluginCfgStruct.h application/properties/PluginAll.h application/properties/PropertyUser.h application/properties/PropertyDefinition.h application/properties/PropertyDefinition.hpp application/properties/PropertyDefinitionInterface.h application/properties/PropertyDefinitionContainer.h application/properties/PropertyDefinitionFormatter.h application/properties/PropertyDefinitionContainerFormatter.h application/properties/PropertyDefinitionConfigFormatter.h application/properties/PropertyDefinitionHelpFormatter.h application/properties/PropertyDefinitionBriefHelpFormatter.h application/properties/PropertyDefinitionXmlFormatter.h application/properties/PropertyDefinitionDoxygenFormatter.h application/properties/PropertyDefinitionDoxygenComponentPagesFormatter.h application/properties/PropertyDefinitionContainerBriefHelpFormatter.h application/properties/ProxyPropertyDefinition.h application/properties/IceProperties.h exceptions/Exception.h exceptions/LocalException.h exceptions/local/DynamicLibraryException.h exceptions/local/ExpressionException.h exceptions/local/FileIOException.h exceptions/local/InvalidPropertyValueException.h exceptions/local/MissingRequiredPropertyException.h exceptions/local/PropertyInheritanceCycleException.h exceptions/local/ProxyNotInitializedException.h exceptions/local/UnexpectedEnumValueException.h exceptions/local/UnmappedValueException.h exceptions/local/ValueRangeExceededException.h exceptions/user/NotImplementedYetException.h rapidxml/rapidxml.hpp rapidxml/rapidxml_print.hpp rapidxml/rapidxml_iterators.hpp rapidxml/rapidxml_utils.hpp rapidxml/wrapper/RapidXmlReader.h rapidxml/wrapper/RapidXmlWriter.h rapidxml/wrapper/DefaultRapidXmlReader.h rapidxml/wrapper/MultiNodeRapidXMLReader.h util/IceBlobToObject.h util/ObjectToIceBlob.h util/FileSystemPathBuilder.h util/FiniteStateMachine.h util/StringHelpers.h util/StringHelperTemplates.h util/algorithm.h util/OnScopeExit.h util/Predicates.h util/Preprocessor.h util/PropagateConst.h util/Registrar.h util/TemplateMetaProgramming.h util/TripleBuffer.h util/IceReportSkipper.h util/Throttler.h util/distributed/AMDCallbackCollection.h util/distributed/RemoteHandle/ClientSideRemoteHandleControlBlock.h util/distributed/RemoteHandle/RemoteHandle.h util/distributed/RemoteHandle/RemoteHandleControlBlock.h util/SimpleStatemachine.h time.h time_minimal.h time/forward_declarations.h time/ice_conversions.h time/json_conversions.h time/CallbackWaitLock.h time/Clock.h time/ClockType.h time/ClockTypeNames.h time/CycleUtil.h time/DateTime.h time/Duration.h time/Frequency.h time/LocalTimeServer.h time/Metronome.h time/ScopedStopWatch.h time/StopWatch.h time/Timer.h time/TimeUtil.h time/TimeKeeper.h csv/CsvWriter.h csv/CsvReader.h eigen/conversions.h eigen/ice_conversions.h ice_conversions.h ice_conversions/ice_conversions_boost_templates.h ice_conversions/ice_conversions_templates.h ice_conversions/ice_conversions_templates.tpp $
Definition: CMakeLists.txt:12
IceUtil::Handle< ArmarXManager >
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::selfProxy
Ice::ObjectPrx selfProxy
Definition: RemoteReferenceCount.h:98
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::armarXManager
ArmarXManagerPtr armarXManager
Definition: RemoteReferenceCount.h:97
Logging.h
armarx::RemoteReferenceCountControlBlockManager::~RemoteReferenceCountControlBlockManager
~RemoteReferenceCountControlBlockManager()
Definition: RemoteReferenceCount.h:320
armarx::RemoteReferenceCountControlBlockManager::RemoteReferenceCountControlBlockManager
RemoteReferenceCountControlBlockManager(IceUtil::Time period)
Definition: RemoteReferenceCount.h:316
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::mtx
std::mutex mtx
Definition: RemoteReferenceCount.h:100
armarx::ArmarXManager
Main class of an ArmarX process.
Definition: ArmarXManager.h:97
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::detail::RemoteReferenceCountControlBlockManagementInterface::~RemoteReferenceCountControlBlockManagementInterface
~RemoteReferenceCountControlBlockManagementInterface() override
Definition: RemoteReferenceCount.cpp:396