Bug fix: A certain kind of corrupted data the outputbuffer of the decoder could be...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 28 Apr 2008 10:38:50 +0000 (10:38 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 28 Apr 2008 10:38:50 +0000 (10:38 +0000)
RAW/AliAltroData.cxx
RAW/AliAltroData.h
RAW/AliAltroDecoder.cxx
RAW/AliAltroDecoder.h

index 80512ff..a240c8e 100644 (file)
@@ -113,6 +113,16 @@ Bool_t AliAltroData::NextBunch(AliAltroBunch *altroBunch)
          altroBunch->SetEndTimeBin( *fBunchData );
          //      altroBunch->SetStartTimeBin(*fBunchData - fBunchSize);
          fBunchData -= (altroBunch->GetBunchSize() +1);
+
+         // PATCH from Per Thomas Hille 250408 mke sure tha
+         // Data is consistent by cheking the start timebin, should never be negative
+         if( (int)altroBunch->GetStartTimeBin( ) < 0)
+           {
+             //              printf("ERROR altroBunch->GetStartTimeBin( ) is  %d", (int)altroBunch->GetStartTimeBin( ) );
+             return kFALSE;
+           }
+
+
          fBunchCounter ++;
          return kTRUE;
        }
@@ -125,8 +135,8 @@ Bool_t AliAltroData::NextBunch(AliAltroBunch *altroBunch)
     }
   else
     {
-      //      printf("\nAliAltroData::NextBunch: WARNING, dataset is not complet. 2AAA endmarker is missing ");
-      //      printf("\nfor branch %d, card %d, chip %d, channel %d\n",  GetBranch(), GetCard(), GetChip(), GetChannel());
+      //     printf("\nAliAltroData::NextBunch: WARNING, dataset is not complet. 2AAA endmarker is missing ");
+      //    printf("\nfor branch %d, card %d, chip %d, channel %d\n",  GetBranch(), GetCard(), GetChip(), GetChannel());
       return kFALSE;
     }
 
index 2d94819..c8d13e9 100644 (file)
@@ -46,6 +46,7 @@ private:
   Int_t   fBunchCounter;
   Bool_t  fIsComplete;
 
+
   ClassDef(AliAltroData, 0)  // container class for Altro payload
 
 };
index 2ee4ddf..ee183be 100644 (file)
@@ -212,12 +212,23 @@ Bool_t AliAltroDecoder::NextChannel(AliAltroData *altroDataPtr)
              fOutBufferIndex = fOutBufferIndex - fNAltro10bitWords -(4 - fNAltro10bitWords%4);
            }
 
-      
-         altroDataPtr->SetData( &fOutBuffer[fOutBufferIndex] );
-         fOutBufferIndex --;
-         altroDataPtr->SetDataSize( fNAltro10bitWords );
+         
+         if(fOutBufferIndex > 0)
+           {
+         
+             //cout << " AliAltroDecoder::NextChannel fOutBufferIndex =" << fOutBufferIndex   << endl;
+             //              printf( "AliAltroDecoder::NextChannel fOutBufferIndex = %d", fOutBufferIndex);
+             altroDataPtr->SetData( &fOutBuffer[fOutBufferIndex] );
+             fOutBufferIndex --;
+             altroDataPtr->SetDataSize( fNAltro10bitWords );
+             return kTRUE;
+           }
+         else
+           {
+             //TODO write a fatal log message when this happends
+             return kFALSE;
+           }
 
-         return kTRUE;
 
        }
       else
@@ -297,6 +308,14 @@ int AliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size)
   // Sets the pointer to the memory block that should be decoded
   // Returns a negative value if an inconsistency in the data is detected
 
+  if(dtaPtr == 0)
+    {
+      printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, dtaPtr = ZERO !!!!!!!!!!!!\n");
+      printf("\nThis is an user error, please check in your code that you don give a zero pointer to the decoder \n");
+      return -99;
+    }
+
+
   int iRet = 0;
   Int_t tmpTrailerSize;
   fIsDecoded = kFALSE; 
index 9c44699..e346f61 100644 (file)
@@ -21,7 +21,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 
-
 #include <TObject.h>
 
 #include <iostream>