Correct alignment of simulated HLT raw data
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 20 May 2009 06:16:50 +0000 (06:16 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 20 May 2009 06:16:50 +0000 (06:16 +0000)
https://savannah.cern.ch/bugs/?50574

HLT/rec/AliHLTOUTHomerCollection.cxx
HLT/sim/AliHLTOUTComponent.cxx

index 2ee1315..83ef4eb 100644 (file)
@@ -151,7 +151,8 @@ AliHLTHOMERReader* AliHLTOUTHomerCollection::OpenReader(UChar_t* pSrc, unsigned
   if (pHLTHeader->fLength>size) {
     HLTError("can not treat HLT data block %d: size mismatch, header %d, but buffer is %d", id, pHLTHeader->fLength, size);
     return NULL;
-  } else if (pHLTHeader->fLength<size) {
+  } else if (pHLTHeader->fLength<size-3) {
+    // data payload is aligned to 32bit, so there can be a difference by at most 3 bytes
     HLTWarning("size mismatch in HLT data block %d: header %d, but buffer is %d", id, pHLTHeader->fLength, size);
   }
 
@@ -177,7 +178,7 @@ AliHLTHOMERReader* AliHLTOUTHomerCollection::OpenReader(UChar_t* pSrc, unsigned
   if (!(statusFlags&(0x1<<kCDHFlagsHLTPayload))) return NULL;
 
   // continue if there is no data left in the buffer
-  if (offset>=size) {
+  if (offset>=pHLTHeader->fLength) {
     HLTWarning("no HLT payload available, but bit is set, skipping ...");
     return NULL;
   }
@@ -190,7 +191,7 @@ AliHLTHOMERReader* AliHLTOUTHomerCollection::OpenReader(UChar_t* pSrc, unsigned
     return NULL;
   }
 
-  return fpManager->OpenReaderBuffer(pSrc+offset, size-offset);
+  return fpManager->OpenReaderBuffer(pSrc+offset, pHLTHeader->fLength-offset);
 }
 
 int AliHLTOUTHomerCollection::WriteESD(const AliHLTUInt8_t* pBuffer, AliHLTUInt32_t size, AliHLTComponentDataType dt, AliESDEvent* tgtesd) const
index 4cc2472..0d67410 100644 (file)
@@ -377,9 +377,16 @@ int AliHLTOUTComponent::FillOutputBuffer(int eventNo, AliHLTMonitoringWriter* pW
   // space for payload from the writer
   if (pWriter) bufferSize+=pWriter->GetTotalMemorySize();
 
+  // payload data must be aligned to 32bit
+  bufferSize=(bufferSize+3)/4;
+  bufferSize*=4;
+
   if (bufferSize>fBuffer.size())
     fBuffer.resize(bufferSize);
 
+  // reset the last 32bit word, rest will be overwritten
+  memset(&fBuffer[bufferSize-4], 0, 4);
+
   if (bufferSize<=fBuffer.size()) {
     AliRawDataHeader* pCDH=reinterpret_cast<AliRawDataHeader*>(&fBuffer[0]);
     AliHLTOUT::AliHLTOUTEventHeader* pHLTH=reinterpret_cast<AliHLTOUT::AliHLTOUTEventHeader*>(&fBuffer[sizeof(AliRawDataHeader)]);