IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BaseActionProvider.h
1 // BaseActionProvider.h:
3 // ---------------------
4 //
14 
15 #ifndef __IPSDKCORE_BASEACTIONPROVIDER_H__
16 #define __IPSDKCORE_BASEACTIONPROVIDER_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::core::BaseActionProvider::_priority' : class 'ipsdk::core::ePriority' needs to have dll-interface to be used by clients of class 'ipsdk::core::BaseActionProvider'
20 // warning C4275: non dll-interface class 'boost::noncopyable_::noncopyable' used as base for dll-interface class 'ipsdk::core::BaseActionProvider'
21 #pragma warning (push)
22 #pragma warning (disable : 4251 4275)
23 
28 #include <IPSDKComm/TcpIp/Types.h>
29 #include <IPSDKUtil/Tools/Chrono.h>
30 #include <IPSDKUtil/Tools/Guid.h>
31 #include <boost/noncopyable.hpp>
32 #include <boost/enable_shared_from_this.hpp>
33 #include <boost/thread/mutex.hpp>
34 #include <boost/thread/condition_variable.hpp>
35 #include <boost/chrono/duration.hpp>
36 
37 namespace ipsdk {
38 namespace processor {
39  class BaseAsyncProcessor;
40 }
41 namespace core {
42 
43 class BaseRequestOrigin;
44 class BasePriority;
45 class ThreadManager;
46 class ProviderManager;
47 class AskForRemoteAction;
48 class UpdateRemoteAction;
49 class UpdatePendingAction;
50 
53 
54 class IPSDKCORE_API BaseActionProvider : public boost::noncopyable,
55  public boost::enable_shared_from_this<BaseActionProvider>
56 {
57  // friend class for protected accesses
58  friend class processor::BaseAsyncProcessor;
59  friend class ThreadManager;
60  friend class ProviderManager;
61  friend class AskForRemoteAction;
62  friend class UpdateRemoteAction;
63  friend class UpdatePendingAction;
64 
65 public:
69  virtual ~BaseActionProvider() = 0;
71 
72 // methods
73 public:
75  bool isInit() const;
76 
79  const Guid& getGuid() const;
80 
83  const ePriority& getActionsPriority() const;
84 
87  eExecutionStatus getStatus() const;
88 
92  void addCompletionCB(const ProviderCompletionCB& completionCB);
93 
96  bool areActionsPending() const;
97 
100  void waitForCompletion();
101 
106  bool waitForCompletion(const boost::chrono::milliseconds& duration);
107 
112  bool waitForCompletion(const boost::chrono::system_clock::time_point& deadLineTime);
113 
118  void requestCancellation();
119 
122  bool isCancellationRequested() const;
123 
127  ExecResult getGlobalResult() const;
128 
132  double getFullExecutionDuration() const;
133 
138  void clear();
139 
140 protected:
146  BoolResult initBase(const BasePriority& actionsPriority,
147  const Guid& providerGuid = Guid());
148 
152  bool existsRemoteProvider(const Guid& socketGuid);
153 
162  void addRemoteProvider(const Guid& socketGuid);
163 
169  bool unRegisterRemoteProvider(const Guid& socketGuid);
170 
179  BoolResult registerRemoteProvider(const Guid& socketGuid);
180 
185  BoolResult registerRemoteProviders();
186 
191  virtual QueryResult queryNextAction(const BaseRequestOrigin& requestOrigin,
192  ActionRequestPtr& pActionRequest,
193  bool& bProcessCompletionCheck,
194  SerializationObjectPtr& pCbAdditionalData) = 0;
195 
198  virtual bool hasPendingAction() const = 0;
199 
203  virtual BoolResult notifyDerived(const ActionRequestPtr& pActionRequest,
204  const SerializationObjectConstPtr& pCbAdditionalData,
205  bool& bRestartProvider) {
206  bRestartProvider = false;
207  return true;
208  }
209 
211  virtual void clearDerived() {}
212 
214  virtual void requestCancellationDerived() {}
215 
216 private:
220  void notifyCompletion(const ActionRequestPtr& pActionRequest,
221  const SerializationObjectConstPtr& pCbAdditionalData);
222 
227  QueryResult getNextAction(const BaseRequestOrigin& requestOrigin,
228  ActionRequestPtr& pActionRequest);
229 
236  ActionRequestPtr getActionRequest(const Guid& requestGuid);
237 
239  void internalClear();
240 
244  void addCompletionCB(const ProviderCompletionCB& completionCB,
245  bool bPushBack);
246 
248  void checkForCompletion();
249 
251  void connectionLostCB(const tcpip::SocketDesc& socketDesc,
252  const boost::system::error_code& ec);
253 
254 // attributes
255 private:
257  Guid _providerGuid;
258 
260  eExecutionStatus _providerStatus;
261 
263  ePriority _actionsPriority;
264 
266  ProviderCompletionCBColl _completionCBColl;
267 
269  boost::mutex _completionCBMutex;
270 
272  bool volatile _bCancellationRequested;
273 
275  ExecResult _bGlobalResult;
276 
278  bool volatile _bPendingActions;
279 
281  ActionRequestColl _currentActionRequestColl;
282 
284  Chrono _fullExecutionClk;
285 
287  double _fullExecutionDuration;
288 
290  typedef std::map<Guid, Guid> GuidMap;
291 
293  GuidMap _socketCBGuidColl;
294 
296  mutable boost::mutex _mutex;
297 
299  boost::condition_variable _condition;
300 
302  bool _bInit;
303 };
304 
307 
308 inline bool
310 {
311  return _bInit;
312 }
313 
316 
317 } // end of namespace core
318 } // end of namespace ipsdk
319 
320 #pragma warning (pop)
321 
322 #endif // __IPSDKCORE_BASEACTIONPROVIDER_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
boost::shared_ptr< const BaseSerializationObject > SerializationObjectConstPtr
shared pointer to a const base serialization object
Definition: SerializationTypes.h:32
Action allowing to update a pending action on a distant machine.
Definition: UpdatePendingAction.h:32
virtual BoolResult notifyDerived(const ActionRequestPtr &pActionRequest, const SerializationObjectConstPtr &pCbAdditionalData, bool &bRestartProvider)
method used to notify of execution completion for a given request
Definition: BaseActionProvider.h:203
virtual void clearDerived()
clear of data in derived class
Definition: BaseActionProvider.h:211
boost::function1< void, const ActionProviderPtr & > ProviderCompletionCB
function callback used to notify of action provider completion
Definition: ActionProviderTypes.h:64
Definition of import/export macro for library.
Base class for priority encapsulation.
Definition: BasePriority.h:32
Base class for action providers.
Definition: BaseActionProvider.h:54
#define IPSDKCORE_API
Import/Export macro for library IPSDKCore.
Definition: IPSDKCoreExports.h:27
virtual void requestCancellationDerived()
method allowing to request cancellation in derived classes
Definition: BaseActionProvider.h:214
Class encapsulating an auto initialized uuid.
Definition: Guid.h:27
Predefined types for action provider management.
Base class for asynchronous processors.
Definition: BaseAsyncProcessor.h:29
std::map< Guid, ActionRequestPtr > ActionRequestColl
collection of action requests
Definition: ActionProviderTypes.h:61
ePriority
Enumerate describing priority.
Definition: PriorityTypes.h:32
bool isInit() const
retrieve object initialization flag
Definition: BaseActionProvider.h:309
Action allowing to update an action on a distant machine.
Definition: UpdateRemoteAction.h:32
Definition: SocketDesc.h:35
Predefined types for processing management.
boost::shared_ptr< BaseActionRequest > ActionRequestPtr
shared pointer for action requests
Definition: ActionRequestTypes.h:52
Chronometer class for library processing time evaluation.
Definition: Chrono.h:33
Class allowing to manager providers execution with respect to their priority.
Definition: ProviderManager.h:37
boost::shared_ptr< BaseSerializationObject > SerializationObjectPtr
shared pointer to a base serialization object
Definition: SerializationTypes.h:23
std::list< ProviderCompletionCB > ProviderCompletionCBColl
collection of functions callback used to notify of action provider completion
Definition: ActionProviderTypes.h:67
Base class for request origin description.
Definition: BaseRequestOrigin.h:28
eExecutionStatus
Enumerate describing an execution status.
Definition: ProcessingTypes.h:33
Predefined types for ip addresses management.
Predefined types for priorities management.
Action allowing to ask for a new action on a distant machine.
Definition: AskForRemoteAction.h:31
Singleton class used to manage execution threads.
Definition: ThreadManager.h:38