cisst-saw
Loading...
Searching...
No Matches
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
14This software is provided "as is" under an open source license, with
15no warranty. The complete license can be found in license.txt and
16http://www.cisst.org/cisst/license.txt.
17
18--- end cisst license ---
19*/
20
21
26
27
28#ifndef _mtsCommandQueuedWrite_h
29#define _mtsCommandQueuedWrite_h
30
32
33
38
41template <class _argumentType>
42class mtsCommandQueuedWrite: public mtsCommandQueuedWriteBase
43{
44public:
46 typedef _argumentType ArgumentType;
49
51 typedef mtsCommandQueuedWrite<ArgumentType> ThisType;
52
53protected:
56
57private:
59 inline mtsCommandQueuedWrite(const ThisType & CMN_UNUSED(other));
60
61public:
62
67
68
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;
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;
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
209class CISST_EXPORT mtsCommandQueuedWriteGeneric: public mtsCommandQueuedWriteBase
210{
211 protected:
213 typedef mtsCommandQueuedWriteGeneric ThisType;
214
215 size_t ArgumentQueueSize; // size used for queue
218
219private:
221 inline mtsCommandQueuedWriteGeneric(void);
222
224 inline mtsCommandQueuedWriteGeneric(const ThisType & CMN_UNUSED(other));
225
226public:
235
236
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
std::string Name
Definition mtsCommandBase.h:52
bool IsEnabled(void) const
Definition mtsCommandBase.h:105
mtsCommandWriteBase * ActualCommand
Definition mtsCommandQueuedWriteBase.h:41
mtsCommandQueuedWriteBase(void)
Definition mtsCommandQueuedWriteBase.h:52
mtsQueue< mtsCommandWriteBase * > FinishedEventQueue
Definition mtsCommandQueuedWriteBase.h:50
mtsQueue< mtsBlockingType > BlockingFlagQueue
Definition mtsCommandQueuedWriteBase.h:45
mtsMailBox * MailBox
Definition mtsCommandQueuedWriteBase.h:40
virtual mtsGenericObject * ArgumentGet(void)
Definition mtsCommandQueuedWrite.h:274
virtual void Allocate(size_t size)
const mtsGenericObject * GetArgumentPrototype(void) const
Definition mtsCommandQueuedWrite.h:264
virtual void SetArgumentPrototype(const mtsGenericObject *argumentPrototype)
Definition mtsCommandQueuedWrite.h:252
mtsCommandQueuedWriteGeneric ThisType
Definition mtsCommandQueuedWrite.h:213
mtsCommandQueuedWriteGeneric(mtsMailBox *mailBox, mtsCommandWriteBase *actualCommand, size_t size)
virtual const mtsGenericObject * ArgumentPeek(void) const
Definition mtsCommandQueuedWrite.h:269
mtsExecutionResult Execute(const mtsGenericObject &argument, mtsBlockingType blocking, mtsCommandWriteBase *finishedEventHandler)
size_t ArgumentQueueSize
Definition mtsCommandQueuedWrite.h:215
virtual mtsCommandQueuedWriteGeneric * Clone(mtsMailBox *mailBox, size_t size) const
Definition mtsCommandQueuedWrite.h:243
mtsQueueGeneric ArgumentsQueue
Definition mtsCommandQueuedWrite.h:217
mtsCommandQueuedWriteBase BaseType
Definition mtsCommandQueuedWrite.h:212
virtual void ToStream(std::ostream &outputStream) const
virtual ~mtsCommandQueuedWriteGeneric()
Definition mtsCommandQueuedWrite.h:238
virtual ~mtsCommandQueuedWrite()
Definition mtsCommandQueuedWrite.h:93
const mtsGenericObject * GetArgumentPrototype(void) const
Definition mtsCommandQueuedWrite.h:189
_argumentType ArgumentType
Definition mtsCommandQueuedWrite.h:46
virtual mtsGenericObject * ArgumentGet(void)
Definition mtsCommandQueuedWrite.h:198
mtsCommandQueuedWrite(mtsMailBox *mailBox, mtsCommandWriteBase *actualCommand, size_t size)
Definition mtsCommandQueuedWrite.h:75
mtsCommandQueuedWriteBase BaseType
Definition mtsCommandQueuedWrite.h:45
mtsCommandQueuedWrite(void)
Definition mtsCommandQueuedWrite.h:63
mtsGenericTypesUnwrap< ArgumentQueueType >::BaseType ArgumentQueueBaseType
Definition mtsCommandQueuedWrite.h:48
virtual const mtsGenericObject * ArgumentPeek(void) const
Definition mtsCommandQueuedWrite.h:193
mtsCommandQueuedWrite(mtsCommandWriteBase *actualCommand)
Definition mtsCommandQueuedWrite.h:69
virtual void Allocate(size_t size)
Definition mtsCommandQueuedWrite.h:102
mtsGenericTypes< ArgumentType >::FinalType ArgumentQueueType
Definition mtsCommandQueuedWrite.h:47
mtsQueue< ArgumentQueueType > ArgumentsQueue
Definition mtsCommandQueuedWrite.h:55
mtsExecutionResult Execute(const mtsGenericObject &argument, mtsBlockingType blocking, mtsCommandWriteBase *finishedEventHandler)
Definition mtsCommandQueuedWrite.h:122
virtual mtsCommandQueuedWriteBase * Clone(mtsMailBox *mailBox, size_t size) const
Definition mtsCommandQueuedWrite.h:96
mtsCommandQueuedWrite< ArgumentType > ThisType
Definition mtsCommandQueuedWrite.h:51
Definition mtsCommandWriteBase.h:40
virtual const mtsGenericObject * GetArgumentPrototype(void) const
Definition mtsCommandWriteBase.h:93
mtsCommandWriteBase(void)
Definition mtsCommandWriteBase.h:49
friend class mtsCommandQueuedWriteGeneric
Definition mtsCommandWriteBase.h:43
Definition mtsExecutionResult.h:34
@ COMMAND_QUEUED
Definition mtsExecutionResult.h:44
@ UNDEFINED
Definition mtsExecutionResult.h:44
@ COMMAND_HAS_NO_MAILBOX
Definition mtsExecutionResult.h:44
@ COMMAND_ARGUMENT_QUEUE_FULL
Definition mtsExecutionResult.h:44
@ INVALID_INPUT_TYPE
Definition mtsExecutionResult.h:44
@ COMMAND_DISABLED
Definition mtsExecutionResult.h:44
Base class for data object in cisstMultiTask.
Definition mtsGenericObject.h:52
mtsGenericTypesImpl< T, cmnIsDerivedFrom< T, mtsGenericObject >::IS_DERIVED >::FinalType FinalType
Definition mtsGenericObjectProxy.h:686
mtsGenericTypesUnwrapImpl< T, cmnIsDerivedFromTemplated< T, mtsGenericObjectProxyBase >::IS_DERIVED >::BaseType BaseType
Definition mtsGenericObjectProxy.h:732
Definition mtsMailBox.h:36
bool IsFull(void) const
bool Write(mtsCommandBase *command)
Definition mtsQueue.h:197
pointer Peek(void) const
Definition mtsQueue.h:360
pointer Get(void)
Definition mtsQueue.h:371
Definition mtsQueue.h:41
bool IsFull(void) const
Definition mtsQueue.h:124
pointer Get(void)
Definition mtsQueue.h:179
pointer Peek(void) const
Definition mtsQueue.h:168
const_pointer Put(const typename mtsGenericTypesUnwrap< value_type >::BaseType &newObject)
Definition mtsQueue.h:146
size_type GetSize(void) const
Definition mtsQueue.h:106
void SetSize(size_type size, const_reference value)
Definition mtsQueue.h:99
#define CISST_EXPORT
Definition cmnExportMacros.h:50
#define CMN_LOG_RUN_ERROR
Definition cmnLogger.h:166
#define CMN_LOG_RUN_WARNING
Definition cmnLogger.h:167
#define CMN_LOG_INIT_WARNING
Definition cmnLogger.h:163
#define CMN_LOG_INIT_ERROR
Definition cmnLogger.h:162
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
Defines base class for a queued write command.
mtsBlockingType
Definition mtsForwardDeclarations.h:54
@ MTS_NOT_BLOCKING
Definition mtsForwardDeclarations.h:54
size_type size(void) const
Definition vctDynamicConstMatrixBase.h:228