+ // consistency check for data reference
+ if (outputBlocks[oblock].fPtr!=NULL && outputBlocks[oblock].fPtr!=pTgtBuffer &&
+ outputBlocks[oblock].fOffset!=0) {
+ HLTWarning("output block %s 0x%08x has inconsistent data reference ptr=%p offset=0x%08x: "
+ "for new blocks use offset only, forwarded blocks have fPtr set only",
+ AliHLTComponent::DataType2Text(outputBlocks[oblock].fDataType).c_str(),
+ outputBlocks[oblock].fSpecification,
+ outputBlocks[oblock].fPtr, outputBlocks[oblock].fOffset);
+ }
+
+ // check for duplicates in the output
+ // this check applies for forwarded data blocks where
+ // the ptr is not inside the target buffer
+ AliHLTUInt32_t checkblock=0;
+ for (; checkblock<oblock; checkblock++) {
+ if (outputBlocks[oblock].fPtr!=NULL && outputBlocks[oblock].fPtr!=pTgtBuffer &&
+ outputBlocks[checkblock].fPtr==outputBlocks[oblock].fPtr) {
+ if (outputBlocks[checkblock].fSize!=outputBlocks[oblock].fSize ||
+ outputBlocks[checkblock].fDataType!=outputBlocks[oblock].fDataType) {
+ HLTWarning("output blocks %d (%s 0x%08x) and %d (%s 0x%08x) have identical data references ptr=%p "
+ "but differ in data type and/or size: %d vs. %d, ignoring block %d",
+ oblock,
+ AliHLTComponent::DataType2Text(outputBlocks[oblock].fDataType).c_str(),
+ outputBlocks[oblock].fSpecification,
+ checkblock,
+ AliHLTComponent::DataType2Text(outputBlocks[checkblock].fDataType).c_str(),
+ outputBlocks[checkblock].fSpecification,
+ outputBlocks[oblock].fPtr,
+ outputBlocks[oblock].fSize,
+ outputBlocks[checkblock].fSize,
+ checkblock);
+ }
+ // ignore from the second copy
+ break;
+ }
+ }
+ if (checkblock<oblock) continue;
+
+ // search for the forwarded data blocks
+ // new data blocks are announced to the data buffer, forwarded data blocks
+ // to the publisher task. The publisher task of a forwarded data block is
+ // removed from the list in order to keep the buffer open. It will be releases
+ // when the subscribing task releases it
+ iblock=0;
+ for (; iblock<fBlockDataArray.size(); iblock++) {
+ if (outputBlocks[oblock].fDataType==kAliHLTDataTypeEvent) {
+ // the event type data block is an artificial data block
+ // ignore if it was forwarded
+ break;
+ }