cisst-saw
Loading...
Searching...
No Matches
mtsTaskFromCallback.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 Author(s): Peter Kazanzides
6 Created on: 2008-09-10
7
8 (C) Copyright 2008-2023 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19
24
25#ifndef _mtsTaskFromCallback_h
26#define _mtsTaskFromCallback_h
27
30
31// Always include last
33
34#ifndef MTS_TASK_CALLBACK_CONVENTION
35#define MTS_TASK_CALLBACK_CONVENTION
36#endif
37
76
78{
80
81protected:
83
84 /************************ Protected task data *********************/
86
87 /********************* Methods that call user methods *****************/
88
91 void *RunInternal(void* argument) override;
92
95 void StartupInternal(void) override;
96
97public:
98 /********************* Task constructor and destructor *****************/
99
111 mtsTaskFromCallback(const std::string & name,
112 unsigned int sizeStateTable = 256):
113 mtsTask(name, sizeStateTable), inRunInternal(false) {}
114
116 mtsTask(arg.Name, arg.StateTableSize), inRunInternal(false) {}
117
120
121 /********************* Methods to change task status *****************/
122 /* (use Kill method from base class) */
123
124 /* Create a new thread (if needed). */
125 void Create(void *data = 0) override;
126
128 void Start(void) override;
129
131 void Suspend(void) override;
132
134 void Kill(void) override;
135
137 virtual void *DoCallback(void *data = 0) {
138 // The user Run() method should call SetThreadReturnValue.
139 return RunInternal(data);
140 }
141};
142
144
145
152
153// PK: This class should be in a separate file, but I would like to
154// find a better name first.
155
157{
158 CMN_DECLARE_SERVICES(CMN_NO_DYNAMIC_CREATION, CMN_LOG_ALLOW_DEFAULT);
159
160protected:
162
163 enum SignatureType {INVALID = 0, VALID = 0x3242 };
171
172public:
173
174 inline mtsTaskFromCallbackAdapter(const std::string & name,
175 unsigned int sizeStateTable = 256):
176 mtsTaskFromCallback(name, sizeStateTable),
177 callbackData() {}
178
182
184
194 template <class _callbackReturnType>
195 static _callbackReturnType MTS_TASK_CALLBACK_CONVENTION CallbackAdapter(void *obj);
196
200 virtual void *GetCallbackParameter() {
202 callbackData.obj = this;
203 return static_cast<void*>(&callbackData);
204 }
205
206};
207
209
210template <class _callbackReturnType>
212{
213 if (!obj) {
214 CMN_LOG_INIT_ERROR << "CallbackAdapter got null pointer" << std::endl;
215 return _callbackReturnType();
216 }
217 CallbackData* _this = static_cast<CallbackData*>(obj);
218 if (_this->signature != VALID) {
219 CMN_LOG_INIT_ERROR << "CallbackAdapter received invalid signature: " << _this->signature << std::endl;
220 return _callbackReturnType();
221 }
222 void *ret =_this->obj->DoCallback(0);
223 // Following won't compile if _callbackReturnType is 'void'.
224 // TBD: workaround using a type traits approach.
225 return *static_cast<_callbackReturnType *>(ret);
226}
227
228
229#endif // _mtsTaskFromCallback_h
std::string Name
Definition mtsComponent.h:159
Definition mtsParameterTypes.h:1401
Definition mtsTaskFromCallback.h:157
mtsTaskFromCallback BaseType
Definition mtsTaskFromCallback.h:161
mtsTaskFromCallbackAdapter(const std::string &name, unsigned int sizeStateTable=256)
Definition mtsTaskFromCallback.h:174
CallbackData callbackData
Definition mtsTaskFromCallback.h:170
SignatureType
Definition mtsTaskFromCallback.h:163
@ INVALID
Definition mtsTaskFromCallback.h:163
@ VALID
Definition mtsTaskFromCallback.h:163
static _callbackReturnType MTS_TASK_CALLBACK_CONVENTION CallbackAdapter(void *obj)
Definition mtsTaskFromCallback.h:211
virtual void * GetCallbackParameter()
Definition mtsTaskFromCallback.h:200
~mtsTaskFromCallbackAdapter()
Definition mtsTaskFromCallback.h:183
mtsTaskFromCallbackAdapter(const mtsTaskConstructorArg &arg)
Definition mtsTaskFromCallback.h:179
Definition mtsTaskFromCallback.h:78
mtsTaskFromCallback(const std::string &name, unsigned int sizeStateTable=256)
Definition mtsTaskFromCallback.h:111
mtsTaskFromCallback(const mtsTaskConstructorArg &arg)
Definition mtsTaskFromCallback.h:115
virtual ~mtsTaskFromCallback()
Definition mtsTaskFromCallback.h:119
void Create(void *data=0) override
virtual void * DoCallback(void *data=0)
Definition mtsTaskFromCallback.h:137
void Start(void) override
bool inRunInternal
Definition mtsTaskFromCallback.h:85
mtsTask BaseType
Definition mtsTaskFromCallback.h:82
void StartupInternal(void) override
void Kill(void) override
void * RunInternal(void *argument) override
void Suspend(void) override
mtsTask(const std::string &name, unsigned int sizeStateTable=256)
#define CMN_DECLARE_SERVICES_INSTANTIATION(className)
Definition cmnClassRegisterMacros.h:199
const int CMN_NO_DYNAMIC_CREATION
Definition cmnClassRegisterMacros.h:325
#define CISST_EXPORT
Definition cmnExportMacros.h:50
#define CMN_LOG_ALLOW_DEFAULT
Definition cmnLogLoD.h:76
#define CMN_LOG_INIT_ERROR
Definition cmnLogger.h:162
Portability across compilers and operating systems tools.
Rules of exporting.
Defines a periodic task.
#define MTS_TASK_CALLBACK_CONVENTION
Definition mtsTaskFromCallback.h:35
Definition mtsTaskFromCallback.h:164
~CallbackData()
Definition mtsTaskFromCallback.h:168
SignatureType signature
Definition mtsTaskFromCallback.h:165
mtsTaskFromCallback * obj
Definition mtsTaskFromCallback.h:166
CallbackData()
Definition mtsTaskFromCallback.h:167