]>
Commit | Line | Data |
---|---|---|
f23a6e1a | 1 | // $Id$ |
2 | ||
3 | /************************************************************************** | |
4 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
5 | * * | |
6 | * Authors: Matthias Richter <Matthias.Richter@ift.uib.no> * | |
7 | * Timm Steinbeck <timm@kip.uni-heidelberg.de> * | |
f23a6e1a | 8 | * for The ALICE Off-line Project. * |
9 | * * | |
10 | * Permission to use, copy, modify and distribute this software and its * | |
11 | * documentation strictly for non-commercial purposes is hereby granted * | |
12 | * without fee, provided that the above copyright notice appears in all * | |
13 | * copies and that both the copyright notice and this permission notice * | |
14 | * appear in the supporting documentation. The authors make no claims * | |
15 | * about the suitability of this software for any purpose. It is * | |
16 | * provided "as is" without express or implied warranty. * | |
17 | **************************************************************************/ | |
18 | ||
bfccbf68 | 19 | /** @file AliHLTComponent.cxx |
20 | @author Matthias Richter, Timm Steinbeck | |
21 | @date | |
22 | @brief Base class implementation for HLT components. */ | |
f23a6e1a | 23 | |
0c0c9d99 | 24 | #if __GNUC__>= 3 |
f23a6e1a | 25 | using namespace std; |
26 | #endif | |
27 | ||
85869391 | 28 | #include "AliHLTStdIncludes.h" |
f23a6e1a | 29 | #include "AliHLTComponent.h" |
30 | #include "AliHLTComponentHandler.h" | |
70ed7d01 | 31 | #include "TString.h" |
f23a6e1a | 32 | |
b22e91eb | 33 | /** ROOT macro for the implementation of ROOT specific class methods */ |
f23a6e1a | 34 | ClassImp(AliHLTComponent) |
35 | ||
f23a6e1a | 36 | AliHLTComponent::AliHLTComponent() |
85869391 | 37 | : |
53feaef5 | 38 | fEnvironment(), |
3cde846d | 39 | fCurrentEvent(0), |
40 | fEventCount(-1) | |
70ed7d01 | 41 | { |
42 | // see header file for class documentation | |
43 | // or | |
44 | // refer to README to build package | |
45 | // or | |
46 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt | |
f23a6e1a | 47 | memset(&fEnvironment, 0, sizeof(AliHLTComponentEnvironment)); |
70ed7d01 | 48 | if (fgpComponentHandler) |
49 | fgpComponentHandler->ScheduleRegister(this); | |
50 | } | |
51 | ||
52 | AliHLTComponent::AliHLTComponent(const AliHLTComponent&) | |
53 | : | |
54 | fEnvironment(), | |
55 | fCurrentEvent(0), | |
56 | fEventCount(-1) | |
57 | { | |
58 | // see header file for class documentation | |
59 | HLTFatal("copy constructor untested"); | |
60 | } | |
61 | ||
62 | AliHLTComponent& AliHLTComponent::operator=(const AliHLTComponent&) | |
63 | { | |
64 | // see header file for class documentation | |
65 | HLTFatal("assignment operator untested"); | |
66 | return *this; | |
f23a6e1a | 67 | } |
68 | ||
69 | AliHLTComponent::~AliHLTComponent() | |
70 | { | |
70ed7d01 | 71 | // see header file for function documentation |
f23a6e1a | 72 | } |
73 | ||
70ed7d01 | 74 | AliHLTComponentHandler* AliHLTComponent::fgpComponentHandler=NULL; |
b22e91eb | 75 | |
85869391 | 76 | int AliHLTComponent::SetGlobalComponentHandler(AliHLTComponentHandler* pCH, int bOverwrite) |
77 | { | |
70ed7d01 | 78 | // see header file for function documentation |
85869391 | 79 | int iResult=0; |
70ed7d01 | 80 | if (fgpComponentHandler==NULL || bOverwrite!=0) |
81 | fgpComponentHandler=pCH; | |
85869391 | 82 | else |
83 | iResult=-EPERM; | |
84 | return iResult; | |
85 | } | |
86 | ||
70ed7d01 | 87 | int AliHLTComponent::UnsetGlobalComponentHandler() |
88 | { | |
89 | // see header file for function documentation | |
85869391 | 90 | return SetGlobalComponentHandler(NULL,1); |
91 | } | |
92 | ||
70ed7d01 | 93 | int AliHLTComponent::Init( AliHLTComponentEnvironment* environ, void* environParam, int argc, const char** argv ) |
f23a6e1a | 94 | { |
70ed7d01 | 95 | // see header file for function documentation |
f23a6e1a | 96 | int iResult=0; |
97 | if (environ) { | |
98 | memcpy(&fEnvironment, environ, sizeof(AliHLTComponentEnvironment)); | |
70ed7d01 | 99 | fEnvironment.fParam=environParam; |
f23a6e1a | 100 | } |
101 | iResult=DoInit(argc, argv); | |
3cde846d | 102 | if (iResult>=0) fEventCount=0; |
f23a6e1a | 103 | return iResult; |
104 | } | |
105 | ||
106 | int AliHLTComponent::Deinit() | |
107 | { | |
70ed7d01 | 108 | // see header file for function documentation |
f23a6e1a | 109 | int iResult=0; |
110 | iResult=DoDeinit(); | |
111 | return iResult; | |
112 | } | |
fa2e9b7c | 113 | |
53feaef5 | 114 | int AliHLTComponent::DoInit( int argc, const char** argv ) |
115 | { | |
70ed7d01 | 116 | // see header file for function documentation |
53feaef5 | 117 | if (argc==0 && argv==NULL) { |
118 | // this is currently just to get rid of the warning "unused parameter" | |
119 | } | |
120 | return 0; | |
121 | } | |
122 | ||
123 | int AliHLTComponent::DoDeinit() | |
124 | { | |
70ed7d01 | 125 | // see header file for function documentation |
53feaef5 | 126 | return 0; |
127 | } | |
128 | ||
70ed7d01 | 129 | void AliHLTComponent::DataType2Text( const AliHLTComponentDataType& type, char output[kAliHLTComponentDataTypefIDsize+kAliHLTComponentDataTypefOriginSize+2] ) const |
130 | { | |
131 | // see header file for function documentation | |
9ce4bf4a | 132 | memset( output, 0, kAliHLTComponentDataTypefIDsize+kAliHLTComponentDataTypefOriginSize+2 ); |
133 | strncat( output, type.fOrigin, kAliHLTComponentDataTypefOriginSize ); | |
134 | strcat( output, ":" ); | |
135 | strncat( output, type.fID, kAliHLTComponentDataTypefIDsize ); | |
fa2e9b7c | 136 | } |
137 | ||
9ce4bf4a | 138 | string AliHLTComponent::DataType2Text( const AliHLTComponentDataType& type ) |
139 | { | |
70ed7d01 | 140 | // see header file for function documentation |
9ce4bf4a | 141 | string out(""); |
3cde846d | 142 | |
9ce4bf4a | 143 | if (type==kAliHLTVoidDataType) { |
144 | out="VOID:VOID"; | |
145 | } else { | |
3cde846d | 146 | // some gymnastics in order to avoid a '0' which is part of either or both |
147 | // ID and origin terminating the whole string. Unfortunately, string doesn't | |
148 | // stop appending at the '0' if the number of elements to append was | |
149 | // explicitely specified | |
150 | string tmp(""); | |
151 | tmp.append(type.fOrigin, kAliHLTComponentDataTypefOriginSize); | |
152 | out.append(tmp.c_str()); | |
9ce4bf4a | 153 | out.append(":"); |
3cde846d | 154 | tmp=""; |
155 | tmp.append(type.fID, kAliHLTComponentDataTypefIDsize); | |
156 | out.append(tmp.c_str()); | |
9ce4bf4a | 157 | } |
158 | return out; | |
159 | } | |
160 | ||
161 | ||
70ed7d01 | 162 | void* AliHLTComponent::AllocMemory( unsigned long size ) |
163 | { | |
164 | // see header file for function documentation | |
85869391 | 165 | if (fEnvironment.fAllocMemoryFunc) |
166 | return (*fEnvironment.fAllocMemoryFunc)(fEnvironment.fParam, size ); | |
9ce4bf4a | 167 | HLTFatal("no memory allocation handler registered"); |
85869391 | 168 | return NULL; |
169 | } | |
170 | ||
8ede8717 | 171 | int AliHLTComponent::MakeOutputDataBlockList( const vector<AliHLTComponentBlockData>& blocks, AliHLTUInt32_t* blockCount, |
70ed7d01 | 172 | AliHLTComponentBlockData** outputBlocks ) |
173 | { | |
174 | // see header file for function documentation | |
9ce4bf4a | 175 | if ( blockCount==NULL || outputBlocks==NULL ) |
2d7ff710 | 176 | return -EFAULT; |
fa2e9b7c | 177 | AliHLTUInt32_t count = blocks.size(); |
178 | if ( !count ) | |
179 | { | |
180 | *blockCount = 0; | |
181 | *outputBlocks = NULL; | |
182 | return 0; | |
183 | } | |
8ede8717 | 184 | *outputBlocks = reinterpret_cast<AliHLTComponentBlockData*>( AllocMemory( sizeof(AliHLTComponentBlockData)*count ) ); |
fa2e9b7c | 185 | if ( !*outputBlocks ) |
2d7ff710 | 186 | return -ENOMEM; |
ca8524df | 187 | for ( unsigned long i = 0; i < count; i++ ) { |
fa2e9b7c | 188 | (*outputBlocks)[i] = blocks[i]; |
ca8524df | 189 | if (blocks[i].fDataType==kAliHLTAnyDataType) { |
190 | memset((*outputBlocks)[i].fDataType.fID, '*', kAliHLTComponentDataTypefIDsize); | |
191 | memset((*outputBlocks)[i].fDataType.fOrigin, '*', kAliHLTComponentDataTypefOriginSize); | |
192 | } | |
193 | } | |
fa2e9b7c | 194 | *blockCount = count; |
195 | return 0; | |
196 | ||
197 | } | |
0c0c9d99 | 198 | |
70ed7d01 | 199 | int AliHLTComponent::GetEventDoneData( unsigned long size, AliHLTComponentEventDoneData** edd ) |
200 | { | |
201 | // see header file for function documentation | |
85869391 | 202 | if (fEnvironment.fGetEventDoneDataFunc) |
203 | return (*fEnvironment.fGetEventDoneDataFunc)(fEnvironment.fParam, fCurrentEvent, size, edd ); | |
204 | return -ENOSYS; | |
205 | } | |
206 | ||
8ede8717 | 207 | int AliHLTComponent::FindMatchingDataTypes(AliHLTComponent* pConsumer, vector<AliHLTComponentDataType>* tgtList) |
0c0c9d99 | 208 | { |
70ed7d01 | 209 | // see header file for function documentation |
0c0c9d99 | 210 | int iResult=0; |
211 | if (pConsumer) { | |
8ede8717 | 212 | vector<AliHLTComponentDataType> ctlist; |
0c0c9d99 | 213 | ((AliHLTComponent*)pConsumer)->GetInputDataTypes(ctlist); |
8ede8717 | 214 | vector<AliHLTComponentDataType>::iterator type=ctlist.begin(); |
0c0c9d99 | 215 | while (type!=ctlist.end() && iResult==0) { |
9ce4bf4a | 216 | if ((*type)==GetOutputDataType() || |
217 | (*type)==kAliHLTAnyDataType) { | |
0c0c9d99 | 218 | if (tgtList) tgtList->push_back(*type); |
219 | iResult++; | |
9ce4bf4a | 220 | // this loop has to be changed in case of multiple output types |
0c0c9d99 | 221 | break; |
222 | } | |
223 | type++; | |
224 | } | |
225 | } else { | |
226 | iResult=-EINVAL; | |
227 | } | |
228 | return iResult; | |
229 | } | |
2d7ff710 | 230 | |
70ed7d01 | 231 | void AliHLTComponent::FillBlockData( AliHLTComponentBlockData& blockData ) const |
232 | { | |
233 | // see header file for function documentation | |
2d7ff710 | 234 | blockData.fStructSize = sizeof(blockData); |
235 | FillShmData( blockData.fShmKey ); | |
236 | blockData.fOffset = ~(AliHLTUInt32_t)0; | |
237 | blockData.fPtr = NULL; | |
238 | blockData.fSize = 0; | |
239 | FillDataType( blockData.fDataType ); | |
240 | blockData.fSpecification = ~(AliHLTUInt32_t)0; | |
241 | } | |
242 | ||
70ed7d01 | 243 | void AliHLTComponent::FillShmData( AliHLTComponentShmData& shmData ) const |
244 | { | |
245 | // see header file for function documentation | |
2d7ff710 | 246 | shmData.fStructSize = sizeof(shmData); |
247 | shmData.fShmType = gkAliHLTComponentInvalidShmType; | |
248 | shmData.fShmID = gkAliHLTComponentInvalidShmID; | |
249 | } | |
250 | ||
70ed7d01 | 251 | void AliHLTComponent::FillDataType( AliHLTComponentDataType& dataType ) const |
252 | { | |
253 | // see header file for function documentation | |
ca8524df | 254 | dataType=kAliHLTAnyDataType; |
2d7ff710 | 255 | } |
256 | ||
70ed7d01 | 257 | void AliHLTComponent::CopyDataType(AliHLTComponentDataType& tgtdt, const AliHLTComponentDataType& srcdt) |
258 | { | |
259 | // see header file for function documentation | |
2d7ff710 | 260 | memcpy(&tgtdt.fID[0], &srcdt.fID[0], kAliHLTComponentDataTypefIDsize); |
261 | memcpy(&tgtdt.fOrigin[0], &srcdt.fOrigin[0], kAliHLTComponentDataTypefOriginSize); | |
262 | } | |
263 | ||
70ed7d01 | 264 | void AliHLTComponent::SetDataType(AliHLTComponentDataType& tgtdt, const char* id, const char* origin) |
265 | { | |
266 | // see header file for function documentation | |
2d7ff710 | 267 | tgtdt.fStructSize = sizeof(AliHLTComponentDataType); |
268 | memset(&tgtdt.fID[0], 0, kAliHLTComponentDataTypefIDsize); | |
269 | memset(&tgtdt.fOrigin[0], 0, kAliHLTComponentDataTypefOriginSize); | |
270 | ||
9ce4bf4a | 271 | if ((int)strlen(id)>kAliHLTComponentDataTypefIDsize) { |
2d7ff710 | 272 | HLTWarning("data type id %s is too long, truncated to %d", id, kAliHLTComponentDataTypefIDsize); |
273 | } | |
274 | strncpy(&tgtdt.fID[0], id, kAliHLTComponentDataTypefIDsize); | |
275 | ||
9ce4bf4a | 276 | if ((int)strlen(origin)>kAliHLTComponentDataTypefOriginSize) { |
2d7ff710 | 277 | HLTWarning("data type origin %s is too long, truncated to %d", origin, kAliHLTComponentDataTypefOriginSize); |
278 | } | |
279 | strncpy(&tgtdt.fOrigin[0], origin, kAliHLTComponentDataTypefOriginSize); | |
280 | } | |
9ce4bf4a | 281 | |
282 | void AliHLTComponent::FillEventData(AliHLTComponentEventData& evtData) | |
283 | { | |
70ed7d01 | 284 | // see header file for function documentation |
9ce4bf4a | 285 | memset(&evtData, 0, sizeof(AliHLTComponentEventData)); |
286 | evtData.fStructSize=sizeof(AliHLTComponentEventData); | |
287 | } | |
288 | ||
70ed7d01 | 289 | void AliHLTComponent::PrintComponentDataTypeInfo(const AliHLTComponentDataType& dt) |
290 | { | |
291 | // see header file for function documentation | |
9ce4bf4a | 292 | TString msg; |
293 | msg.Form("AliHLTComponentDataType(%d): ID=\"", dt.fStructSize); | |
294 | for ( int i = 0; i < kAliHLTComponentDataTypefIDsize; i++ ) { | |
295 | if (dt.fID[i]!=0) msg+=dt.fID[i]; | |
296 | else msg+="\\0"; | |
297 | } | |
298 | msg+="\" Origin=\""; | |
299 | for ( int i = 0; i < kAliHLTComponentDataTypefOriginSize; i++ ) { | |
300 | if (dt.fOrigin[i]!=0) msg+=dt.fOrigin[i]; | |
301 | else msg+="\\0"; | |
302 | } | |
303 | msg+="\""; | |
3cde846d | 304 | AliHLTLogging::Message(NULL, kHLTLogNone, NULL , NULL, msg.Data()); |
9ce4bf4a | 305 | } |
306 | ||
70ed7d01 | 307 | int AliHLTComponent::GetEventCount() const |
3cde846d | 308 | { |
70ed7d01 | 309 | // see header file for function documentation |
3cde846d | 310 | return fEventCount; |
311 | } | |
312 | ||
313 | int AliHLTComponent::IncrementEventCounter() | |
314 | { | |
70ed7d01 | 315 | // see header file for function documentation |
3cde846d | 316 | if (fEventCount>=0) fEventCount++; |
317 | return fEventCount; | |
318 | } | |
319 | ||
320 | int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData, | |
321 | const AliHLTComponentBlockData* blocks, | |
322 | AliHLTComponentTriggerData& trigData, | |
323 | AliHLTUInt8_t* outputPtr, | |
324 | AliHLTUInt32_t& size, | |
325 | AliHLTUInt32_t& outputBlockCnt, | |
326 | AliHLTComponentBlockData*& outputBlocks, | |
327 | AliHLTComponentEventDoneData*& edd ) | |
328 | { | |
70ed7d01 | 329 | // see header file for function documentation |
3cde846d | 330 | int iResult=0; |
331 | fCurrentEvent=evtData.fEventID; | |
332 | iResult=DoProcessing(evtData, blocks, trigData, outputPtr, size, outputBlockCnt, outputBlocks, edd); | |
333 | IncrementEventCounter(); | |
334 | return iResult; | |
335 | } |