cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
mtsCommandQueuedWrite.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Ankur Kapoor, Peter Kazanzides, Anton Deguet
7  Created on: 2005-05-02
8 
9  (C) Copyright 2005-2014 Johns Hopkins University (JHU), All Rights
10  Reserved.
11 
12 --- begin cisst license - do not edit ---
13 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 
28 #ifndef _mtsCommandQueuedWrite_h
29 #define _mtsCommandQueuedWrite_h
30 
32 
33 
41 template <class _argumentType>
43 {
44 public:
46  typedef _argumentType ArgumentType;
49 
52 
53 protected:
56 
57 private:
59  inline mtsCommandQueuedWrite(const ThisType & CMN_UNUSED(other));
60 
61 public:
62 
63  inline mtsCommandQueuedWrite(void):
64  BaseType(),
66  {}
67 
68 
69  inline mtsCommandQueuedWrite(mtsCommandWriteBase * actualCommand):
70  BaseType(0, actualCommand, 0),
72  {}
73 
74 
75  inline mtsCommandQueuedWrite(mtsMailBox * mailBox, mtsCommandWriteBase * actualCommand, size_t size):
76  BaseType(mailBox, actualCommand, size),
78  {
79  const ArgumentQueueType * argumentPrototype = dynamic_cast<const ArgumentQueueType *>(this->GetArgumentPrototype());
80  if (argumentPrototype) {
81  ArgumentsQueue.SetSize(size, *argumentPrototype);
83  mtsCommandWriteBase *cmd = 0;
84  FinishedEventQueue.SetSize(size, cmd);
85  } else {
86  CMN_LOG_INIT_ERROR << "Class mtsCommandQueuedWrite: constructor: can't find argument prototype from actual command."
87  << std::endl;
88  }
89  }
90 
91 
92  // ArgumentsQueue destructor should get called
93  inline virtual ~mtsCommandQueuedWrite() {}
94 
95 
96  inline virtual mtsCommandQueuedWriteBase * Clone(mtsMailBox * mailBox, size_t size) const {
97  return new mtsCommandQueuedWrite(mailBox, this->ActualCommand, size);
98  }
99 
100 
101  // Allocate should be called when a task calls GetMethodXXX().
102  inline virtual void Allocate(size_t size) {
103  if (ArgumentsQueue.GetSize() != size) {
104  if (ArgumentsQueue.GetSize() > 0) {
105  // Probably should never happen
106  CMN_LOG_INIT_WARNING << "Class mtsCommandQueuedWrite: Allocate(): changing ArgumentsQueue size from " << ArgumentsQueue.GetSize()
107  << " to " << size << std::endl;
108  }
109  const ArgumentQueueType * argumentPrototype = dynamic_cast<const ArgumentQueueType *>(this->GetArgumentPrototype());
110  if (argumentPrototype) {
111  ArgumentsQueue.SetSize(size, *argumentPrototype);
113  mtsCommandWriteBase *cmd = 0;
114  FinishedEventQueue.SetSize(size, cmd);
115  } else {
116  CMN_LOG_INIT_ERROR << "Class mtsCommandQueuedWrite: constructor: can't find argument prototype from actual command."
117  << std::endl;
118  }
119  }
120  }
121 
123  mtsBlockingType blocking,
124  mtsCommandWriteBase * finishedEventHandler) {
125  // check if this command is enabled
126  if (!this->IsEnabled()) {
128  }
129  // check if there is a mailbox (i.e. if the command is associated to an interface
130  if (!MailBox) {
131  CMN_LOG_RUN_ERROR << "Class mtsCommandQueuedWrite: Execute: no mailbox for \""
132  << this->Name << "\"" << std::endl;
134  }
135  // try to cast the input type
136  const ArgumentQueueBaseType * argumentTyped = dynamic_cast<const ArgumentQueueBaseType*>(&argument);
137  if (!argumentTyped) {
139  }
140  // check if all queues have some space
142  CMN_LOG_RUN_WARNING << "Class mtsCommandQueuedWrite: Execute: Queue full for \""
143  << this->Name << "\" ["
144  << ArgumentsQueue.IsFull() << "|"
145  << BlockingFlagQueue.IsFull() << "|"
146  << FinishedEventQueue.IsFull() << "|"
147  << MailBox->IsFull() << "]"
148  << std::endl;
150  }
151  // copy the argument to the local storage.
152  if (!ArgumentsQueue.Put(*argumentTyped)) {
153  CMN_LOG_RUN_ERROR << "Class mtsCommandQueuedWrite: Execute: ArgumentsQueue full for \""
154  << this->Name << "\"" << std::endl;
155  cmnThrow("mtsCommandQueuedWrite: Execute: ArgumentsQueue.Put failed");
157  }
158  // copy the blocking flag to the local storage.
159  if (!BlockingFlagQueue.Put(blocking)) {
160  CMN_LOG_RUN_ERROR << "Class mtsCommandQueuedWrite: Execute: BlockingFlagQueue full for \""
161  << this->Name << "\"" << std::endl;
162  ArgumentsQueue.Get(); // pop argument
163  cmnThrow("mtsCommandQueuedWrite: Execute: BlockingFlagQueue.Put failed");
165  }
166  // copy the finished event handler to the local storage.
167  if (!FinishedEventQueue.Put(finishedEventHandler)) {
168  CMN_LOG_RUN_ERROR << "Class mtsCommandQueuedWrite: Execute: FinishedEventQueue.Put failed for \""
169  << this->Name << "\"" << std::endl;
170  ArgumentsQueue.Get(); // Remove the argument that was already queued
171  BlockingFlagQueue.Get(); // Remove the blocking flag that was already queued
172  cmnThrow("mtsCommandQueuedWrite: Execute: FinishedEventQueue.Put failed");
174  }
175  // finally try to queue to mailbox
176  if (!MailBox->Write(this)) {
177  CMN_LOG_RUN_ERROR << "Class mtsCommandQueuedWrite: Execute: mailbox full for \""
178  << this->Name << "\"" << std::endl;
179  ArgumentsQueue.Get(); // pop argument, blocking flag, and finished event from local storage
182  cmnThrow("mtsCommandQueuedWrite: Execute: MailBox.Write failed");
184  }
186  }
187 
188  /* commented in base class */
190  return this->ActualCommand->GetArgumentPrototype();
191  }
192 
193  inline virtual const mtsGenericObject * ArgumentPeek(void) const {
194  return ArgumentsQueue.Peek();
195  }
196 
197 
198  inline virtual mtsGenericObject * ArgumentGet(void) {
199  return ArgumentsQueue.Get();
200  }
201 };
202 
203 
208 // PK: methods are defined in mtsCommandQueuedWriteBase.cpp
210 {
211  protected:
214 
215  size_t ArgumentQueueSize; // size used for queue
218 
219 private:
221  inline mtsCommandQueuedWriteGeneric(void);
222 
224  inline mtsCommandQueuedWriteGeneric(const ThisType & CMN_UNUSED(other));
225 
226 public:
234  mtsCommandQueuedWriteGeneric(mtsMailBox * mailBox, mtsCommandWriteBase * actualCommand, size_t size);
235 
236 
238  inline virtual ~mtsCommandQueuedWriteGeneric() {}
239 
240 
241  virtual void ToStream(std::ostream & outputStream) const;
242 
243  inline virtual mtsCommandQueuedWriteGeneric * Clone(mtsMailBox * mailBox, size_t size) const {
244  return new mtsCommandQueuedWriteGeneric(mailBox, this->ActualCommand, size);
245  }
246 
247 
248  // Allocate should be called when a task calls GetMethodXXX().
249  virtual void Allocate(size_t size);
250 
251 
252  inline virtual void SetArgumentPrototype(const mtsGenericObject * argumentPrototype) {
253  this->ActualCommand->SetArgumentPrototype(argumentPrototype);
254  this->Allocate(this->ArgumentQueueSize);
255  }
256 
257 
259  mtsBlockingType blocking,
260  mtsCommandWriteBase *finishedEventHandler);
261 
262 
263  /* commented in base class */
265  return this->ActualCommand->GetArgumentPrototype();
266  }
267 
268 
269  inline virtual const mtsGenericObject * ArgumentPeek(void) const {
270  return ArgumentsQueue.Peek();
271  }
272 
273 
274  inline virtual mtsGenericObject * ArgumentGet(void) {
275  return ArgumentsQueue.Get();
276  }
277 };
278 
279 #endif // _mtsCommandQueuedWrite_h
280 
friend class mtsCommandQueuedWriteGeneric
Definition: mtsCommandWriteBase.h:43
#define CISST_EXPORT
Definition: cmnExportMacros.h:50
mtsQueue< mtsBlockingType > BlockingFlagQueue
Definition: mtsCommandQueuedWriteBase.h:45
mtsGenericTypesUnwrap< ArgumentQueueType >::BaseType ArgumentQueueBaseType
Definition: mtsCommandQueuedWrite.h:48
const mtsGenericObject * GetArgumentPrototype(void) const
Definition: mtsCommandQueuedWrite.h:189
pointer Get(void)
Definition: mtsQueue.h:179
Definition: mtsExecutionResult.h:44
bool IsEnabled(void) const
Definition: mtsCommandBase.h:105
#define CMN_LOG_RUN_ERROR
Definition: cmnLogger.h:166
virtual mtsCommandQueuedWriteBase * Clone(mtsMailBox *mailBox, size_t size) const
Definition: mtsCommandQueuedWrite.h:96
bool Write(mtsCommandBase *command)
void SetSize(size_type size, const_reference value)
Definition: mtsQueue.h:99
#define CMN_UNUSED(argument)
Definition: cmnPortability.h:479
Definition: mtsForwardDeclarations.h:55
Definition: mtsExecutionResult.h:44
Definition: mtsExecutionResult.h:44
#define CMN_LOG_INIT_ERROR
Definition: cmnLogger.h:162
Base class for data object in cisstMultiTask.
Definition: mtsGenericObject.h:56
virtual mtsGenericObject * ArgumentGet(void)
Definition: mtsCommandQueuedWrite.h:274
mtsCommandQueuedWriteBase BaseType
Definition: mtsCommandQueuedWrite.h:45
virtual void SetArgumentPrototype(const mtsGenericObject *argumentPrototype)
Definition: mtsCommandQueuedWrite.h:252
mtsQueue< ArgumentQueueType > ArgumentsQueue
Definition: mtsCommandQueuedWrite.h:55
virtual mtsCommandQueuedWriteGeneric * Clone(mtsMailBox *mailBox, size_t size) const
Definition: mtsCommandQueuedWrite.h:243
mtsCommandQueuedWrite(mtsCommandWriteBase *actualCommand)
Definition: mtsCommandQueuedWrite.h:69
#define CMN_LOG_RUN_WARNING
Definition: cmnLogger.h:167
virtual const mtsGenericObject * ArgumentPeek(void) const
Definition: mtsCommandQueuedWrite.h:193
size_t ArgumentQueueSize
Definition: mtsCommandQueuedWrite.h:215
std::string Name
Definition: mtsCommandBase.h:52
Definition: mtsCommandWriteBase.h:40
Definition: mtsExecutionResult.h:44
Definition: mtsCommandQueuedWrite.h:209
mtsGenericTypesUnwrapImpl< T, cmnIsDerivedFromTemplated< T, mtsGenericObjectProxyBase >::IS_DERIVED >::BaseType BaseType
Definition: mtsGenericObjectProxy.h:715
mtsQueueGeneric ArgumentsQueue
Definition: mtsCommandQueuedWrite.h:217
Defines base class for a queued write command.
Definition: mtsQueue.h:196
bool IsFull(void) const
virtual ~mtsCommandQueuedWriteGeneric()
Definition: mtsCommandQueuedWrite.h:238
mtsMailBox * MailBox
Definition: mtsCommandQueuedWriteBase.h:40
Definition: mtsCommandQueuedWriteBase.h:37
virtual mtsGenericObject * ArgumentGet(void)
Definition: mtsCommandQueuedWrite.h:198
mtsCommandQueuedWrite(void)
Definition: mtsCommandQueuedWrite.h:63
virtual void Allocate(size_t size)
Definition: mtsCommandQueuedWrite.h:102
const mtsGenericObject * GetArgumentPrototype(void) const
Definition: mtsCommandQueuedWrite.h:264
#define cmnThrow(a)
Definition: MinimalCmn.h:4
bool IsFull(void) const
Definition: mtsQueue.h:124
virtual ~mtsCommandQueuedWrite()
Definition: mtsCommandQueuedWrite.h:93
const_pointer Put(const typename mtsGenericTypesUnwrap< value_type >::BaseType &newObject)
Definition: mtsQueue.h:146
Definition: mtsExecutionResult.h:44
mtsExecutionResult Execute(const mtsGenericObject &argument, mtsBlockingType blocking, mtsCommandWriteBase *finishedEventHandler)
Definition: mtsCommandQueuedWrite.h:122
mtsCommandQueuedWrite< ArgumentType > ThisType
Definition: mtsCommandQueuedWrite.h:51
Definition: mtsExecutionResult.h:34
Definition: mtsExecutionResult.h:44
Definition: mtsQueue.h:40
mtsGenericTypes< ArgumentType >::FinalType ArgumentQueueType
Definition: mtsCommandQueuedWrite.h:47
mtsExecutionResult Execute(const mtsGenericObject &argument, mtsBlockingType blocking)
_argumentType ArgumentType
Definition: mtsCommandQueuedWrite.h:46
mtsCommandQueuedWrite(mtsMailBox *mailBox, mtsCommandWriteBase *actualCommand, size_t size)
Definition: mtsCommandQueuedWrite.h:75
mtsQueue< mtsCommandWriteBase * > FinishedEventQueue
Definition: mtsCommandQueuedWriteBase.h:50
#define CMN_LOG_INIT_WARNING
Definition: cmnLogger.h:163
Definition: mtsGenericObjectProxy.h:45
mtsBlockingType
Definition: mtsForwardDeclarations.h:55
Definition: mtsMailBox.h:36
virtual const mtsGenericObject * ArgumentPeek(void) const
Definition: mtsCommandQueuedWrite.h:269
virtual void Allocate(size_t size)=0
mtsCommandWriteBase * ActualCommand
Definition: mtsCommandQueuedWriteBase.h:41
mtsCommandQueuedWriteGeneric ThisType
Definition: mtsCommandQueuedWrite.h:213
virtual const mtsGenericObject * GetArgumentPrototype(void) const
Definition: mtsCommandWriteBase.h:93
mtsCommandQueuedWriteBase BaseType
Definition: mtsCommandQueuedWrite.h:212
virtual void ToStream(std::ostream &outputStream) const
Definition: mtsCommandQueuedWrite.h:42