3 /**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * for The ALICE HLT Project. *
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 **************************************************************************/
19 /** @file AliHLTConfiguration.cxx
20 @author Matthias Richter
22 @brief Implementation of HLT configuration handler.
30 #include "AliHLTConfiguration.h"
31 #include "AliHLTConfigurationHandler.h"
32 #include "AliHLTTask.h"
33 #include "AliHLTComponent.h"
34 #include "AliHLTComponentHandler.h"
39 /** ROOT macro for the implementation of ROOT specific class methods */
40 ClassImp(AliHLTConfiguration)
42 AliHLTConfiguration::AliHLTConfiguration()
54 // see header file for function documentation
55 fListSrcElement=fListSources.begin();
58 AliHLTConfiguration::AliHLTConfiguration(const char* id, const char* component, const char* sources, const char* arguments)
61 fComponent(component),
62 fStringSources(sources),
66 fArguments(arguments),
70 // see header file for function documentation
71 fListSrcElement=fListSources.begin();
72 if (id && component) {
73 if (fgConfigurationHandler) {
74 fgConfigurationHandler->RegisterConfiguration(this);
76 HLTError("no configuration handler set, abort registration");
81 AliHLTConfiguration::AliHLTConfiguration(const AliHLTConfiguration& src)
86 fComponent(src.fComponent),
87 fStringSources(src.fStringSources),
91 fArguments(src.fArguments),
95 // see header file for function documentation
96 fListSrcElement=fListSources.begin();
99 AliHLTConfiguration& AliHLTConfiguration::operator=(const AliHLTConfiguration& src)
101 // see header file for function documentation
103 fComponent=src.fComponent;
104 fStringSources=src.fStringSources;
106 fArguments=src.fArguments;
112 AliHLTConfiguration::~AliHLTConfiguration()
114 // see header file for function documentation
115 if (fgConfigurationHandler) {
116 if (fgConfigurationHandler->FindConfiguration(fID.Data())!=NULL) {
117 fgConfigurationHandler->RemoveConfiguration(this);
122 for (int i=0; i<fArgc; i++) {
130 vector<AliHLTConfiguration*>::iterator element=fListSources.begin();
131 while (element!=fListSources.end()) {
132 fListSources.erase(element);
133 element=fListSources.begin();
137 /* the global configuration handler which is used to automatically register the configuration
139 AliHLTConfigurationHandler* AliHLTConfiguration::fgConfigurationHandler=NULL;
141 int AliHLTConfiguration::GlobalInit(AliHLTConfigurationHandler* pHandler)
143 // see header file for function documentation
145 if (fgConfigurationHandler!=NULL) {
146 fgConfigurationHandler->Logging(kHLTLogWarning, "AliHLTConfiguration::GlobalInit", HLT_DEFAULT_LOG_KEYWORD, "configuration handler already initialized, overriding object %p with %p", fgConfigurationHandler, pHandler);
148 fgConfigurationHandler=pHandler;
152 int AliHLTConfiguration::GlobalDeinit(AliHLTConfigurationHandler* pHandler)
154 // see header file for function documentation
156 if (pHandler!=NULL && fgConfigurationHandler!=pHandler) {
157 fgConfigurationHandler->Logging(kHLTLogWarning, "AliHLTConfiguration::GlobalDeinit", HLT_DEFAULT_LOG_KEYWORD, "handler %p is not set, skip ...", pHandler);
160 fgConfigurationHandler=NULL;
164 const char* AliHLTConfiguration::GetName() const
166 // see header file for function documentation
169 return TObject::GetName();
172 AliHLTConfiguration* AliHLTConfiguration::GetSource(const char* id)
174 // see header file for function documentation
175 AliHLTConfiguration* pSrc=NULL;
177 // first check the current element
178 if (fListSrcElement!=fListSources.end() && strcmp(id, (*fListSrcElement)->GetName())==0) {
179 pSrc=*fListSrcElement;
183 pSrc=GetFirstSource();
185 if (strcmp(id, pSrc->GetName())==0)
187 pSrc=GetNextSource();
194 AliHLTConfiguration* AliHLTConfiguration::GetFirstSource()
196 // see header file for function documentation
197 AliHLTConfiguration* pSrc=NULL;
198 if (fNofSources>=0 || ExtractSources()) {
199 fListSrcElement=fListSources.begin();
200 if (fListSrcElement!=fListSources.end()) pSrc=*fListSrcElement;
205 AliHLTConfiguration* AliHLTConfiguration::GetNextSource()
207 // see header file for function documentation
208 AliHLTConfiguration* pSrc=NULL;
210 if (fListSrcElement!=fListSources.end() && (++fListSrcElement)!=fListSources.end())
211 pSrc=*fListSrcElement;
216 int AliHLTConfiguration::SourcesResolved(int bAuto)
218 // see header file for function documentation
220 if (fNofSources>=0 || bAuto && (iResult=ExtractSources())>=0) {
221 //HLTDebug("fNofSources=%d", fNofSources);
222 //HLTDebug("list size = %d", fListSources.size());
223 iResult=fNofSources==(int)fListSources.size();
228 int AliHLTConfiguration::InvalidateSource(AliHLTConfiguration* pConf)
230 // see header file for function documentation
233 vector<AliHLTConfiguration*>::iterator element=fListSources.begin();
234 while (element!=fListSources.end()) {
235 if (*element==pConf) {
236 fListSources.erase(element);
237 fListSrcElement=fListSources.end();
238 // there is no need to re-evaluate until there was a new configuration registered
239 // -> postpone the invalidation, its done in AliHLTConfigurationHandler::RegisterConfiguration
240 //InvalidateSources();
251 void AliHLTConfiguration::PrintStatus()
253 // see header file for function documentation
254 HLTLogKeyword("configuration status");
255 HLTMessage("status of configuration \"%s\" (%p)", GetName(), this);
256 if (!fComponent.IsNull()) HLTMessage(" - component: \"%s\"", fComponent.Data());
257 else HLTMessage(" - component string invalid");
258 if (!fStringSources.IsNull()) HLTMessage(" - sources: \"%s\"", fStringSources.Data());
259 else HLTMessage(" - no sources");
260 if (SourcesResolved(1)<=0)
261 HLTMessage(" there are unresolved sources");
262 AliHLTConfiguration* pSrc=GetFirstSource();
264 HLTMessage(" source \"%s\" (%p) resolved", pSrc->GetName(), pSrc);
265 pSrc=GetNextSource();
269 int AliHLTConfiguration::GetArguments(const char*** pArgv)
271 // see header file for function documentation
275 if ((iResult=ExtractArguments())<0) {
276 HLTError("error extracting arguments for configuration %s", GetName());
279 } else if (fArgc<0) {
280 HLTError("previous argument extraction failed");
282 //HLTDebug("%s fArgc %d", GetName(), fArgc);
284 *pArgv=(const char**)fArgv;
286 HLTError("invalid parameter");
293 int AliHLTConfiguration::ExtractSources()
295 // see header file for function documentation
298 if (!fStringSources.IsNull()) {
299 vector<char*> tgtList;
300 fListSources.clear();
301 if ((iResult=InterpreteString(fStringSources.Data(), tgtList))>=0) {
302 fNofSources=tgtList.size();
303 vector<char*>::iterator element=tgtList.begin();
304 while ((element=tgtList.begin())!=tgtList.end()) {
305 if (fgConfigurationHandler) {
306 AliHLTConfiguration* pConf=fgConfigurationHandler->FindConfiguration(*element);
308 //HLTDebug("configuration %s (%p): source \"%s\" (%p) inserted", GetName(), this, pConf->GetName(), pConf);
309 fListSources.push_back(pConf);
311 HLTError("can not find source \"%s\"", (*element));
314 } else if (iResult>=0) {
316 HLTFatal("global configuration handler not initialized, can not resolve sources");
319 tgtList.erase(element);
321 fListSrcElement=fListSources.begin();
327 int AliHLTConfiguration::ExtractArguments()
329 // see header file for function documentation
331 if (!fArguments.IsNull()) {
332 vector<char*> tgtList;
333 if ((iResult=InterpreteString(fArguments, tgtList))>=0) {
334 fArgc=tgtList.size();
335 //HLTDebug("configuration %s: extracted %d arguments from \"%s\"", GetName(), fArgc, fArguments);
337 fArgv = new char*[fArgc];
339 vector<char*>::iterator element=tgtList.begin();
341 while (element!=tgtList.end()) {
342 //HLTDebug("assign arguments %d (%s)", i, *element);
343 fArgv[i++]=(*element);
352 // there are zero arguments
358 int AliHLTConfiguration::InterpreteString(const char* arg, vector<char*>& argList)
360 // see header file for function documentation
363 //HLTDebug("interprete \"%s\"", arg);
368 //HLTDebug("%d %x", i, arg[i]);
369 if (arg[i]=='\'' && bQuote==0) {
371 } else if (arg[i]==0 ||
372 (arg[i]==' ' && bQuote==0) ||
373 (arg[i]=='\'' && bQuote==1)) {
376 char* pEntry= new char[i-prec+1];
378 strncpy(pEntry, &arg[prec], i-prec);
379 pEntry[i-prec]=0; // terminate string
380 //HLTDebug("create string \"%s\", insert at %d", pEntry, argList.size());
381 argList.push_back(pEntry);
386 } else if (prec==-1) prec=i;
387 } while (arg[i++]!=0 && iResult>=0);
394 int AliHLTConfiguration::FollowDependency(const char* id, TList* pTgtList)
396 // see header file for function documentation
399 AliHLTConfiguration* pDep=NULL;
400 if ((pDep=GetSource(id))!=NULL) {
401 if (pTgtList) pTgtList->Add(pDep);
404 pDep=GetFirstSource();
405 while (pDep && iResult==0) {
406 if ((iResult=pDep->FollowDependency(id, pTgtList))>0) {
407 if (pTgtList) pTgtList->AddFirst(pDep);
410 pDep=GetNextSource();
419 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
421 /** ROOT macro for the implementation of ROOT specific class methods */
424 AliHLTTask::AliHLTTask()
426 fpConfiguration(NULL),
433 // see header file for function documentation
436 AliHLTTask::AliHLTTask(AliHLTConfiguration* pConf)
438 fpConfiguration(pConf),
445 // see header file for function documentation
448 AliHLTTask::~AliHLTTask()
450 TObjLink* lnk=fListDependencies.FirstLink();
453 AliHLTTask* pTask=(AliHLTTask*)lnk->GetObject();
454 pTask->UnsetTarget(this);
457 lnk=fListTargets.FirstLink();
460 AliHLTTask* pTask=(AliHLTTask*)lnk->GetObject();
461 pTask->UnsetDependency(this);
465 if (fpComponent) delete fpComponent;
469 int AliHLTTask::Init(AliHLTConfiguration* pConf, AliHLTComponentHandler* pCH)
471 // see header file for function documentation
473 if (fpConfiguration!=NULL && pConf!=NULL && fpConfiguration!=pConf) {
474 HLTWarning("overriding existing reference to configuration object %p (%s) by %p",
475 fpConfiguration, GetName(), pConf);
477 if (pConf!=NULL) fpConfiguration=pConf;
478 if (fpConfiguration) {
481 const char** argv=NULL;
482 if ((iResult=fpConfiguration->GetArguments(&argv))>=0) {
483 argc=iResult; // just to make it clear
484 // TODO: we have to think about the optional environment parameter,
485 // currently just set to NULL.
486 iResult=pCH->CreateComponent(fpConfiguration->GetComponentID(), NULL, argc, argv, fpComponent);
487 if (fpComponent || iResult<=0) {
488 //HLTDebug("component %s (%p) created", fpComponent->GetComponentID(), fpComponent);
490 HLTError("can not find component \"%s\" (%d)", fpConfiguration->GetComponentID(), iResult);
493 HLTError("can not get argument list for configuration %s (%s)", fpConfiguration->GetName(), fpConfiguration->GetComponentID());
497 HLTError("component handler instance needed for task initialization");
501 HLTError("configuration object instance needed for task initialization");
507 int AliHLTTask::Deinit()
509 // see header file for function documentation
511 AliHLTComponent* pComponent=GetComponent();
514 //HLTDebug("delete component %s (%p)", pComponent->GetComponentID(), pComponent);
515 pComponent->Deinit();
518 HLTWarning("task %s (%p) doesn't seem to be in initialized", GetName(), this);
523 const char *AliHLTTask::GetName() const
525 // see header file for function documentation
527 return fpConfiguration->GetName();
528 return TObject::GetName();
531 AliHLTConfiguration* AliHLTTask::GetConf() const
533 // see header file for function documentation
534 return fpConfiguration;
537 AliHLTComponent* AliHLTTask::GetComponent() const
539 // see header file for function documentation
543 AliHLTTask* AliHLTTask::FindDependency(const char* id)
545 // see header file for function documentation
546 AliHLTTask* pTask=NULL;
548 pTask=(AliHLTTask*)fListDependencies.FindObject(id);
553 int AliHLTTask::FollowDependency(const char* id, TList* pTgtList)
555 // see header file for function documentation
558 AliHLTTask* pDep=NULL;
559 if ((pDep=(AliHLTTask*)fListDependencies.FindObject(id))!=NULL) {
560 if (pTgtList) pTgtList->Add(pDep);
563 TObjLink* lnk=fListDependencies.FirstLink();
564 while (lnk && iResult==0) {
565 pDep=(AliHLTTask*)lnk->GetObject();
567 if ((iResult=pDep->FollowDependency(id, pTgtList))>0) {
568 if (pTgtList) pTgtList->AddFirst(pDep);
583 void AliHLTTask::PrintDependencyTree(const char* id, int bFromConfiguration)
585 // see header file for function documentation
586 HLTLogKeyword("task dependencies");
589 if (bFromConfiguration) {
591 iResult=fpConfiguration->FollowDependency(id, &tgtList);
595 iResult=FollowDependency(id, &tgtList);
597 HLTMessage(" task \"%s\": dependency level %d ", GetName(), iResult);
598 TObjLink* lnk=tgtList.FirstLink();
600 char* pSpace = new char[iResult+1];
602 memset(pSpace, 32, iResult);
605 TObject* obj=lnk->GetObject();
606 HLTMessage(" %s^-- %s ", &pSpace[i--], obj->GetName());
616 int AliHLTTask::SetDependency(AliHLTTask* pDep)
618 // see header file for function documentation
621 if (FindDependency(pDep->GetName())==NULL) {
622 fListDependencies.Add(pDep);
632 int AliHLTTask::UnsetDependency(AliHLTTask* pDep)
634 fListDependencies.Remove(pDep);
635 if (fpConfiguration) {
636 fpConfiguration->InvalidateSources();
641 int AliHLTTask::CheckDependencies()
643 // see header file for function documentation
645 AliHLTConfiguration* pSrc=fpConfiguration->GetFirstSource();
647 if (FindDependency(pSrc->GetName())==NULL) {
648 //HLTDebug("dependency \"%s\" unresolved", pSrc->GetName());
651 pSrc=fpConfiguration->GetNextSource();
657 int AliHLTTask::Depends(AliHLTTask* pTask)
659 // see header file for function documentation
662 if (fpConfiguration) {
663 iResult=fpConfiguration->GetSource(pTask->GetName())!=NULL;
665 //HLTDebug("task \"%s\" depends on \"%s\"", GetName(), pTask->GetName());
667 //HLTDebug("task \"%s\" independend of \"%s\"", GetName(), pTask->GetName());
678 AliHLTTask* AliHLTTask::FindTarget(const char* id)
680 // see header file for function documentation
681 AliHLTTask* pTask=NULL;
683 pTask=(AliHLTTask*)fListTargets.FindObject(id);
688 int AliHLTTask::SetTarget(AliHLTTask* pTgt)
690 // see header file for function documentation
693 if (FindTarget(pTgt->GetName())==NULL) {
694 fListTargets.Add(pTgt);
704 int AliHLTTask::UnsetTarget(AliHLTTask* pTarget)
706 fListTargets.Remove(pTarget);
710 int AliHLTTask::StartRun()
712 // see header file for function documentation
714 int iNofInputDataBlocks=0;
715 AliHLTComponent* pComponent=GetComponent();
717 // determine the number of input data blocks provided from the source tasks
718 TObjLink* lnk=fListDependencies.FirstLink();
719 while (lnk && iResult>=0) {
720 AliHLTTask* pSrcTask=(AliHLTTask*)lnk->GetObject();
722 if ((iResult=pSrcTask->GetNofMatchingDataTypes(this))>0) {
723 iNofInputDataBlocks+=iResult;
724 } else if (iResult==0) {
725 HLTWarning("source task %s (%p) does not provide any matching data type for task %s (%p)", pSrcTask->GetName(), pSrcTask, GetName(), this);
727 HLTError("task %s (%p): error getting matching data types for source task %s (%p)", GetName(), this, pSrcTask->GetName(), pSrcTask);
734 if (fBlockDataArray.size()>0) {
735 HLTWarning("block data array for task %s (%p) was not cleaned", GetName(), this);
736 fBlockDataArray.resize(0);
740 // the initialization of the component is done by the ComponentHandler after creation
742 //iResult=Init( AliHLTComponentEnvironment* environ, void* environ_param, int argc, const char** argv );
744 // allocate internal task variables for bookkeeping aso.
745 // we allocate the BlockData array with at least one member
746 if (iNofInputDataBlocks==0) iNofInputDataBlocks=1;
747 AliHLTComponentBlockData init;
748 memset(&init, 0, sizeof(AliHLTComponentBlockData));
749 fBlockDataArray.resize(iNofInputDataBlocks, init);
751 // allocate the data buffer, which controls the output buffer and subscriptions
753 fpDataBuffer=new AliHLTDataBuffer;
754 if (fpDataBuffer!=NULL) {
755 HLTDebug("created data buffer %p for task %s (%p)", fpDataBuffer, GetName(), this);
756 TObjLink* lnk=fListTargets.FirstLink();
757 while (lnk && iResult>=0) {
758 AliHLTTask* pTgtTask=(AliHLTTask*)lnk->GetObject();
760 if ((iResult=fpDataBuffer->SetConsumer(pTgtTask->GetComponent()))>=0) {
769 HLTFatal("can not create data buffer object, memory allocation failed");
775 HLTError("task %s (%p) does not have a component", GetName(), this);
781 int AliHLTTask::EndRun()
783 // see header file for function documentation
785 if (fBlockDataArray.size()>0) {
786 fBlockDataArray.resize(0);
788 HLTWarning("task %s (%p) doesn't seem to be in running mode", GetName(), this);
791 AliHLTDataBuffer* pBuffer=fpDataBuffer;
798 int AliHLTTask::ProcessTask(Int_t eventNo)
800 // see header file for function documentation
802 AliHLTComponent* pComponent=GetComponent();
803 if (pComponent && fpDataBuffer) {
804 HLTDebug("Processing task %s (%p) fpDataBuffer %p", GetName(), this, fpDataBuffer);
805 fpDataBuffer->Reset();
806 int iSourceDataBlock=0;
807 int iInputDataVolume=0;
809 AliHLTTask* pSrcTask=NULL;
810 TList subscribedTaskList;
811 TObjLink* lnk=fListDependencies.FirstLink();
813 // subscribe to all source tasks
814 while (lnk && iResult>=0) {
815 pSrcTask=(AliHLTTask*)lnk->GetObject();
817 int iMatchingDB=pSrcTask->GetNofMatchingDataBlocks(this);
818 if (iMatchingDB>=0 && static_cast<unsigned int>(iMatchingDB)>fBlockDataArray.size()-iSourceDataBlock) {
819 AliHLTComponentBlockData init;
820 memset(&init, 0, sizeof(AliHLTComponentBlockData));
821 fBlockDataArray.resize(iSourceDataBlock+iMatchingDB, init);
824 HLTError("task %s (%p): error getting no of matching data blocks from task %s (%p), error %d", GetName(), this, pSrcTask->GetName(), pSrcTask, iMatchingDB);
827 } else if (iMatchingDB==0) {
828 HLTDebug("source task %s (%p) does not provide any matching data type for task %s (%p)", pSrcTask->GetName(), pSrcTask, GetName(), this);
831 if ((iResult=pSrcTask->Subscribe(this, &fBlockDataArray[iSourceDataBlock],fBlockDataArray.size()-iSourceDataBlock))>=0) {
832 for (int i=0; i<iResult; i++) {
833 iInputDataVolume+=fBlockDataArray[i+iSourceDataBlock].fSize;
834 // put the source task as many times into the list as it provides data blocks
835 // makes the bookkeeping for the data release easier
836 subscribedTaskList.Add(pSrcTask);
838 HLTDebug("Task %s (%p) successfully subscribed to %d data block(s) of task %s (%p)", GetName(), this, iResult, pSrcTask->GetName(), pSrcTask);
839 iSourceDataBlock+=iResult;
842 HLTError("Task %s (%p): subscription to task %s (%p) failed with error %d", GetName(), this, pSrcTask->GetName(), pSrcTask, iResult);
846 HLTFatal("fatal internal error in ROOT list handling");
853 int iNofTrial=0; // repeat processing if component returns -ENOSPC
854 AliHLTUInt32_t size=0;
857 long unsigned int iConstBase=0;
858 double fInputMultiplier=0;
859 if (pComponent->GetComponentType()!=AliHLTComponent::kSink)
860 pComponent->GetOutputDataSize(iConstBase, fInputMultiplier);
861 if (fInputMultiplier<0) {
862 HLTWarning("ignoring negative input multiplier");
865 long unsigned int iOutputDataSize=int(fInputMultiplier*iInputDataVolume) + iConstBase;
866 //HLTDebug("task %s: reqired output size %d", GetName(), iOutputDataSize);
868 // dont process again if the buffer size is the same
869 if (size==iOutputDataSize) break;
870 HLTInfo("processing task %s again with buffer size %d", GetName(), iOutputDataSize);
872 AliHLTUInt8_t* pTgtBuffer=NULL;
873 if (iOutputDataSize>0) pTgtBuffer=fpDataBuffer->GetTargetBuffer(iOutputDataSize);
874 //HLTDebug("provided raw buffer %p", pTgtBuffer);
875 AliHLTComponentEventData evtData;
876 AliHLTComponent::FillEventData(evtData);
877 evtData.fEventID=(AliHLTEventID_t)eventNo;
878 evtData.fBlockCnt=iSourceDataBlock;
879 AliHLTComponentTriggerData trigData;
880 size=iOutputDataSize;
881 AliHLTUInt32_t outputBlockCnt=0;
882 AliHLTComponentBlockData* outputBlocks=NULL;
883 AliHLTComponentEventDoneData* edd;
884 if (pTgtBuffer!=NULL || iOutputDataSize==0) {
885 iResult=pComponent->ProcessEvent(evtData, &fBlockDataArray[0], trigData, pTgtBuffer, size, outputBlockCnt, outputBlocks, edd);
886 HLTDebug("task %s: component %s ProcessEvent finnished (%d): size=%d blocks=%d", GetName(), pComponent->GetComponentID(), iResult, size, outputBlockCnt);
887 if (iResult>=0 && pTgtBuffer && outputBlocks) {
888 iResult=fpDataBuffer->SetSegments(pTgtBuffer, outputBlocks, outputBlockCnt);
889 delete [] outputBlocks; outputBlocks=NULL; outputBlockCnt=0;
891 fpDataBuffer->Reset();
894 HLTError("task %s: no target buffer available", GetName());
897 } while (iResult==-ENOSPC && iNofTrial++<1);
900 // now release all buffers which we have subscribed to
902 lnk=subscribedTaskList.FirstLink();
904 pSrcTask=(AliHLTTask*)lnk->GetObject();
907 if ((iTempRes=pSrcTask->Release(&fBlockDataArray[iSourceDataBlock], this))>=0) {
908 HLTDebug("Task %s (%p) successfully released segment of task %s (%p)", GetName(), this, pSrcTask->GetName(), pSrcTask);
910 HLTError("Task %s (%p): realease of task %s (%p) failed with error %d", GetName(), this, pSrcTask->GetName(), pSrcTask, iTempRes);
913 HLTFatal("task %s (%p): internal error in ROOT list handling", GetName(), this);
914 if (iResult>=0) iResult=-EFAULT;
916 subscribedTaskList.Remove(lnk);
917 lnk=subscribedTaskList.FirstLink();
920 if (subscribedTaskList.GetSize()>0) {
921 HLTError("task %s (%p): could not release all data buffers", GetName(), this);
924 HLTError("task %s (%p): internal failure (not initialized component %p, data buffer %p)", GetName(), this, fpComponent, fpDataBuffer);
930 int AliHLTTask::GetNofMatchingDataBlocks(const AliHLTTask* pConsumerTask) const
932 // see header file for function documentation
936 iResult=fpDataBuffer->FindMatchingDataBlocks(pConsumerTask->GetComponent(), NULL);
938 HLTFatal("internal data buffer missing");
947 int AliHLTTask::GetNofMatchingDataTypes(const AliHLTTask* pConsumerTask) const
949 // see header file for function documentation
952 AliHLTComponent* pComponent=GetComponent();
955 HLTError("component not initialized");
959 iResult=pComponent->FindMatchingDataTypes(pConsumerTask->GetComponent(), NULL);
961 HLTFatal("task initialization failed");
970 int AliHLTTask::Subscribe(const AliHLTTask* pConsumerTask, AliHLTComponentBlockData* pBlockDesc, int iArraySize)
972 // see header file for function documentation
976 iResult=fpDataBuffer->Subscribe(pConsumerTask->GetComponent(), pBlockDesc, iArraySize);
978 HLTFatal("internal data buffer missing");
987 int AliHLTTask::Release(AliHLTComponentBlockData* pBlockDesc, const AliHLTTask* pConsumerTask)
989 // see header file for function documentation
991 if (pConsumerTask && pBlockDesc) {
993 iResult=fpDataBuffer->Release(pBlockDesc, pConsumerTask->GetComponent());
995 HLTFatal("internal data buffer missing");
1004 void AliHLTTask::PrintStatus()
1006 // see header file for function documentation
1007 HLTLogKeyword("task properties");
1008 AliHLTComponent* pComponent=GetComponent();
1010 HLTMessage(" component: %s (%p)", pComponent->GetComponentID(), pComponent);
1012 HLTMessage(" no component set!");
1014 if (fpConfiguration) {
1015 AliHLTConfiguration* pSrc=fpConfiguration->GetFirstSource();
1017 const char* pQualifier="unresolved";
1018 if (FindDependency(pSrc->GetName()))
1019 pQualifier="resolved";
1020 HLTMessage(" source: %s (%s)", pSrc->GetName(), pQualifier);
1021 pSrc=fpConfiguration->GetNextSource();
1023 TObjLink* lnk = fListTargets.FirstLink();
1025 TObject *obj = lnk->GetObject();
1026 HLTMessage(" target: %s", obj->GetName());
1030 HLTMessage(" task \"%s\" not initialized", GetName());
1034 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1036 /** ROOT macro for the implementation of ROOT specific class methods */
1037 ClassImp(AliHLTConfigurationHandler)
1039 AliHLTConfigurationHandler::AliHLTConfigurationHandler()
1041 fgListConfigurations()
1043 // see header file for function documentation
1044 SetLocalLoggingLevel(kHLTLogInfo);
1047 AliHLTConfigurationHandler::~AliHLTConfigurationHandler()
1049 // see header file for function documentation
1051 while ((lnk=fgListConfigurations.FirstLink())!=NULL) {
1052 AliHLTConfiguration* pConf=(AliHLTConfiguration*)lnk->GetObject();
1053 HLTDebug("delete configuration \"%s\"", pConf->GetName());
1054 fgListConfigurations.Remove(lnk);
1059 int AliHLTConfigurationHandler::RegisterConfiguration(AliHLTConfiguration* pConf)
1061 // see header file for function documentation
1064 if (FindConfiguration(pConf->GetName()) == NULL) {
1065 AliHLTConfiguration* pClone=new AliHLTConfiguration(*pConf);
1066 fgListConfigurations.Add(pClone);
1067 HLTDebug("configuration \"%s\" (%p) registered from %p", pClone->GetName(), pClone, pConf);
1069 // mark all configurations with unresolved dependencies for re-evaluation
1070 TObjLink* lnk=fgListConfigurations.FirstLink();
1072 AliHLTConfiguration* pSrc=(AliHLTConfiguration*)lnk->GetObject();
1073 if (pSrc && pSrc!=pClone && pSrc->SourcesResolved()!=1) {
1074 pSrc->InvalidateSources();
1080 HLTWarning("configuration \"%s\" already registered", pConf->GetName());
1088 int AliHLTConfigurationHandler::CreateConfiguration(const char* id, const char* component, const char* sources, const char* arguments)
1090 // see header file for function documentation
1092 AliHLTConfiguration* pConf= new AliHLTConfiguration(id, component, sources, arguments);
1094 // the configuration will be registered automatically, if this failes the configuration
1095 // is missing -> delete it
1096 if (FindConfiguration(id)==NULL) {
1102 HLTError("system error: object allocation failed");
1108 void AliHLTConfigurationHandler::PrintConfigurations()
1110 // see header file for function documentation
1111 HLTLogKeyword("configuration listing");
1112 HLTMessage("registered configurations:");
1113 TObjLink *lnk = fgListConfigurations.FirstLink();
1115 TObject *obj = lnk->GetObject();
1116 HLTMessage(" %s", obj->GetName());
1121 int AliHLTConfigurationHandler::RemoveConfiguration(const char* id)
1123 // see header file for function documentation
1126 AliHLTConfiguration* pConf=NULL;
1127 if ((pConf=FindConfiguration(id))!=NULL) {
1128 iResult=RemoveConfiguration(pConf);
1132 HLTWarning("can not find configuration \"%s\"", id);
1141 int AliHLTConfigurationHandler::RemoveConfiguration(AliHLTConfiguration* pConf)
1143 // see header file for function documentation
1146 // remove the configuration from the list
1147 HLTDebug("remove configuration \"%s\"", pConf->GetName());
1148 fgListConfigurations.Remove(pConf);
1149 // remove cross links in the remaining configurations
1150 TObjLink* lnk=fgListConfigurations.FirstLink();
1151 while (lnk && iResult>=0) {
1152 AliHLTConfiguration* pRem=(AliHLTConfiguration*)lnk->GetObject();
1154 pRem->InvalidateSource(pConf);
1164 AliHLTConfiguration* AliHLTConfigurationHandler::FindConfiguration(const char* id)
1166 // see header file for function documentation
1167 AliHLTConfiguration* pConf=NULL;
1169 pConf=(AliHLTConfiguration*)fgListConfigurations.FindObject(id);