bugfix in high level interface: GetFirst/NextObject/Block
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTComponent.cxx
index 06e62b512b182a33a15f13f73fd80d8b17723da6..3113f1fe872ec94966be1455552f47c367d2e477 100644 (file)
@@ -452,7 +452,7 @@ const TObject* AliHLTComponent::GetFirstInputObject(const AliHLTComponentDataTyp
   fSearchDataType=dt;
   if (classname) fClassName=classname;
   else fClassName.clear();
   fSearchDataType=dt;
   if (classname) fClassName=classname;
   else fClassName.clear();
-  int idx=FindInputBlock(fSearchDataType, 0);
+  int idx=FindInputBlock(fSearchDataType, 0, 1);
   HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(dt).c_str());
   TObject* pObj=NULL;
   if (idx>=0) {
   HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(dt).c_str());
   TObject* pObj=NULL;
   if (idx>=0) {
@@ -480,7 +480,7 @@ const TObject* AliHLTComponent::GetNextInputObject(int bForce)
 {
   // see header file for function documentation
   ALIHLTCOMPONENT_BASE_STOPWATCH();
 {
   // see header file for function documentation
   ALIHLTCOMPONENT_BASE_STOPWATCH();
-  int idx=FindInputBlock(fSearchDataType, fCurrentInputBlock+1);
+  int idx=FindInputBlock(fSearchDataType, fCurrentInputBlock+1, 1);
   //HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(fSearchDataType).c_str());
   TObject* pObj=NULL;
   if (idx>=0) {
   //HLTDebug("found block %d when searching for data type %s", idx, DataType2Text(fSearchDataType).c_str());
   TObject* pObj=NULL;
   if (idx>=0) {
@@ -491,13 +491,18 @@ const TObject* AliHLTComponent::GetNextInputObject(int bForce)
   return pObj;
 }
 
   return pObj;
 }
 
-int AliHLTComponent::FindInputBlock(const AliHLTComponentDataType& dt, int startIdx) const
+int AliHLTComponent::FindInputBlock(const AliHLTComponentDataType& dt, int startIdx, int bObject) const
 {
   // see header file for function documentation
   int iResult=-ENOENT;
   if (fpInputBlocks!=NULL) {
     int idx=startIdx<0?0:startIdx;
     for ( ; (UInt_t)idx<fCurrentEventData.fBlockCnt && iResult==-ENOENT; idx++) {
 {
   // see header file for function documentation
   int iResult=-ENOENT;
   if (fpInputBlocks!=NULL) {
     int idx=startIdx<0?0:startIdx;
     for ( ; (UInt_t)idx<fCurrentEventData.fBlockCnt && iResult==-ENOENT; idx++) {
+      if (bObject!=0) {
+       if (fpInputBlocks[idx].fPtr==NULL) continue;
+       AliHLTUInt32_t firstWord=*((AliHLTUInt32_t*)fpInputBlocks[idx].fPtr);
+       if (firstWord!=fpInputBlocks[idx].fSize-sizeof(AliHLTUInt32_t)) continue;
+      }
       if (dt == kAliHLTAnyDataType || fpInputBlocks[idx].fDataType == dt) {
        iResult=idx;
       }
       if (dt == kAliHLTAnyDataType || fpInputBlocks[idx].fDataType == dt) {
        iResult=idx;
       }
@@ -523,8 +528,8 @@ TObject* AliHLTComponent::CreateInputObject(int idx, int bForce)
            HLTDebug("object %p type %s created", pObj, objclass->GetName());
          } else {
          }
            HLTDebug("object %p type %s created", pObj, objclass->GetName());
          } else {
          }
-       } else {
-         //    } else if (bForce!=0) {
+         //} else {
+               } else if (bForce!=0) {
          HLTError("size missmatch: block size %d, indicated %d", fpInputBlocks[idx].fSize, firstWord+sizeof(AliHLTUInt32_t));
        }
       } else {
          HLTError("size missmatch: block size %d, indicated %d", fpInputBlocks[idx].fSize, firstWord+sizeof(AliHLTUInt32_t));
        }
       } else {
@@ -630,6 +635,7 @@ const AliHLTComponentBlockData* AliHLTComponent::GetFirstInputBlock(const AliHLT
   if (idx>=0) {
     // check for fpInputBlocks pointer done in FindInputBlock
     pBlock=&fpInputBlocks[idx];
   if (idx>=0) {
     // check for fpInputBlocks pointer done in FindInputBlock
     pBlock=&fpInputBlocks[idx];
+    fCurrentInputBlock=idx;
   }
   return pBlock;
 }
   }
   return pBlock;
 }
@@ -653,6 +659,7 @@ const AliHLTComponentBlockData* AliHLTComponent::GetNextInputBlock()
   if (idx>=0) {
     // check for fpInputBlocks pointer done in FindInputBlock
     pBlock=&fpInputBlocks[idx];
   if (idx>=0) {
     // check for fpInputBlocks pointer done in FindInputBlock
     pBlock=&fpInputBlocks[idx];
+    fCurrentInputBlock=idx;
   }
   return pBlock;
 }
   }
   return pBlock;
 }