]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTComponent.cxx
added float/double/signed HLT basic data types
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTComponent.cxx
CommitLineData
f23a6e1a 1// $Id$
2
3/**************************************************************************
9be2600f 4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
f23a6e1a 6 * *
9be2600f 7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * Timm Steinbeck <timm@kip.uni-heidelberg.de> *
9 * for The ALICE HLT Project. *
f23a6e1a 10 * *
11 * Permission to use, copy, modify and distribute this software and its *
12 * documentation strictly for non-commercial purposes is hereby granted *
13 * without fee, provided that the above copyright notice appears in all *
14 * copies and that both the copyright notice and this permission notice *
15 * appear in the supporting documentation. The authors make no claims *
16 * about the suitability of this software for any purpose. It is *
17 * provided "as is" without express or implied warranty. *
18 **************************************************************************/
19
bfccbf68 20/** @file AliHLTComponent.cxx
21 @author Matthias Richter, Timm Steinbeck
22 @date
23 @brief Base class implementation for HLT components. */
f23a6e1a 24
3a7c0444 25// see header file for class documentation
26// or
27// refer to README to build package
28// or
29// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
30
0c0c9d99 31#if __GNUC__>= 3
f23a6e1a 32using namespace std;
33#endif
34
66043029 35//#include "AliHLTStdIncludes.h"
f23a6e1a 36#include "AliHLTComponent.h"
37#include "AliHLTComponentHandler.h"
a655eae3 38#include "AliHLTMessage.h"
70ed7d01 39#include "TString.h"
a655eae3 40#include "TObjArray.h"
79c114b5 41#include "TObjectTable.h"
a655eae3 42#include "TClass.h"
90ebac25 43#include "TStopwatch.h"
79c114b5 44#include "AliHLTMemoryFile.h"
ec25e4ca 45#include <cassert>
f23a6e1a 46
b22e91eb 47/** ROOT macro for the implementation of ROOT specific class methods */
90ebac25 48ClassImp(AliHLTComponent);
49
50/** stopwatch macro using the stopwatch guard */
51#define ALIHLTCOMPONENT_STOPWATCH(type) AliHLTStopwatchGuard swguard(fpStopwatches!=NULL?reinterpret_cast<TStopwatch*>(fpStopwatches->At((int)type)):NULL)
52//#define ALIHLTCOMPONENT_STOPWATCH(type)
53
54/** stopwatch macro for operations of the base class */
55#define ALIHLTCOMPONENT_BASE_STOPWATCH() ALIHLTCOMPONENT_STOPWATCH(kSWBase)
56/** stopwatch macro for operations of the detector algorithm (DA) */
57#define ALIHLTCOMPONENT_DA_STOPWATCH() ALIHLTCOMPONENT_STOPWATCH(kSWDA)
f23a6e1a 58
f23a6e1a 59AliHLTComponent::AliHLTComponent()
85869391 60 :
53feaef5 61 fEnvironment(),
3cde846d 62 fCurrentEvent(0),
a655eae3 63 fEventCount(-1),
64 fFailedEvents(0),
65 fCurrentEventData(),
66 fpInputBlocks(NULL),
67 fCurrentInputBlock(-1),
68 fSearchDataType(kAliHLTVoidDataType),
69 fClassName(),
70 fpInputObjects(NULL),
71 fpOutputBuffer(NULL),
72 fOutputBufferSize(0),
73 fOutputBufferFilled(0),
90ebac25 74 fOutputBlocks(),
79c114b5 75 fpStopwatches(new TObjArray(kSWTypeCount)),
559631d5 76 fMemFiles(),
77 fpRunDesc(NULL),
78 fpDDLList(NULL)
79
70ed7d01 80{
81 // see header file for class documentation
82 // or
83 // refer to README to build package
84 // or
85 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
f23a6e1a 86 memset(&fEnvironment, 0, sizeof(AliHLTComponentEnvironment));
70ed7d01 87 if (fgpComponentHandler)
88 fgpComponentHandler->ScheduleRegister(this);
7c781d33 89 //SetLocalLoggingLevel(kHLTLogDefault);
70ed7d01 90}
91
f23a6e1a 92AliHLTComponent::~AliHLTComponent()
93{
70ed7d01 94 // see header file for function documentation
8451168b 95 CleanupInputObjects();
4498d7d1 96 if (fpStopwatches!=NULL) delete fpStopwatches;
97 fpStopwatches=NULL;
2be3f004 98 AliHLTMemoryFilePList::iterator element=fMemFiles.begin();
79c114b5 99 while (element!=fMemFiles.end()) {
100 if (*element) {
101 if ((*element)->IsClosed()==0) {
102 HLTWarning("memory file has not been closed, possible data loss or incomplete buffer");
103 // close but do not flush as we dont know whether the buffer is still valid
29312178 104 (*element)->CloseMemoryFile(0);
79c114b5 105 }
106 delete *element;
107 *element=NULL;
108 }
109 element++;
110 }
f23a6e1a 111}
112
70ed7d01 113AliHLTComponentHandler* AliHLTComponent::fgpComponentHandler=NULL;
b22e91eb 114
85869391 115int AliHLTComponent::SetGlobalComponentHandler(AliHLTComponentHandler* pCH, int bOverwrite)
116{
70ed7d01 117 // see header file for function documentation
85869391 118 int iResult=0;
70ed7d01 119 if (fgpComponentHandler==NULL || bOverwrite!=0)
120 fgpComponentHandler=pCH;
85869391 121 else
122 iResult=-EPERM;
123 return iResult;
124}
125
70ed7d01 126int AliHLTComponent::UnsetGlobalComponentHandler()
127{
128 // see header file for function documentation
85869391 129 return SetGlobalComponentHandler(NULL,1);
130}
131
70ed7d01 132int AliHLTComponent::Init( AliHLTComponentEnvironment* environ, void* environParam, int argc, const char** argv )
f23a6e1a 133{
70ed7d01 134 // see header file for function documentation
f23a6e1a 135 int iResult=0;
136 if (environ) {
137 memcpy(&fEnvironment, environ, sizeof(AliHLTComponentEnvironment));
70ed7d01 138 fEnvironment.fParam=environParam;
f23a6e1a 139 }
8451168b 140 const char** pArguments=NULL;
141 int iNofChildArgs=0;
142 TString argument="";
143 int bMissingParam=0;
144 if (argc>0) {
145 pArguments=new const char*[argc];
146 if (pArguments) {
147 for (int i=0; i<argc && iResult>=0; i++) {
148 argument=argv[i];
149 if (argument.IsNull()) continue;
150
151 // benchmark
152 if (argument.CompareTo("benchmark")==0) {
153
154 // loglevel
155 } else if (argument.CompareTo("loglevel")==0) {
156 if ((bMissingParam=(++i>=argc))) break;
157 TString parameter(argv[i]);
158 parameter.Remove(TString::kLeading, ' '); // remove all blanks
159 if (parameter.BeginsWith("0x") &&
160 parameter.Replace(0,2,"",0).IsHex()) {
161 AliHLTComponentLogSeverity loglevel=kHLTLogNone;
7a5ccd96 162 sscanf(parameter.Data(),"%x", (unsigned int*)&loglevel);
8451168b 163 SetLocalLoggingLevel(loglevel);
164 } else {
165 HLTError("wrong parameter for argument %s, hex number expected", argument.Data());
166 iResult=-EINVAL;
167 }
168 } else {
169 pArguments[iNofChildArgs++]=argv[i];
170 }
171 }
172 } else {
173 iResult=-ENOMEM;
174 }
175 }
176 if (bMissingParam) {
177 HLTError("missing parameter for argument %s", argument.Data());
178 iResult=-EINVAL;
179 }
180 if (iResult>=0) {
181 iResult=DoInit(iNofChildArgs, pArguments);
182 }
3cde846d 183 if (iResult>=0) fEventCount=0;
8451168b 184 if (pArguments) delete [] pArguments;
f23a6e1a 185 return iResult;
186}
187
188int AliHLTComponent::Deinit()
189{
70ed7d01 190 // see header file for function documentation
f23a6e1a 191 int iResult=0;
192 iResult=DoDeinit();
559631d5 193 if (fpRunDesc) {
194 HLTWarning("did not receive EOR for run %d", fpRunDesc->fRunNo);
195 AliHLTRunDesc* pRunDesc=fpRunDesc;
196 fpRunDesc=NULL;
197 delete pRunDesc;
198 }
f23a6e1a 199 return iResult;
200}
fa2e9b7c 201
53feaef5 202int AliHLTComponent::DoInit( int argc, const char** argv )
203{
70ed7d01 204 // see header file for function documentation
53feaef5 205 if (argc==0 && argv==NULL) {
206 // this is currently just to get rid of the warning "unused parameter"
207 }
66043029 208 fEventCount=0;
53feaef5 209 return 0;
210}
211
212int AliHLTComponent::DoDeinit()
213{
70ed7d01 214 // see header file for function documentation
66043029 215 fEventCount=0;
53feaef5 216 return 0;
217}
218
2be3f004 219int AliHLTComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& /*tgtList*/)
de6593d0 220{
3a7c0444 221 HLTLogKeyword("dummy");
de6593d0 222 return 0;
223}
224
70ed7d01 225void AliHLTComponent::DataType2Text( const AliHLTComponentDataType& type, char output[kAliHLTComponentDataTypefIDsize+kAliHLTComponentDataTypefOriginSize+2] ) const
226{
227 // see header file for function documentation
9ce4bf4a 228 memset( output, 0, kAliHLTComponentDataTypefIDsize+kAliHLTComponentDataTypefOriginSize+2 );
229 strncat( output, type.fOrigin, kAliHLTComponentDataTypefOriginSize );
230 strcat( output, ":" );
231 strncat( output, type.fID, kAliHLTComponentDataTypefIDsize );
fa2e9b7c 232}
233
fbdb63fd 234string AliHLTComponent::DataType2Text( const AliHLTComponentDataType& type, int mode)
9ce4bf4a 235{
70ed7d01 236 // see header file for function documentation
9ce4bf4a 237 string out("");
fbdb63fd 238
239 if (mode==2) {
240 int i=0;
241 char tmp[8];
242 for (i=0; i<kAliHLTComponentDataTypefOriginSize; i++) {
243 sprintf(tmp, "'%d", type.fOrigin[i]);
244 out+=tmp;
245 }
246 out+="':'";
247 for (i=0; i<kAliHLTComponentDataTypefIDsize; i++) {
248 sprintf(tmp, "%d'", type.fID[i]);
249 out+=tmp;
250 }
251 return out;
252 }
253
254 if (mode==1) {
255 int i=0;
256 char tmp[8];
257 for (i=0; i<kAliHLTComponentDataTypefOriginSize; i++) {
258 unsigned char* puc=(unsigned char*)type.fOrigin;
259 if ((puc[i])<32)
260 sprintf(tmp, "'\\%x", type.fOrigin[i]);
261 else
262 sprintf(tmp, "'%c", type.fOrigin[i]);
263 out+=tmp;
264 }
265 out+="':'";
266 for (i=0; i<kAliHLTComponentDataTypefIDsize; i++) {
267 unsigned char* puc=(unsigned char*)type.fID;
268 if (puc[i]<32)
269 sprintf(tmp, "\\%x'", type.fID[i]);
270 else
271 sprintf(tmp, "%c'", type.fID[i]);
272 out+=tmp;
273 }
274 return out;
275 }
276
9ce4bf4a 277 if (type==kAliHLTVoidDataType) {
278 out="VOID:VOID";
279 } else {
3cde846d 280 // some gymnastics in order to avoid a '0' which is part of either or both
281 // ID and origin terminating the whole string. Unfortunately, string doesn't
282 // stop appending at the '0' if the number of elements to append was
283 // explicitely specified
284 string tmp("");
285 tmp.append(type.fOrigin, kAliHLTComponentDataTypefOriginSize);
286 out.append(tmp.c_str());
9ce4bf4a 287 out.append(":");
3cde846d 288 tmp="";
289 tmp.append(type.fID, kAliHLTComponentDataTypefIDsize);
290 out.append(tmp.c_str());
9ce4bf4a 291 }
292 return out;
293}
294
295
70ed7d01 296void* AliHLTComponent::AllocMemory( unsigned long size )
297{
298 // see header file for function documentation
85869391 299 if (fEnvironment.fAllocMemoryFunc)
300 return (*fEnvironment.fAllocMemoryFunc)(fEnvironment.fParam, size );
9ce4bf4a 301 HLTFatal("no memory allocation handler registered");
85869391 302 return NULL;
303}
304
2be3f004 305int AliHLTComponent::MakeOutputDataBlockList( const AliHLTComponentBlockDataList& blocks, AliHLTUInt32_t* blockCount,
70ed7d01 306 AliHLTComponentBlockData** outputBlocks )
307{
308 // see header file for function documentation
9ce4bf4a 309 if ( blockCount==NULL || outputBlocks==NULL )
2d7ff710 310 return -EFAULT;
fa2e9b7c 311 AliHLTUInt32_t count = blocks.size();
312 if ( !count )
313 {
314 *blockCount = 0;
315 *outputBlocks = NULL;
316 return 0;
317 }
8ede8717 318 *outputBlocks = reinterpret_cast<AliHLTComponentBlockData*>( AllocMemory( sizeof(AliHLTComponentBlockData)*count ) );
fa2e9b7c 319 if ( !*outputBlocks )
2d7ff710 320 return -ENOMEM;
ca8524df 321 for ( unsigned long i = 0; i < count; i++ ) {
fa2e9b7c 322 (*outputBlocks)[i] = blocks[i];
ca8524df 323 if (blocks[i].fDataType==kAliHLTAnyDataType) {
5f5b708b 324 (*outputBlocks)[i].fDataType=GetOutputDataType();
325 /* data type was set to the output data type by the PubSub AliRoot
326 Wrapper component, if data type of the block was ********:****.
327 Now handled by the component base class in order to have same
328 behavior when running embedded in AliRoot
ca8524df 329 memset((*outputBlocks)[i].fDataType.fID, '*', kAliHLTComponentDataTypefIDsize);
330 memset((*outputBlocks)[i].fDataType.fOrigin, '*', kAliHLTComponentDataTypefOriginSize);
5f5b708b 331 */
ca8524df 332 }
333 }
fa2e9b7c 334 *blockCount = count;
335 return 0;
336
337}
0c0c9d99 338
70ed7d01 339int AliHLTComponent::GetEventDoneData( unsigned long size, AliHLTComponentEventDoneData** edd )
340{
341 // see header file for function documentation
85869391 342 if (fEnvironment.fGetEventDoneDataFunc)
343 return (*fEnvironment.fGetEventDoneDataFunc)(fEnvironment.fParam, fCurrentEvent, size, edd );
344 return -ENOSYS;
345}
346
2be3f004 347int AliHLTComponent::FindMatchingDataTypes(AliHLTComponent* pConsumer, AliHLTComponentDataTypeList* tgtList)
0c0c9d99 348{
70ed7d01 349 // see header file for function documentation
0c0c9d99 350 int iResult=0;
351 if (pConsumer) {
8a106878 352 AliHLTComponentDataTypeList itypes;
353 AliHLTComponentDataTypeList otypes;
354 otypes.push_back(GetOutputDataType());
355 if (otypes[0]==kAliHLTMultipleDataType) {
356 otypes.clear();
357 int count=0;
358 if ((count=GetOutputDataTypes(otypes))>0) {
359 } else if (GetComponentType()!=kSink) {
360 HLTWarning("component %s indicates multiple output data types but GetOutputDataTypes returns %d", GetComponentID(), count);
361 }
362 }
363 ((AliHLTComponent*)pConsumer)->GetInputDataTypes(itypes);
364 AliHLTComponentDataTypeList::iterator itype=itypes.begin();
365 while (itype!=itypes.end()) {
366 //PrintDataTypeContent((*itype), "consumer \'%s\'");
367 AliHLTComponentDataTypeList::iterator otype=otypes.begin();
368 while (otype!=otypes.end() && (*itype)!=(*otype)) otype++;
369 //if (otype!=otypes.end()) PrintDataTypeContent(*otype, "publisher \'%s\'");
370 if (otype!=otypes.end() ||
371 (*itype)==kAliHLTAnyDataType) {
372 if (tgtList) tgtList->push_back(*itype);
0c0c9d99 373 iResult++;
0c0c9d99 374 }
8a106878 375 itype++;
0c0c9d99 376 }
377 } else {
378 iResult=-EINVAL;
379 }
380 return iResult;
381}
2d7ff710 382
5f5b708b 383void AliHLTComponent::PrintDataTypeContent(AliHLTComponentDataType& dt, const char* format) const
384{
66043029 385 // see header file for function documentation
5f5b708b 386 const char* fmt="publisher \'%s\'";
387 if (format) fmt=format;
388 HLTMessage(fmt, (DataType2Text(dt)).c_str());
389 HLTMessage("%x %x %x %x %x %x %x %x : %x %x %x %x",
390 dt.fID[0],
391 dt.fID[1],
392 dt.fID[2],
393 dt.fID[3],
394 dt.fID[4],
395 dt.fID[5],
396 dt.fID[6],
397 dt.fID[7],
398 dt.fOrigin[0],
399 dt.fOrigin[1],
400 dt.fOrigin[2],
401 dt.fOrigin[3]);
402}
403
fbdb63fd 404void AliHLTComponent::FillBlockData( AliHLTComponentBlockData& blockData )
70ed7d01 405{
406 // see header file for function documentation
2d7ff710 407 blockData.fStructSize = sizeof(blockData);
408 FillShmData( blockData.fShmKey );
409 blockData.fOffset = ~(AliHLTUInt32_t)0;
410 blockData.fPtr = NULL;
411 blockData.fSize = 0;
412 FillDataType( blockData.fDataType );
a655eae3 413 blockData.fSpecification = kAliHLTVoidDataSpec;
2d7ff710 414}
415
fbdb63fd 416void AliHLTComponent::FillShmData( AliHLTComponentShmData& shmData )
70ed7d01 417{
418 // see header file for function documentation
2d7ff710 419 shmData.fStructSize = sizeof(shmData);
420 shmData.fShmType = gkAliHLTComponentInvalidShmType;
421 shmData.fShmID = gkAliHLTComponentInvalidShmID;
422}
423
fbdb63fd 424void AliHLTComponent::FillDataType( AliHLTComponentDataType& dataType )
70ed7d01 425{
426 // see header file for function documentation
ca8524df 427 dataType=kAliHLTAnyDataType;
2d7ff710 428}
429
70ed7d01 430void AliHLTComponent::CopyDataType(AliHLTComponentDataType& tgtdt, const AliHLTComponentDataType& srcdt)
431{
432 // see header file for function documentation
2d7ff710 433 memcpy(&tgtdt.fID[0], &srcdt.fID[0], kAliHLTComponentDataTypefIDsize);
434 memcpy(&tgtdt.fOrigin[0], &srcdt.fOrigin[0], kAliHLTComponentDataTypefOriginSize);
435}
436
70ed7d01 437void AliHLTComponent::SetDataType(AliHLTComponentDataType& tgtdt, const char* id, const char* origin)
438{
439 // see header file for function documentation
fbdb63fd 440 tgtdt=kAliHLTVoidDataType;
2d7ff710 441 strncpy(&tgtdt.fID[0], id, kAliHLTComponentDataTypefIDsize);
2d7ff710 442 strncpy(&tgtdt.fOrigin[0], origin, kAliHLTComponentDataTypefOriginSize);
443}
9ce4bf4a 444
445void AliHLTComponent::FillEventData(AliHLTComponentEventData& evtData)
446{
70ed7d01 447 // see header file for function documentation
9ce4bf4a 448 memset(&evtData, 0, sizeof(AliHLTComponentEventData));
449 evtData.fStructSize=sizeof(AliHLTComponentEventData);
450}
451
70ed7d01 452void AliHLTComponent::PrintComponentDataTypeInfo(const AliHLTComponentDataType& dt)
453{
454 // see header file for function documentation
9ce4bf4a 455 TString msg;
456 msg.Form("AliHLTComponentDataType(%d): ID=\"", dt.fStructSize);
457 for ( int i = 0; i < kAliHLTComponentDataTypefIDsize; i++ ) {
458 if (dt.fID[i]!=0) msg+=dt.fID[i];
459 else msg+="\\0";
460 }
461 msg+="\" Origin=\"";
462 for ( int i = 0; i < kAliHLTComponentDataTypefOriginSize; i++ ) {
463 if (dt.fOrigin[i]!=0) msg+=dt.fOrigin[i];
464 else msg+="\\0";
465 }
466 msg+="\"";
3cde846d 467 AliHLTLogging::Message(NULL, kHLTLogNone, NULL , NULL, msg.Data());
9ce4bf4a 468}
469
70ed7d01 470int AliHLTComponent::GetEventCount() const
3cde846d 471{
70ed7d01 472 // see header file for function documentation
3cde846d 473 return fEventCount;
474}
475
476int AliHLTComponent::IncrementEventCounter()
477{
70ed7d01 478 // see header file for function documentation
3cde846d 479 if (fEventCount>=0) fEventCount++;
480 return fEventCount;
481}
482
66043029 483int AliHLTComponent::GetNumberOfInputBlocks() const
a655eae3 484{
485 // see header file for function documentation
486 if (fpInputBlocks!=NULL) {
487 return fCurrentEventData.fBlockCnt;
488 }
489 return 0;
490}
491
492const TObject* AliHLTComponent::GetFirstInputObject(const AliHLTComponentDataType& dt,
493 const char* classname,
494 int bForce)
495{
496 // see header file for function documentation
90ebac25 497 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 498 fSearchDataType=dt;
499 if (classname) fClassName=classname;
500 else fClassName.clear();
1edbbe49 501 int idx=FindInputBlock(fSearchDataType, 0, 1);
a655eae3 502 TObject* pObj=NULL;
503 if (idx>=0) {
79c114b5 504 HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(dt).c_str());
a655eae3 505 if ((pObj=GetInputObject(idx, fClassName.c_str(), bForce))!=NULL) {
506 fCurrentInputBlock=idx;
507 } else {
508 }
509 }
510 return pObj;
511}
512
513const TObject* AliHLTComponent::GetFirstInputObject(const char* dtID,
514 const char* dtOrigin,
515 const char* classname,
516 int bForce)
517{
518 // see header file for function documentation
90ebac25 519 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 520 AliHLTComponentDataType dt;
521 SetDataType(dt, dtID, dtOrigin);
522 return GetFirstInputObject(dt, classname, bForce);
523}
524
525const TObject* AliHLTComponent::GetNextInputObject(int bForce)
526{
527 // see header file for function documentation
90ebac25 528 ALIHLTCOMPONENT_BASE_STOPWATCH();
1edbbe49 529 int idx=FindInputBlock(fSearchDataType, fCurrentInputBlock+1, 1);
a655eae3 530 //HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(fSearchDataType).c_str());
531 TObject* pObj=NULL;
532 if (idx>=0) {
533 if ((pObj=GetInputObject(idx, fClassName.c_str(), bForce))!=NULL) {
534 fCurrentInputBlock=idx;
535 }
536 }
537 return pObj;
538}
539
1edbbe49 540int AliHLTComponent::FindInputBlock(const AliHLTComponentDataType& dt, int startIdx, int bObject) const
a655eae3 541{
542 // see header file for function documentation
543 int iResult=-ENOENT;
544 if (fpInputBlocks!=NULL) {
545 int idx=startIdx<0?0:startIdx;
4b98eadb 546 for ( ; (UInt_t)idx<fCurrentEventData.fBlockCnt && iResult==-ENOENT; idx++) {
1edbbe49 547 if (bObject!=0) {
548 if (fpInputBlocks[idx].fPtr==NULL) continue;
3294f81a 549 AliHLTUInt32_t firstWord=*((AliHLTUInt32_t*)fpInputBlocks[idx].fPtr);
550 if (firstWord!=fpInputBlocks[idx].fSize-sizeof(AliHLTUInt32_t)) continue;
1edbbe49 551 }
a655eae3 552 if (dt == kAliHLTAnyDataType || fpInputBlocks[idx].fDataType == dt) {
553 iResult=idx;
554 }
555 }
556 }
557 return iResult;
558}
559
560TObject* AliHLTComponent::CreateInputObject(int idx, int bForce)
561{
562 // see header file for function documentation
563 TObject* pObj=NULL;
564 if (fpInputBlocks!=NULL) {
4b98eadb 565 if ((UInt_t)idx<fCurrentEventData.fBlockCnt) {
a655eae3 566 if (fpInputBlocks[idx].fPtr) {
3294f81a 567 AliHLTUInt32_t firstWord=*((AliHLTUInt32_t*)fpInputBlocks[idx].fPtr);
a655eae3 568 if (firstWord==fpInputBlocks[idx].fSize-sizeof(AliHLTUInt32_t)) {
8451168b 569 HLTDebug("create object from block %d size %d", idx, fpInputBlocks[idx].fSize);
3294f81a 570 AliHLTMessage msg(fpInputBlocks[idx].fPtr, fpInputBlocks[idx].fSize);
66043029 571 TClass* objclass=msg.GetClass();
572 pObj=msg.ReadObject(objclass);
573 if (pObj && objclass) {
574 HLTDebug("object %p type %s created", pObj, objclass->GetName());
a655eae3 575 } else {
576 }
1edbbe49 577 //} else {
578 } else if (bForce!=0) {
a655eae3 579 HLTError("size missmatch: block size %d, indicated %d", fpInputBlocks[idx].fSize, firstWord+sizeof(AliHLTUInt32_t));
580 }
581 } else {
582 HLTFatal("block descriptor empty");
583 }
584 } else {
585 HLTError("index %d out of range %d", idx, fCurrentEventData.fBlockCnt);
586 }
587 } else {
588 HLTError("no input blocks available");
589 }
590
591 return pObj;
592}
593
298ef463 594TObject* AliHLTComponent::GetInputObject(int idx, const char* /*classname*/, int bForce)
a655eae3 595{
596 // see header file for function documentation
597 if (fpInputObjects==NULL) {
598 fpInputObjects=new TObjArray(fCurrentEventData.fBlockCnt);
599 }
600 TObject* pObj=NULL;
601 if (fpInputObjects) {
602 pObj=fpInputObjects->At(idx);
603 if (pObj==NULL) {
604 pObj=CreateInputObject(idx, bForce);
605 if (pObj) {
606 fpInputObjects->AddAt(pObj, idx);
607 }
608 }
609 } else {
610 HLTFatal("memory allocation failed: TObjArray of size %d", fCurrentEventData.fBlockCnt);
611 }
612 return pObj;
613}
614
8451168b 615int AliHLTComponent::CleanupInputObjects()
616{
66043029 617 // see header file for function documentation
8451168b 618 if (!fpInputObjects) return 0;
619 TObjArray* array=fpInputObjects;
620 fpInputObjects=NULL;
621 for (int i=0; i<array->GetEntries(); i++) {
622 TObject* pObj=array->At(i);
79c114b5 623 // grrr, garbage collection strikes back: When read via AliHLTMessage
624 // (CreateInputObject), and written to a TFile afterwards, the
625 // TFile::Close calls ROOOT's garbage collection. No clue why the
626 // object ended up in the key list and needs to be deleted
627 if (pObj && gObjectTable->PtrIsValid(pObj)) delete pObj;
8451168b 628 }
629 delete array;
90ebac25 630 return 0;
8451168b 631}
632
a655eae3 633AliHLTComponentDataType AliHLTComponent::GetDataType(const TObject* pObject)
634{
635 // see header file for function documentation
90ebac25 636 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 637 AliHLTComponentDataType dt=kAliHLTVoidDataType;
638 int idx=fCurrentInputBlock;
639 if (pObject) {
640 if (fpInputObjects==NULL || (idx=fpInputObjects->IndexOf(pObject))>=0) {
641 } else {
642 HLTError("unknown object %p", pObject);
643 }
644 }
645 if (idx>=0) {
4b98eadb 646 if ((UInt_t)idx<fCurrentEventData.fBlockCnt) {
a655eae3 647 dt=fpInputBlocks[idx].fDataType;
648 } else {
649 HLTFatal("severe internal error, index out of range");
650 }
651 }
652 return dt;
653}
654
655AliHLTUInt32_t AliHLTComponent::GetSpecification(const TObject* pObject)
656{
657 // see header file for function documentation
90ebac25 658 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 659 AliHLTUInt32_t iSpec=kAliHLTVoidDataSpec;
660 int idx=fCurrentInputBlock;
661 if (pObject) {
662 if (fpInputObjects==NULL || (idx=fpInputObjects->IndexOf(pObject))>=0) {
663 } else {
664 HLTError("unknown object %p", pObject);
665 }
666 }
667 if (idx>=0) {
4b98eadb 668 if ((UInt_t)idx<fCurrentEventData.fBlockCnt) {
a655eae3 669 iSpec=fpInputBlocks[idx].fSpecification;
670 } else {
671 HLTFatal("severe internal error, index out of range");
672 }
673 }
674 return iSpec;
675}
676
677const AliHLTComponentBlockData* AliHLTComponent::GetFirstInputBlock(const AliHLTComponentDataType& dt)
678{
679 // see header file for function documentation
90ebac25 680 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 681 fSearchDataType=dt;
682 fClassName.clear();
683 int idx=FindInputBlock(fSearchDataType, 0);
684 const AliHLTComponentBlockData* pBlock=NULL;
685 if (idx>=0) {
686 // check for fpInputBlocks pointer done in FindInputBlock
687 pBlock=&fpInputBlocks[idx];
1edbbe49 688 fCurrentInputBlock=idx;
a655eae3 689 }
690 return pBlock;
691}
692
693const AliHLTComponentBlockData* AliHLTComponent::GetFirstInputBlock(const char* dtID,
694 const char* dtOrigin)
695{
696 // see header file for function documentation
90ebac25 697 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 698 AliHLTComponentDataType dt;
699 SetDataType(dt, dtID, dtOrigin);
700 return GetFirstInputBlock(dt);
701}
702
ec25e4ca 703const AliHLTComponentBlockData* AliHLTComponent::GetInputBlock(int index)
704{
705 // see header file for function documentation
706 ALIHLTCOMPONENT_BASE_STOPWATCH();
707 assert( 0 <= index and index < fCurrentEventData.fBlockCnt );
708 return &fpInputBlocks[index];
709}
710
a655eae3 711const AliHLTComponentBlockData* AliHLTComponent::GetNextInputBlock()
712{
713 // see header file for function documentation
90ebac25 714 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 715 int idx=FindInputBlock(fSearchDataType, fCurrentInputBlock+1);
716 const AliHLTComponentBlockData* pBlock=NULL;
717 if (idx>=0) {
718 // check for fpInputBlocks pointer done in FindInputBlock
719 pBlock=&fpInputBlocks[idx];
1edbbe49 720 fCurrentInputBlock=idx;
a655eae3 721 }
722 return pBlock;
723}
724
66043029 725int AliHLTComponent::FindInputBlock(const AliHLTComponentBlockData* pBlock) const
a655eae3 726{
727 // see header file for function documentation
728 int iResult=-ENOENT;
729 if (fpInputBlocks!=NULL) {
730 if (pBlock) {
731 if (pBlock>=fpInputBlocks && pBlock<fpInputBlocks+fCurrentEventData.fBlockCnt) {
132ca004 732 iResult=(int)(pBlock-fpInputBlocks);
a655eae3 733 }
734 } else {
735 iResult=-EINVAL;
736 }
737 }
738 return iResult;
739}
740
741AliHLTUInt32_t AliHLTComponent::GetSpecification(const AliHLTComponentBlockData* pBlock)
742{
743 // see header file for function documentation
90ebac25 744 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 745 AliHLTUInt32_t iSpec=kAliHLTVoidDataSpec;
746 int idx=fCurrentInputBlock;
747 if (pBlock) {
748 if (fpInputObjects==NULL || (idx=FindInputBlock(pBlock))>=0) {
749 } else {
750 HLTError("unknown Block %p", pBlock);
751 }
752 }
753 if (idx>=0) {
754 // check for fpInputBlocks pointer done in FindInputBlock
755 iSpec=fpInputBlocks[idx].fSpecification;
756 }
757 return iSpec;
758}
759
79c114b5 760int AliHLTComponent::PushBack(TObject* pObject, const AliHLTComponentDataType& dt, AliHLTUInt32_t spec,
761 void* pHeader, int headerSize)
a655eae3 762{
763 // see header file for function documentation
90ebac25 764 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 765 int iResult=0;
766 if (pObject) {
767 AliHLTMessage msg(kMESS_OBJECT);
768 msg.WriteObject(pObject);
769 Int_t iMsgLength=msg.Length();
770 if (iMsgLength>0) {
771 msg.SetLength(); // sets the length to the first (reserved) word
79c114b5 772 iResult=InsertOutputBlock(msg.Buffer(), iMsgLength, dt, spec, pHeader, headerSize);
a655eae3 773 if (iResult>=0) {
8451168b 774 HLTDebug("object %s (%p) size %d inserted to output", pObject->ClassName(), pObject, iMsgLength);
a655eae3 775 }
776 } else {
777 HLTError("object serialization failed for object %p", pObject);
778 iResult=-ENOMSG;
779 }
780 } else {
781 iResult=-EINVAL;
782 }
783 return iResult;
784}
785
79c114b5 786int AliHLTComponent::PushBack(TObject* pObject, const char* dtID, const char* dtOrigin, AliHLTUInt32_t spec,
787 void* pHeader, int headerSize)
a655eae3 788{
789 // see header file for function documentation
90ebac25 790 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 791 AliHLTComponentDataType dt;
792 SetDataType(dt, dtID, dtOrigin);
79c114b5 793 return PushBack(pObject, dt, spec, pHeader, headerSize);
a655eae3 794}
795
9d9ffd37 796int AliHLTComponent::PushBack(void* pBuffer, int iSize, const AliHLTComponentDataType& dt, AliHLTUInt32_t spec,
797 void* pHeader, int headerSize)
a655eae3 798{
799 // see header file for function documentation
90ebac25 800 ALIHLTCOMPONENT_BASE_STOPWATCH();
9d9ffd37 801 return InsertOutputBlock(pBuffer, iSize, dt, spec, pHeader, headerSize);
a655eae3 802}
803
9d9ffd37 804int AliHLTComponent::PushBack(void* pBuffer, int iSize, const char* dtID, const char* dtOrigin, AliHLTUInt32_t spec,
805 void* pHeader, int headerSize)
a655eae3 806{
807 // see header file for function documentation
90ebac25 808 ALIHLTCOMPONENT_BASE_STOPWATCH();
a655eae3 809 AliHLTComponentDataType dt;
810 SetDataType(dt, dtID, dtOrigin);
9d9ffd37 811 return PushBack(pBuffer, iSize, dt, spec, pHeader, headerSize);
a655eae3 812}
813
79c114b5 814int AliHLTComponent::InsertOutputBlock(void* pBuffer, int iBufferSize, const AliHLTComponentDataType& dt, AliHLTUInt32_t spec,
815 void* pHeader, int iHeaderSize)
a655eae3 816{
817 // see header file for function documentation
818 int iResult=0;
79c114b5 819 int iBlkSize = iBufferSize + iHeaderSize;
a655eae3 820 if (pBuffer) {
79c114b5 821 if (fpOutputBuffer && iBlkSize<=(int)(fOutputBufferSize-fOutputBufferFilled)) {
a655eae3 822 AliHLTUInt8_t* pTgt=fpOutputBuffer+fOutputBufferFilled;
823 AliHLTComponentBlockData bd;
824 FillBlockData( bd );
825 bd.fOffset = fOutputBufferFilled;
79c114b5 826 bd.fSize = iBlkSize;
a655eae3 827 bd.fDataType = dt;
828 bd.fSpecification = spec;
79c114b5 829 if (pHeader!=NULL && pHeader!=pTgt) {
830 memcpy(pTgt, pHeader, iHeaderSize);
831 }
832
833 pTgt += (AliHLTUInt8_t) iHeaderSize;
834
a655eae3 835 if (pBuffer!=NULL && pBuffer!=pTgt) {
79c114b5 836 memcpy(pTgt, pBuffer, iBufferSize);
837
4b98eadb 838 //AliHLTUInt32_t firstWord=*((AliHLTUInt32_t*)pBuffer);
79c114b5 839 //HLTDebug("copy %d bytes from %p to output buffer %p, first word %#x", iBufferSize, pBuffer, pTgt, firstWord);
a655eae3 840 }
841 fOutputBufferFilled+=bd.fSize;
842 fOutputBlocks.push_back( bd );
79c114b5 843 //HLTDebug("buffer inserted to output: size %d data type %s spec %#x", iBlkSize, DataType2Text(dt).c_str(), spec);
a655eae3 844 } else {
845 if (fpOutputBuffer) {
79c114b5 846 HLTError("too little space in output buffer: %d, required %d", fOutputBufferSize-fOutputBufferFilled, iBlkSize);
a655eae3 847 } else {
848 HLTError("output buffer not available");
849 }
850 iResult=-ENOSPC;
851 }
852 } else {
853 iResult=-EINVAL;
854 }
855 return iResult;
856}
857
8451168b 858int AliHLTComponent::EstimateObjectSize(TObject* pObject) const
859{
66043029 860 // see header file for function documentation
8451168b 861 if (!pObject) return -EINVAL;
862 AliHLTMessage msg(kMESS_OBJECT);
863 msg.WriteObject(pObject);
864 return msg.Length();
865}
866
79c114b5 867AliHLTMemoryFile* AliHLTComponent::CreateMemoryFile(int capacity, const char* dtID,
868 const char* dtOrigin,
869 AliHLTUInt32_t spec)
870{
871 // see header file for function documentation
872 ALIHLTCOMPONENT_BASE_STOPWATCH();
873 AliHLTComponentDataType dt;
874 SetDataType(dt, dtID, dtOrigin);
875 return CreateMemoryFile(capacity, dt, spec);
876}
877
878AliHLTMemoryFile* AliHLTComponent::CreateMemoryFile(int capacity,
879 const AliHLTComponentDataType& dt,
880 AliHLTUInt32_t spec)
881{
882 // see header file for function documentation
883 ALIHLTCOMPONENT_BASE_STOPWATCH();
884 AliHLTMemoryFile* pFile=NULL;
83fec083 885 if (capacity>=0 && static_cast<unsigned int>(capacity)<=fOutputBufferSize-fOutputBufferFilled){
79c114b5 886 AliHLTUInt8_t* pTgt=fpOutputBuffer+fOutputBufferFilled;
887 pFile=new AliHLTMemoryFile((char*)pTgt, capacity);
888 if (pFile) {
83fec083 889 unsigned int nofBlocks=fOutputBlocks.size();
79c114b5 890 if (nofBlocks+1>fMemFiles.size()) {
891 fMemFiles.resize(nofBlocks+1, NULL);
892 }
893 if (nofBlocks<fMemFiles.size()) {
894 fMemFiles[nofBlocks]=pFile;
895 AliHLTComponentBlockData bd;
896 FillBlockData( bd );
897 bd.fOffset = fOutputBufferFilled;
79c114b5 898 bd.fSize = capacity;
899 bd.fDataType = dt;
900 bd.fSpecification = spec;
901 fOutputBufferFilled+=bd.fSize;
902 fOutputBlocks.push_back( bd );
903 } else {
904 HLTError("can not allocate/grow object array");
29312178 905 pFile->CloseMemoryFile(0);
79c114b5 906 delete pFile;
907 pFile=NULL;
908 }
909 }
910 } else {
911 HLTError("can not create memory file of size %d (%d available)", capacity, fOutputBufferSize-fOutputBufferFilled);
912 }
913 return pFile;
914}
915
916AliHLTMemoryFile* AliHLTComponent::CreateMemoryFile(const char* dtID,
917 const char* dtOrigin,
918 AliHLTUInt32_t spec,
919 float capacity)
920{
921 // see header file for function documentation
922 ALIHLTCOMPONENT_BASE_STOPWATCH();
923 AliHLTComponentDataType dt;
924 SetDataType(dt, dtID, dtOrigin);
925 int size=fOutputBufferSize-fOutputBufferFilled;
926 if (capacity<0 || capacity>1.0) {
927 HLTError("invalid parameter: capacity %f", capacity);
928 return NULL;
929 }
930 size=(int)(size*capacity);
931 return CreateMemoryFile(size, dt, spec);
932}
933
934AliHLTMemoryFile* AliHLTComponent::CreateMemoryFile(const AliHLTComponentDataType& dt,
935 AliHLTUInt32_t spec,
936 float capacity)
937{
938 // see header file for function documentation
939 ALIHLTCOMPONENT_BASE_STOPWATCH();
940 int size=fOutputBufferSize-fOutputBufferFilled;
941 if (capacity<0 || capacity>1.0) {
942 HLTError("invalid parameter: capacity %f", capacity);
943 return NULL;
944 }
945 size=(int)(size*capacity);
946 return CreateMemoryFile(size, dt, spec);
947}
948
949int AliHLTComponent::Write(AliHLTMemoryFile* pFile, const TObject* pObject,
950 const char* key, int option)
951{
3a7c0444 952 // see header file for function documentation
79c114b5 953 int iResult=0;
954 if (pFile && pObject) {
955 pFile->cd();
956 iResult=pObject->Write(key, option);
957 if (iResult>0) {
958 // success
959 } else {
960 iResult=-pFile->GetErrno();
961 if (iResult==-ENOSPC) {
962 HLTError("error writing memory file, buffer too small");
963 }
964 }
965 } else {
966 iResult=-EINVAL;
967 }
968 return iResult;
969}
970
971int AliHLTComponent::CloseMemoryFile(AliHLTMemoryFile* pFile)
972{
3a7c0444 973 // see header file for function documentation
79c114b5 974 int iResult=0;
975 if (pFile) {
2be3f004 976 AliHLTMemoryFilePList::iterator element=fMemFiles.begin();
79c114b5 977 int i=0;
978 while (element!=fMemFiles.end() && iResult>=0) {
979 if (*element && *element==pFile) {
29312178 980 iResult=pFile->CloseMemoryFile();
79c114b5 981
982 // sync memory files and descriptors
983 if (iResult>=0) {
984 fOutputBlocks[i].fSize=(*element)->GetSize()+(*element)->GetHeaderSize();
985 }
986 delete *element;
987 *element=NULL;
988 return iResult;
989 }
990 element++; i++;
991 }
992 HLTError("can not find memory file %p", pFile);
993 iResult=-ENOENT;
994 } else {
995 iResult=-EINVAL;
996 }
997 return iResult;
998}
999
29312178 1000int AliHLTComponent::CreateEventDoneData(AliHLTComponentEventDoneData /*edd*/)
a655eae3 1001{
1002 // see header file for function documentation
1003 int iResult=-ENOSYS;
1004 //#warning function not yet implemented
1005 HLTWarning("function not yet implemented");
1006 return iResult;
1007}
1008
3cde846d 1009int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData,
1010 const AliHLTComponentBlockData* blocks,
1011 AliHLTComponentTriggerData& trigData,
1012 AliHLTUInt8_t* outputPtr,
1013 AliHLTUInt32_t& size,
1014 AliHLTUInt32_t& outputBlockCnt,
1015 AliHLTComponentBlockData*& outputBlocks,
1016 AliHLTComponentEventDoneData*& edd )
1017{
70ed7d01 1018 // see header file for function documentation
90ebac25 1019 ALIHLTCOMPONENT_BASE_STOPWATCH();
3cde846d 1020 int iResult=0;
1021 fCurrentEvent=evtData.fEventID;
a655eae3 1022 fCurrentEventData=evtData;
1023 fpInputBlocks=blocks;
1024 fCurrentInputBlock=-1;
1025 fSearchDataType=kAliHLTAnyDataType;
1026 fpOutputBuffer=outputPtr;
1027 fOutputBufferSize=size;
1028 fOutputBufferFilled=0;
1029 fOutputBlocks.clear();
559631d5 1030
1031 // find special events
1032 if (fpInputBlocks) {
83fec083 1033 for (unsigned int i=0; i<evtData.fBlockCnt && iResult>=0; i++) {
559631d5 1034 if (fpInputBlocks[i].fDataType==kAliHLTDataTypeSOR) {
1035 // start of run
1036 if (fpRunDesc==NULL) {
1037 fpRunDesc=new AliHLTRunDesc;
1038 if (fpRunDesc) {
1039 if ((iResult=CopyStruct(fpRunDesc, sizeof(AliHLTRunDesc), i, "AliHLTRunDesc", "SOR"))>0) {
1040 HLTDebug("set run decriptor, run no %d", fpRunDesc->fRunNo);
1041 }
1042 } else {
1043 iResult=-ENOMEM;
1044 }
1045 } else {
1046 HLTWarning("already received SOR event run no %d, ignoring SOR", fpRunDesc->fRunNo);
1047 }
1048 } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeEOR) {
1049 if (fpRunDesc!=NULL) {
1050 if (fpRunDesc) {
1051 AliHLTRunDesc rundesc;
1052 if ((iResult=CopyStruct(&rundesc, sizeof(AliHLTRunDesc), i, "AliHLTRunDesc", "SOR"))>0) {
1053 if (fpRunDesc->fRunNo!=rundesc.fRunNo) {
1054 HLTWarning("run no missmatch: SOR %d, EOR %d", fpRunDesc->fRunNo, rundesc.fRunNo);
1055 } else {
1056 HLTDebug("EOR run no %d", fpRunDesc->fRunNo);
1057 }
1058 }
1059 AliHLTRunDesc* pRunDesc=fpRunDesc;
1060 fpRunDesc=NULL;
1061 delete pRunDesc;
1062 }
1063 } else {
1064 HLTWarning("did not receive SOR, ignoring EOR");
1065 }
1066 // end of run
1067 } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeDDL) {
1068 // DDL list
1069 }
1070 }
1071 }
a655eae3 1072
2be3f004 1073 AliHLTComponentBlockDataList blockData;
90ebac25 1074 { // dont delete, sets the scope for the stopwatch guard
1075 ALIHLTCOMPONENT_DA_STOPWATCH();
1076 iResult=DoProcessing(evtData, blocks, trigData, outputPtr, size, blockData, edd);
1077 } // end of the scope of the stopwatch guard
a655eae3 1078 if (iResult>=0) {
1079 if (fOutputBlocks.size()>0) {
1080 //HLTDebug("got %d block(s) via high level interface", fOutputBlocks.size());
79c114b5 1081
1082 // sync memory files and descriptors
2be3f004 1083 AliHLTMemoryFilePList::iterator element=fMemFiles.begin();
79c114b5 1084 int i=0;
1085 while (element!=fMemFiles.end() && iResult>=0) {
1086 if (*element) {
1087 if ((*element)->IsClosed()==0) {
1088 HLTWarning("memory file has not been closed, force flush");
1089 iResult=CloseMemoryFile(*element);
1090 }
1091 }
1092 element++; i++;
1093 }
1094
1095 if (iResult>=0) {
1096 // create the descriptor list
1097 if (blockData.size()>0) {
1098 HLTError("low level and high interface must not be mixed; use PushBack methods to insert data blocks");
1099 iResult=-EFAULT;
1100 } else {
1101 iResult=MakeOutputDataBlockList(fOutputBlocks, &outputBlockCnt, &outputBlocks);
1102 size=fOutputBufferFilled;
1103 }
a655eae3 1104 }
1105 } else {
1106 iResult=MakeOutputDataBlockList(blockData, &outputBlockCnt, &outputBlocks);
1107 }
1108 if (iResult<0) {
1109 HLTFatal("component %s (%p): can not convert output block descriptor list", GetComponentID(), this);
1110 }
1111 }
1112 if (iResult<0) {
1113 outputBlockCnt=0;
1114 outputBlocks=NULL;
1115 }
8451168b 1116 CleanupInputObjects();
f8bc6d99 1117 if (iResult>=0) {
1118 IncrementEventCounter();
1119 }
3cde846d 1120 return iResult;
1121}
a655eae3 1122
90ebac25 1123AliHLTComponent::AliHLTStopwatchGuard::AliHLTStopwatchGuard()
1124 :
1125 fpStopwatch(NULL),
1126 fpPrec(NULL)
1127{
1128 // standard constructor (not for use)
1129}
1130
1131AliHLTComponent::AliHLTStopwatchGuard::AliHLTStopwatchGuard(TStopwatch* pStopwatch)
1132 :
1133 fpStopwatch(pStopwatch),
1134 fpPrec(NULL)
1135{
1136 // constructor
1137
1138 // check for already existing guard
1139 if (fgpCurrent) fpPrec=fgpCurrent;
1140 fgpCurrent=this;
1141
1142 // stop the preceeding guard if it controls a different stopwatch
1143 int bStart=1;
1144 if (fpPrec && fpPrec!=this) bStart=fpPrec->Hold(fpStopwatch);
1145
1146 // start the stopwatch if the current guard controls a different one
1147 if (fpStopwatch && bStart==1) fpStopwatch->Start(kFALSE);
1148}
1149
e419b223 1150AliHLTComponent::AliHLTStopwatchGuard::AliHLTStopwatchGuard(const AliHLTStopwatchGuard&)
90ebac25 1151 :
1152 fpStopwatch(NULL),
1153 fpPrec(NULL)
1154{
e419b223 1155 //
1156 // copy constructor not for use
1157 //
1158}
1159
1160AliHLTComponent::AliHLTStopwatchGuard& AliHLTComponent::AliHLTStopwatchGuard::operator=(const AliHLTStopwatchGuard&)
1161{
1162 //
1163 // assignment operator not for use
1164 //
1165 fpStopwatch=NULL;
1166 fpPrec=NULL;
1167 return *this;
90ebac25 1168}
1169
1170AliHLTComponent::AliHLTStopwatchGuard* AliHLTComponent::AliHLTStopwatchGuard::fgpCurrent=NULL;
1171
1172AliHLTComponent::AliHLTStopwatchGuard::~AliHLTStopwatchGuard()
1173{
1174 // destructor
1175
1176 // resume the preceeding guard if it controls a different stopwatch
1177 int bStop=1;
1178 if (fpPrec && fpPrec!=this) bStop=fpPrec->Resume(fpStopwatch);
1179
1180 // stop the stopwatch if the current guard controls a different one
1181 if (fpStopwatch && bStop==1) fpStopwatch->Stop();
1182
1183 // resume to the preceeding guard
1184 fgpCurrent=fpPrec;
1185}
1186
1187int AliHLTComponent::AliHLTStopwatchGuard::Hold(TStopwatch* pSucc)
1188{
1189 // see header file for function documentation
1190 if (fpStopwatch!=NULL && fpStopwatch!=pSucc) fpStopwatch->Stop();
1191 return fpStopwatch!=pSucc?1:0;
1192}
1193
1194int AliHLTComponent::AliHLTStopwatchGuard::Resume(TStopwatch* pSucc)
1195{
1196 // see header file for function documentation
1197 if (fpStopwatch!=NULL && fpStopwatch!=pSucc) fpStopwatch->Start(kFALSE);
1198 return fpStopwatch!=pSucc?1:0;
1199}
1200
1201int AliHLTComponent::SetStopwatch(TObject* pSW, AliHLTStopwatchType type)
1202{
1203 // see header file for function documentation
1204 int iResult=0;
1205 if (pSW!=NULL && type<kSWTypeCount) {
1206 if (fpStopwatches) {
1207 TObject* pObj=fpStopwatches->At((int)type);
1208 if (pSW==NULL // explicit reset
1209 || pObj==NULL) { // explicit set
1210 fpStopwatches->AddAt(pSW, (int)type);
1211 } else if (pObj!=pSW) {
1212 HLTWarning("stopwatch %d already set, reset first", (int)type);
1213 iResult=-EBUSY;
1214 }
1215 }
1216 } else {
1217 iResult=-EINVAL;
1218 }
1219 return iResult;
1220}
1221
1222int AliHLTComponent::SetStopwatches(TObjArray* pStopwatches)
1223{
1224 // see header file for function documentation
1225 if (pStopwatches==NULL) return -EINVAL;
1226
1227 int iResult=0;
1228 for (int i=0 ; i<(int)kSWTypeCount && pStopwatches->GetEntries(); i++)
1229 SetStopwatch(pStopwatches->At(i), (AliHLTStopwatchType)i);
1230 return iResult;
1231}
559631d5 1232
1233AliHLTUInt32_t AliHLTComponent::GetRunNo() const
1234{
29312178 1235 // see header file for function documentation
559631d5 1236 if (fpRunDesc==NULL) return 0;
1237 return fpRunDesc->fRunNo;
1238}
1239
1240AliHLTUInt32_t AliHLTComponent::GetRunType() const
1241{
29312178 1242 // see header file for function documentation
559631d5 1243 if (fpRunDesc==NULL) return 0;
1244 return fpRunDesc->fRunType;
1245}
1246
83fec083 1247int AliHLTComponent::CopyStruct(void* pStruct, unsigned int iStructSize, unsigned int iBlockNo,
559631d5 1248 const char* structname, const char* eventname)
1249{
29312178 1250 // see header file for function documentation
559631d5 1251 int iResult=0;
1252 if (pStruct!=NULL && iStructSize>sizeof(AliHLTUInt32_t)) {
1253 if (fpInputBlocks!=NULL && iBlockNo<fCurrentEventData.fBlockCnt) {
1254 AliHLTUInt32_t* pTgt=(AliHLTUInt32_t*)pStruct;
1255 if (fpInputBlocks[iBlockNo].fPtr && fpInputBlocks[iBlockNo].fSize) {
3294f81a 1256 AliHLTUInt32_t copy=*((AliHLTUInt32_t*)fpInputBlocks[iBlockNo].fPtr);
559631d5 1257 if (fpInputBlocks[iBlockNo].fSize!=copy) {
1258 HLTWarning("%s event: missmatch of block size (%d) and structure size (%d)", eventname, fpInputBlocks[iBlockNo].fSize, copy);
1259 if (copy>fpInputBlocks[iBlockNo].fSize) copy=fpInputBlocks[iBlockNo].fSize;
1260 }
1261 if (copy!=iStructSize) {
1262 HLTWarning("%s event: missmatch in %s version (data type version %d)", eventname, structname, ALIHLT_DATA_TYPES_VERSION);
1263 if (copy>iStructSize) {
1264 copy=iStructSize;
1265 } else {
1266 memset(pTgt, 0, iStructSize);
1267 }
1268 }
3294f81a 1269 memcpy(pTgt, fpInputBlocks[iBlockNo].fPtr, copy);
559631d5 1270 *pTgt=iStructSize;
1271 iResult=copy;
1272 } else {
1273 HLTWarning("%s event: missing data block", eventname);
1274 }
1275 } else {
1276 iResult=-ENODATA;
1277 }
1278 } else {
1279 HLTError("invalid struct");
1280 iResult=-EINVAL;
1281 }
1282 return iResult;
1283}