#include "TString.h"
#include "TObjString.h"
#include "TObjArray.h"
+#include <cassert>
/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTOUTHandlerChain)
fChains(),
fOptions(),
fpSystem(NULL),
- fpTask(NULL)
+ fbHaveOutput(false)
{
// see header file for class documentation
// or
{
// see header file for class documentation
if (fpSystem) {
+ // TODO: the EOR is currenttly not send because the reconstruction
+ // chian is not stopped. Trying it here gives an error, there is
+ // some state mismatch in AliHLTSystem. Probably due to the fact,
+ // that the AliHLTSystem::Reconstruct method is not used
+// if (!fpSystem->CheckStatus(AliHLTSystem::kError)) {
+// // send specific 'event' to execute the stop sequence
+// fpSystem->Reconstruct(0, NULL, NULL);
+// }
delete fpSystem;
}
}
return iResult;
}
- if (fpSystem->CheckStatus(AliHLTSystem::kError) || !fpTask) {
+ if (fpSystem->CheckStatus(AliHLTSystem::kError)) {
HLTWarning("kChain handler '%s': system in error state, skipping processing of associated HLTOUT blocks", fChains.Data());
return -EACCES;
}
// run one event and do not stop the chain
- fpTask->Reset();
{
AliHLTOUT::AliHLTOUTGlobalInstanceGuard g(pData);
if ((iResult=fpSystem->Run(1,0))>=0) {
// sub-collection is going to be reset from the
// parent HLTOUT collection
- AliHLTOUT* pSubCollection=dynamic_cast<AliHLTOUT*>(fpTask);
+ AliHLTOUTTask* pTask=fpSystem->GetHLTOUTTask();
+
+ // either have the task or none of the chains controlled by the chain
+ // handler has output
+ assert(pTask || !fbHaveOutput);
+ if (pTask) {
+ AliHLTOUT* pSubCollection=dynamic_cast<AliHLTOUT*>(pTask);
pSubCollection->Init();
+
+ // filter out some data blocks which should not be processed
+ // in the next stage:
+ // 1. we are not interested in the component statistics
+ // produced in the HLTOUT handler chain
+ for (iResult=pSubCollection->SelectFirstDataBlock();
+ iResult>=0;
+ iResult=pSubCollection->SelectNextDataBlock()) {
+ AliHLTComponentDataType dt=kAliHLTVoidDataType;
+ AliHLTUInt32_t spec=kAliHLTVoidDataSpec;
+ pSubCollection->GetDataBlockDescription(dt, spec);
+ if (dt==kAliHLTDataTypeComponentStatistics) {
+ pSubCollection->MarkDataBlockProcessed();
+ }
+ }
pData->AddSubCollection(pSubCollection);
- } else {
- fpTask->Reset();
+ } else if (fbHaveOutput) {
+ // this is an error condition since task has been created and should
+ // be available
+ HLTError("can not get instance of HLTOUT task from HLT system %p", fpSystem);
+ }
}
}
int iResult=0;
if (!fpSystem) {
// init AliHLTSystem
- fpSystem = new AliHLTSystem(GetGlobalLoggingLevel());
+ TString systemName="kChain_"; systemName+=fChains;
+ systemName.ReplaceAll(" ", "_");
+ fpSystem = new AliHLTSystem(GetGlobalLoggingLevel(), systemName);
if (fpSystem) {
if ((iResult=fpSystem->ScanOptions(fOptions.Data()))>=0) {
// load configurations if not specified by external macro
// add AliHLTOUTTask on top of the configuartions in order to
// collect the data
- fpTask=new AliHLTOUTTask(fChains.Data());
+ // remember if task has been created (result>0)
+ fbHaveOutput=((iResult=fpSystem->AddHLTOUTTask(fChains.Data()))>0);
}
} else {
iResult=-ENOMEM;
}
- if (iResult>=0 && fpSystem && fpTask) {
- if (fpTask->GetConf() && fpTask->GetConf()->SourcesResolved()>=0) {
- iResult=fpSystem->InsertTask(fpTask);
- } else {
- HLTError("HLTOUT task (%s) sources not resolved", fpTask->GetName());
- iResult=-ENOENT;
- }
- }
- if (iResult<0 || !fpTask) {
+ if (iResult<0) {
SetStatusFlag(kHandlerError);
if (fpSystem) delete fpSystem; fpSystem=NULL;
- if (fpTask) delete fpTask; fpTask=NULL;
}
}
return iResult;