#include "AliHLTDataBuffer.h"
#include "AliHLTConsumerDescriptor.h"
#include "AliHLTComponent.h"
#include "AliHLTTask.h"
#include <cerrno>
#include <cassert>
using std::cout;
ClassImp(AliHLTDataBuffer)
AliHLTDataBuffer::AliHLTDataBuffer()
:
fSegments(),
fConsumers(),
fActiveConsumers(),
fReleasedConsumers(),
fpBuffer(NULL),
fFlags(0),
fForwardedSegmentSources(),
fForwardedSegments()
{
fSegments.empty();
fConsumers.empty();
fActiveConsumers.empty();
fReleasedConsumers.empty();
fgNofInstances++;
}
int AliHLTDataBuffer::fgNofInstances=0;
AliHLTDataBuffer::AliHLTRawBufferPList AliHLTDataBuffer::fgFreeBuffers;
AliHLTDataBuffer::AliHLTRawBufferPList AliHLTDataBuffer::fgActiveBuffers;
AliHLTUInt32_t AliHLTDataBuffer::fgMargin=1024;
AliHLTLogging AliHLTDataBuffer::fgLogging;
const Int_t AliHLTDataBuffer::fgkSafetyPatternSize=16;
const char AliHLTDataBuffer::fgkSafetyPattern[]={0x28, 0x63, 0x29, 0x4d, 0x52, 0x49, 0x43, 0x48, 0x54, 0x45, 0x52, 0x20, 0x32, 0x30, 0x30, 0x37};
AliHLTUInt32_t AliHLTDataBuffer::fgEventCount=0;
AliHLTDataBuffer::~AliHLTDataBuffer()
{
CleanupConsumerList();
if (--fgNofInstances<=0) {
DeleteRawBuffers();
}
}
int AliHLTDataBuffer::SetConsumer(AliHLTComponent* pConsumer)
{
int iResult=0;
if (pConsumer) {
if (FindConsumer(pConsumer)) {
HLTWarning("consumer %s (%p) already set to data buffer %p", pConsumer->GetComponentID(), pConsumer, this);
}
AliHLTConsumerDescriptor* pDesc=new AliHLTConsumerDescriptor(pConsumer);
if (pDesc) {
fConsumers.push_back(pDesc);
HLTDebug("set consumer %s (%p) to data buffer %p", pConsumer->GetComponentID(), pConsumer, this);
} else {
HLTError("memory allocation failed");
iResult=-ENOMEM;
}
} else {
HLTError("invalid parameter: consumer component (nil)");
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::FindMatchingDataBlocks(const AliHLTComponent* pConsumer, AliHLTComponentDataTypeList* tgtList)
{
int iResult=0;
if (pConsumer) {
AliHLTDataSegmentList segments;
if ((iResult=FindMatchingDataSegments(pConsumer, segments))>=0) {
if (tgtList) {
AliHLTDataSegmentList::iterator segment=segments.begin();
while (segment!=segments.end()) {
tgtList->push_back((*segment).fDataType);
segment++;
}
}
iResult=segments.size();
}
} else {
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::FindMatchingDataSegments(const AliHLTComponent* ,
AliHLTDataSegmentList& tgtList)
{
int iResult=0;
tgtList.assign(fSegments.begin(), fSegments.end());
tgtList.insert(tgtList.begin(), fForwardedSegments.begin(), fForwardedSegments.end());
iResult=tgtList.size();
return iResult;
}
int AliHLTDataBuffer::Subscribe(const AliHLTComponent* pConsumer, AliHLTComponentBlockDataList& blockDescList)
{
int iResult=0;
if (pConsumer) {
if (1) {
AliHLTConsumerDescriptor* pDesc=FindConsumer(pConsumer, fConsumers);
if (pDesc) {
AliHLTDataSegmentList tgtList;
if ((iResult=FindMatchingDataSegments(pConsumer, tgtList))>=0) {
AliHLTDataSegmentList::iterator segment=tgtList.begin();
while (segment!=tgtList.end()) {
AliHLTComponentBlockData bd;
AliHLTComponent::FillBlockData(bd);
bd.fOffset=0;
AliHLTUInt8_t* pTgt=*segment;
bd.fPtr=reinterpret_cast<void*>(pTgt);
bd.fSize=(*segment).fSegmentSize;
bd.fDataType=(*segment).fDataType;
bd.fSpecification=(*segment).fSpecification;
blockDescList.push_back(bd);
pDesc->SetActiveDataSegment(*segment);
HLTDebug("component %p (%s) subscribed to segment offset %d size %d data type %s %#x",
pConsumer, ((AliHLTComponent*)pConsumer)->GetComponentID(), bd.fOffset,
bd.fSize, (AliHLTComponent::DataType2Text(bd.fDataType)).c_str(),
bd.fSpecification);
segment++;
}
if (tgtList.size()==0) {
ChangeConsumerState(pDesc, fConsumers, fReleasedConsumers);
HLTDebug("no input data for component %p (%s) available", pConsumer, ((AliHLTComponent*)pConsumer)->GetComponentID());
} else if (ChangeConsumerState(pDesc, fConsumers, fActiveConsumers)>=0) {
HLTDebug("component %p (%s) subscribed to data buffer %p", pConsumer, ((AliHLTComponent*)pConsumer)->GetComponentID(), this);
} else {
segment=tgtList.begin();
while (segment!=tgtList.end()) {
blockDescList.pop_back();
segment++;
}
HLTError("can not activate consumer %p for data buffer %p", pConsumer, this);
iResult=-EACCES;
}
} else {
HLTError("unresolved data segment(s) for component %p (%s)", pConsumer, ((AliHLTComponent*)pConsumer)->GetComponentID());
iResult=-EBADF;
}
} else {
if (!FindConsumer(pConsumer)) {
HLTError("component %p is not a data consumer of data buffer %p", pConsumer, this);
} else {
HLTError("component %p is a valid data consumer of data buffer %p, but did not release it's buffer subscription", pConsumer, this);
}
iResult=-ENOENT;
}
} else {
}
} else {
HLTError("invalid parameter");
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::Release(AliHLTComponentBlockData* pBlockDesc,
const AliHLTComponent* pConsumer,
const AliHLTTask* pOwnerTask)
{
int iResult=0;
if (pBlockDesc && pConsumer) {
AliHLTConsumerDescriptor* pDesc=FindConsumer(pConsumer, fActiveConsumers);
if (pDesc) {
if ((iResult=pDesc->CheckActiveDataSegment(AliHLTDataSegment(pBlockDesc->fPtr, pBlockDesc->fOffset, pBlockDesc->fSize)))!=1) {
HLTWarning("data segment mismatch, component %p has not subscribed to a segment with offset %#x and size %d", pConsumer, pBlockDesc->fOffset, pBlockDesc->fSize);
iResult=0;
} else {
pDesc->ReleaseActiveDataSegment(AliHLTDataSegment(pBlockDesc->fPtr, pBlockDesc->fOffset, pBlockDesc->fSize));
}
if (GetNofPendingConsumers()==0 && fForwardedSegments.size()>0) {
ReleaseForwardedBlock(pBlockDesc, pOwnerTask);
}
pBlockDesc->fOffset=0;
pBlockDesc->fPtr=NULL;
pBlockDesc->fSize=0;
if (pDesc->GetNofActiveSegments()==0) {
if ((iResult=ChangeConsumerState(pDesc, fActiveConsumers, fReleasedConsumers))>=0) {
if (GetNofActiveConsumers()==0 && GetNofPendingConsumers()==0) {
ResetDataBuffer();
}
} else {
HLTError("can not deactivate consumer %p for data buffer %p", pConsumer, this);
iResult=-EACCES;
}
}
} else {
HLTWarning("component %p has currently not subscribed to the data buffer %p", pConsumer, this);
iResult=-ENOENT;
}
} else {
HLTError("inavalid parameter: pBlockDesc=%p pConsumer=%p", pBlockDesc, pConsumer);
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::ReleaseForwardedBlock(AliHLTComponentBlockData* pBlockDesc,
const AliHLTTask* pOwnerTask)
{
int iResult=0;
if (pBlockDesc && pOwnerTask) {
assert(fForwardedSegments.size()==fForwardedSegmentSources.size());
AliHLTDataSegmentList::iterator segment=fForwardedSegments.begin();
AliHLTTaskPList::iterator src=fForwardedSegmentSources.begin();
for (; segment!=fForwardedSegments.end(); segment++, src++) {
if ((*segment)==AliHLTDataSegment(pBlockDesc->fPtr, pBlockDesc->fOffset, pBlockDesc->fSize)) {
assert((*src)!=NULL);
if ((*src)!=NULL) {
if ((*src)->Release(pBlockDesc, pOwnerTask)>=0) {
HLTDebug("task %s (%p) released forwarded segment %p size %d of task %s (%p)",
pOwnerTask->GetName(), pOwnerTask, (*segment).GetPtr(), (*segment).GetSize(),
(*src)->GetName(), *src);
} else {
HLTError("task %s (%p) failed releasing forwarded segment %p size %d of task %s (%p)",
pOwnerTask->GetName(), pOwnerTask, (*segment).GetPtr(), (*segment).GetSize(),
(*src)->GetName(), *src);
}
}
fForwardedSegments.erase(segment);
fForwardedSegmentSources.erase(src);
break;
}
}
} else {
HLTError("inavalid parameter: pBlockDesc=%p pOwnerTask=%p", pBlockDesc, pOwnerTask);
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::Forward(AliHLTTask* pSrcTask, AliHLTComponentBlockData* pBlockDesc)
{
if (pSrcTask==NULL || pBlockDesc==NULL) return -EINVAL;
assert(fForwardedSegments.size()==fForwardedSegmentSources.size());
if (fForwardedSegments.size()!=fForwardedSegmentSources.size()) return -EFAULT;
fForwardedSegmentSources.push_back(pSrcTask);
fForwardedSegments.push_back(AliHLTDataSegment(pBlockDesc->fPtr, pBlockDesc->fOffset, pBlockDesc->fSize, pBlockDesc->fDataType, pBlockDesc->fSpecification));
return 0;
}
AliHLTUInt8_t* AliHLTDataBuffer::GetTargetBuffer(int iMinSize)
{
AliHLTUInt8_t* pTargetBuffer=NULL;
if (fpBuffer!=NULL) {
HLTWarning("data buffer not properly reset, possible memory leak\n");
}
fpBuffer=CreateRawBuffer(iMinSize);
if (fpBuffer) {
pTargetBuffer=*fpBuffer;
} else {
HLTError("can not create raw buffer");
}
return pTargetBuffer;
}
int AliHLTDataBuffer::SetSegments(AliHLTUInt8_t* pTgt, AliHLTComponentBlockData* arrayBlockData, int iSize)
{
int iResult=0;
if (pTgt && arrayBlockData && iSize>=0) {
if (fpBuffer) {
if (*fpBuffer==pTgt) {
AliHLTDataBuffer::AliHLTDataSegment segment;
AliHLTUInt32_t maxSize=0;
for (int i=0; i<iSize; i++) {
if (arrayBlockData[i].fPtr==NULL ||
arrayBlockData[i].fPtr==*fpBuffer) {
arrayBlockData[i].fPtr=*fpBuffer;
if ((arrayBlockData[i].fOffset+arrayBlockData[i].fSize<=fpBuffer->GetUsedSize()) ||
((arrayBlockData[i].fOffset==~(AliHLTUInt32_t)0) && arrayBlockData[i].fSize==0)) {
segment.fSegmentOffset=arrayBlockData[i].fOffset;
segment.fPtr=(AliHLTUInt8_t*)arrayBlockData[i].fPtr;
segment.fSegmentSize=arrayBlockData[i].fSize;
segment.fDataType=arrayBlockData[i].fDataType;
segment.fSpecification=arrayBlockData[i].fSpecification;
fSegments.push_back(segment);
HLTDebug("set segment %s with size %d at offset %d", AliHLTComponent::DataType2Text(segment.fDataType).data(), segment.fSegmentSize, segment.fSegmentOffset);
if ((arrayBlockData[i].fOffset!=~(AliHLTUInt32_t)0) &&
arrayBlockData[i].fOffset+arrayBlockData[i].fSize>maxSize) {
maxSize=arrayBlockData[i].fOffset+arrayBlockData[i].fSize;
}
} else {
HLTError("block data specification %#d (%s) exceeds size of data buffer", i, AliHLTComponent::DataType2Text(arrayBlockData[i].fDataType).data());
HLTError("block offset=%d, block size=%d, buffer size=%d", arrayBlockData[i].fOffset, arrayBlockData[i].fSize, fpBuffer->GetUsedSize());
iResult=-E2BIG;
}
} else {
HLTError("invalid pointer (%p) in block data specification (buffer %p size %d)."
"please note: for output blocks only the fOffset value is valid and must "
"be relative to the output buffer", arrayBlockData[i].fPtr, fpBuffer->GetPointer(), fpBuffer->GetUsedSize());
iResult=-ERANGE;
}
}
iResult=SetRawBufferDataSize(fpBuffer, maxSize);
} else {
HLTError("this data buffer (%p) does not match the internal data buffer %p of raw buffer %p", pTgt, fpBuffer->GetPointer(), fpBuffer);
iResult=-EINVAL;
}
} else {
HLTFatal("internal data structur mismatch");
iResult=-EFAULT;
}
} else {
HLTError("invalid parameter: pTgtBuffer=%p arrayBlockData=%p", pTgt, arrayBlockData);
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::IsEmpty()
{
int iResult=(fpBuffer==NULL && fForwardedSegments.size()==0) || GetNofSegments()==0;
return iResult;
}
int AliHLTDataBuffer::GetNofSegments() const
{
int iResult=fSegments.size() + fForwardedSegments.size();
return iResult;
}
int AliHLTDataBuffer::GetNofConsumers() const
{
int iResult=fConsumers.size() + GetNofActiveConsumers() + fReleasedConsumers.size();
return iResult;
}
int AliHLTDataBuffer::GetNofPendingConsumers() const
{
int iResult=fConsumers.size();
return iResult;
}
int AliHLTDataBuffer::GetNofActiveConsumers() const
{
int iResult=fActiveConsumers.size();
return iResult;
}
AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::CreateRawBuffer(AliHLTUInt32_t size)
{
AliHLTRawBuffer* pRawBuffer=NULL;
unsigned int reqSize=size+fgkSafetyPatternSize;
pRawBuffer=AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc(reqSize);
if (pRawBuffer) {
pRawBuffer->UseBuffer(size);
}
if (pRawBuffer!=NULL && fgkSafetyPatternSize>0) {
pRawBuffer->WritePattern(fgkSafetyPattern, fgkSafetyPatternSize);
}
return pRawBuffer;
}
int AliHLTDataBuffer::SetRawBufferDataSize(AliHLTRawBuffer* pBuffer, AliHLTUInt32_t size) const
{
int iResult=0;
if (!pBuffer) return -EINVAL;
if (size>pBuffer->GetUsedSize()) {
HLTError("indicated data size %d exceeds data buffer %p (%d)", size, pBuffer->GetPointer(), pBuffer->GetUsedSize());
return -ENOSPC;
}
if (fgkSafetyPatternSize>0) {
if (pBuffer->CheckPattern(fgkSafetyPattern, fgkSafetyPatternSize)) {
HLTError("potential memory corruption: component has written beyond end of data buffer %p size %d", pBuffer->GetPointer(), pBuffer->GetUsedSize());
}
}
AliHLTDataBuffer::AliHLTRawPage* rawpage=AliHLTDataBuffer::AliHLTRawPage::FindPage(pBuffer);
if (rawpage) {
pBuffer->UseBuffer(size);
if (rawpage->SetSize(pBuffer, size+fgkSafetyPatternSize)==0) {
} else {
fgLogging.Logging(kHLTLogError, "AliHLTDataBuffer::SetRawBufferDataSize", "data buffer handling", "failed to set size for raw buffer %p", pBuffer);
iResult=-EFAULT;
}
} else {
fgLogging.Logging(kHLTLogError, "AliHLTDataBuffer::SetRawBufferDataSize", "data buffer handling", "can not find raw page for buffer %p", pBuffer);
iResult=-ENOENT;
}
if (fgkSafetyPatternSize>0) {
pBuffer->WritePattern(fgkSafetyPattern, fgkSafetyPatternSize);
}
return iResult;
}
int AliHLTDataBuffer::ReleaseRawBuffer(AliHLTRawBuffer* pBuffer)
{
int iResult=0;
if (pBuffer) {
AliHLTDataBuffer::AliHLTRawPage* rawpage=AliHLTDataBuffer::AliHLTRawPage::FindPage(pBuffer);
if (rawpage)
{
if (fgkSafetyPatternSize>0) {
if ((pBuffer)->CheckPattern(fgkSafetyPattern, fgkSafetyPatternSize)) {
fgLogging.Logging(kHLTLogFatal, "AliHLTDataBuffer::ReleaseRawBuffer", "data buffer handling", "component has written beyond end of data buffer %p size %d", pBuffer->GetPointer(), pBuffer->GetUsedSize());
}
}
pBuffer->Reset();
if (rawpage->Free(pBuffer)==0) {
} else {
fgLogging.Logging(kHLTLogError, "AliHLTDataBuffer::ReleaseRawBuffer", "data buffer handling", "failed to release raw buffer %p", pBuffer);
}
} else {
fgLogging.Logging(kHLTLogError, "AliHLTDataBuffer::ReleaseRawBuffer", "data buffer handling", "can not find raw page for buffer %p", pBuffer);
iResult=-ENOENT;
}
} else {
fgLogging.Logging(kHLTLogError, "AliHLTDataBuffer::ReleaseRawBuffer", "data buffer handling", "invalid parameter");
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::DeleteRawBuffers()
{
int iResult=0;
#ifdef ALIHLTSYSTEM_PROFILING
int iTotalSize=0;
int iCount=fgFreeBuffers.size()+fgActiveBuffers.size();
#endif //ALIHLTSYSTEM_PROFILING
AliHLTRawBufferPList::iterator buffer;;
while ((buffer=fgFreeBuffers.begin())!=fgFreeBuffers.end()) {
#ifdef ALIHLTSYSTEM_PROFILING
iTotalSize+=(*buffer)->GetTotalSize();
#endif //ALIHLTSYSTEM_PROFILING
delete *buffer;
fgFreeBuffers.erase(buffer);
}
while ((buffer=fgActiveBuffers.begin())!=fgActiveBuffers.end()) {
#ifdef ALIHLTSYSTEM_PROFILING
iTotalSize+=(*buffer)->GetTotalSize();
#endif //ALIHLTSYSTEM_PROFILING
fgLogging.Logging(kHLTLogWarning, "AliHLTDataBuffer::DeleteRawBuffer", "data buffer handling", "request to delete active raw buffer container (raw buffer %p, size %d)", (*buffer)->GetPointer(), (*buffer)->GetTotalSize());
delete *buffer;
fgActiveBuffers.erase(buffer);
}
#ifdef ALIHLTSYSTEM_PROFILING
fgLogging.Logging(kHLTLogImportant, "AliHLTDataBuffer::DeleteRawBuffer", "data buffer handling", "Total memory allocation: %d byte in %d buffers", iTotalSize, iCount);
#endif //ALIHLTSYSTEM_PROFILING
return iResult;
}
int AliHLTDataBuffer::PrintStatistics()
{
int iResult=0;
int nofPages=0;
AliHLTUInt32_t totalSize=0;
for (AliHLTDataBuffer::AliHLTRawPage* rawpage=AliHLTDataBuffer::AliHLTRawPage::NextPage(NULL);
rawpage!=NULL;
rawpage=AliHLTDataBuffer::AliHLTRawPage::NextPage(rawpage)) {
nofPages++;
totalSize+=rawpage->Size();
if (fgLogging.CheckFilter(kHLTLogDebug)) rawpage->Print("");
}
fgLogging.Logging(kHLTLogInfo, "AliHLTDataBuffer::PrintStatistics", "data buffer handling", "total number of memory pages: %d total size %d", nofPages, totalSize);
return iResult;
}
AliHLTConsumerDescriptor* AliHLTDataBuffer::FindConsumer(const AliHLTComponent* pConsumer, AliHLTConsumerDescriptorPList &list) const
{
AliHLTConsumerDescriptor* pDesc=NULL;
AliHLTConsumerDescriptorPList::iterator desc=list.begin();
while (desc!=list.end() && pDesc==NULL) {
if ((pConsumer==NULL || (*desc)->GetComponent()==pConsumer)) {
pDesc=*desc;
}
desc++;
}
return pDesc;
}
int AliHLTDataBuffer::ResetDataBuffer()
{
int iResult=0;
AliHLTRawBuffer* pBuffer=fpBuffer;
fpBuffer=NULL;
assert(fForwardedSegments.size()==0);
fForwardedSegments.clear();
fForwardedSegmentSources.clear();
AliHLTConsumerDescriptorPList::iterator desc;
desc=fReleasedConsumers.begin();
while (desc!=fReleasedConsumers.end()) {
AliHLTConsumerDescriptor* pDesc=*desc;
fReleasedConsumers.erase(desc);
desc=fReleasedConsumers.begin();
fConsumers.push_back(pDesc);
}
desc=fActiveConsumers.begin();
while (desc!=fActiveConsumers.end()) {
AliHLTConsumerDescriptor* pDesc=*desc;
HLTWarning("consumer %p (%s) was not released", pDesc, pDesc->GetComponent()?pDesc->GetComponent()->GetComponentID():"### invalid component ###");
fActiveConsumers.erase(desc);
desc=fActiveConsumers.begin();
fConsumers.push_back(pDesc);
}
AliHLTDataSegmentList::iterator segment=fSegments.begin();
while (segment!=fSegments.end()) {
fSegments.erase(segment);
segment=fSegments.begin();
}
if (pBuffer) {
ReleaseRawBuffer(pBuffer);
}
return iResult;
}
int AliHLTDataBuffer::Reset()
{
return ResetDataBuffer();
}
int AliHLTDataBuffer::ChangeConsumerState(AliHLTConsumerDescriptor* pDesc, AliHLTConsumerDescriptorPList &srcList, AliHLTConsumerDescriptorPList &tgtList)
{
int iResult=-ENOENT;
if (pDesc) {
AliHLTConsumerDescriptorPList::iterator desc=srcList.begin();
while (desc!=srcList.end()) {
if ((*desc)==pDesc) {
srcList.erase(desc);
tgtList.push_back(pDesc);
iResult=0;
break;
}
desc++;
}
if (iResult<0) {
HLTError("can not find consumer descriptor %p in list", pDesc);
}
} else {
HLTError("invalid parameter");
iResult=-EINVAL;
}
return iResult;
}
int AliHLTDataBuffer::CleanupConsumerList()
{
int iResult=0;
ResetDataBuffer();
AliHLTConsumerDescriptorPList::iterator desc=fConsumers.begin();
while (desc!=fConsumers.end()) {
delete *desc;
fConsumers.erase(desc);
desc=fConsumers.begin();
}
return iResult;
}
int AliHLTDataBuffer::FindConsumer(const AliHLTComponent* pConsumer, int bAllLists)
{
AliHLTConsumerDescriptorPList::iterator desc=fConsumers.begin();
while (desc!=fConsumers.end()) {
if ((*desc)->GetComponent()==pConsumer)
return 1;
desc++;
}
if (bAllLists==0) return 0;
desc=fActiveConsumers.begin();
while (desc!=fActiveConsumers.end()) {
if ((*desc)->GetComponent()==pConsumer)
return 1;
desc++;
}
desc=fReleasedConsumers.begin();
while (desc!=fReleasedConsumers.end()) {
if ((*desc)->GetComponent()==pConsumer)
return 1;
desc++;
}
return 0;
}
AliHLTDataBuffer::AliHLTRawBuffer::AliHLTRawBuffer(AliHLTUInt32_t size)
: fSize(0)
, fTotalSize(size)
, fExternalPtr(NULL)
, fPtr(static_cast<AliHLTUInt8_t*>(malloc(size)))
, fLastEventCount(0)
{
if (fPtr==NULL) {
fSize=0;
fTotalSize=0;
}
}
AliHLTDataBuffer::AliHLTRawBuffer::AliHLTRawBuffer(AliHLTUInt32_t size, AliHLTUInt8_t* buffer)
: fSize(0)
, fTotalSize(size)
, fExternalPtr(buffer)
, fPtr(fExternalPtr)
, fLastEventCount(0)
{
}
AliHLTDataBuffer::AliHLTRawBuffer::~AliHLTRawBuffer()
{
if (fExternalPtr==NULL && fPtr) {
free(fPtr);
}
fPtr=NULL;
fSize=0;
fTotalSize=0;
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator==(void* ptr) const
{
return fPtr == static_cast<AliHLTUInt8_t*>(ptr);
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator<(void* ptr) const
{
int iResult=fPtr < static_cast<AliHLTUInt8_t*>(ptr);
return iResult;
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator<=(void* ptr) const
{
int iResult=fPtr <= static_cast<AliHLTUInt8_t*>(ptr);
return iResult;
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator>(void* ptr) const
{
int iResult=fPtr+fSize > static_cast<AliHLTUInt8_t*>(ptr);
return iResult;
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator-(void* ptr) const
{
return static_cast<int>(static_cast<AliHLTUInt8_t*>(ptr)-fPtr);
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator<(const AliHLTRawBuffer& op) const
{
return (fPtr+fSize < op.fPtr);
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator<=(const AliHLTRawBuffer& op) const
{
return (fPtr+fSize <= op.fPtr);
}
int AliHLTDataBuffer::AliHLTRawBuffer::operator>(const AliHLTRawBuffer& op) const
{
return (fPtr >= op.fPtr+op.fSize);
}
AliHLTUInt8_t* AliHLTDataBuffer::AliHLTRawBuffer::UseBuffer(AliHLTUInt32_t size)
{
if (fTotalSize>=size) {
fSize=size;
fLastEventCount=AliHLTDataBuffer::fgEventCount;
if (size>0) return fPtr;
}
return NULL;
}
AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::AliHLTRawBuffer::Split(AliHLTUInt32_t size)
{
if (fTotalSize>size &&
(fSize==0 || fSize<=size) &&
fExternalPtr!=NULL) {
AliHLTRawBuffer* part2=new AliHLTRawBuffer(fTotalSize-size, fPtr+size);
if (part2) {
fTotalSize=size;
}
return part2;
}
return NULL;
}
int AliHLTDataBuffer::AliHLTRawBuffer::CheckSize(AliHLTUInt32_t size) const
{
if (fTotalSize<size) return 0;
unsigned adjust=0;
if (fLastEventCount+1<AliHLTDataBuffer::fgEventCount) {
adjust=AliHLTDataBuffer::fgEventCount-fLastEventCount;
}
return (adjust>2) || ((fTotalSize-size)<(fgMargin<<adjust));
}
int AliHLTDataBuffer::AliHLTRawBuffer::Reset()
{
fSize=0;
return 0;
}
int AliHLTDataBuffer::AliHLTRawBuffer::WritePattern(const char* pattern, int size)
{
int iResult=0;
if (pattern!=NULL && size>0) {
if (fSize+size<=fTotalSize) {
memcpy(((char*)fPtr)+fSize, pattern, size);
iResult=size;
} else {
iResult=-ENOSPC;
}
}
return iResult;
}
int AliHLTDataBuffer::AliHLTRawBuffer::CheckPattern(const char* pattern, int size) const
{
int iResult=0;
if (pattern!=NULL && size>0) {
if (fSize+size<=fTotalSize) {
iResult=memcmp(((char*)fPtr)+fSize, pattern, size)!=0;
} else {
iResult=-ENOSPC;
}
}
return iResult;
}
int AliHLTDataBuffer::AliHLTRawBuffer::Merge(const AliHLTDataBuffer::AliHLTRawBuffer& neighbor)
{
if (!fExternalPtr || !neighbor.fExternalPtr) return -EPERM;
if (neighbor.fTotalSize==0 &&
fPtr < neighbor.fPtr &&
fPtr+fTotalSize > neighbor.fPtr) {
return 0;
}
if (fTotalSize==0 &&
neighbor.fPtr < fPtr &&
neighbor.fPtr+neighbor.fTotalSize > fPtr) {
fPtr=neighbor.fPtr;
fExternalPtr=fPtr;
fTotalSize+=neighbor.fTotalSize;
fSize=0;
return 0;
}
if (fPtr+fTotalSize == neighbor.fPtr) {
fTotalSize+=neighbor.fTotalSize;
fSize=0;
return 0;
}
if (fPtr == neighbor.fPtr+neighbor.fTotalSize) {
fPtr=neighbor.fPtr;
fExternalPtr=fPtr;
fTotalSize+=neighbor.fTotalSize;
fSize=0;
return 0;
}
return -EINVAL;
}
void AliHLTDataBuffer::AliHLTRawBuffer::Print(const char* option) const
{
if (strcmp(option, "min")!=0) {
cout << "************* AliHLTRawBuffer status ***********" << endl;
}
printf(" %p: buffer %p%s size %d used %d\n", this, fPtr, fExternalPtr?" (external)":"", fTotalSize, fSize); fflush(stdout);
}
AliHLTDataBuffer::AliHLTRawPage::AliHLTRawPage(AliHLTUInt32_t pagesize)
: fSize(pagesize)
, fPtr(static_cast<AliHLTUInt8_t*>(malloc(pagesize)))
, fFreeBuffers()
, fUsedBuffers()
{
if (fPtr) {
fFreeBuffers.push_back(new AliHLTRawBuffer(fSize, fPtr));
} else {
fSize=0;
}
}
AliHLTDataBuffer::AliHLTRawPage::~AliHLTRawPage()
{
if (IsUsed()) {
HLTError("memory mismatch: not all allocated intances have been released");
} else {
if (IsFragmented()) {
HLTWarning("page still fragmented");
}
AliHLTRawBufferPList::iterator element=fFreeBuffers.begin();
while (element!=fFreeBuffers.end()) {
if (*element) delete *element;
element=fFreeBuffers.erase(element);
}
if (fPtr) {
free(fPtr);
}
fPtr=NULL;
fSize=0;
}
}
AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::AliHLTRawPage::Alloc(AliHLTUInt32_t size)
{
if (fFreeBuffers.size()==0) return NULL;
for (AliHLTRawBufferPList::iterator iter=fFreeBuffers.begin();
iter!=fFreeBuffers.end();
iter++) {
if ((*iter)->GetTotalSize()==size) {
AliHLTRawBuffer* thisbuffer=*iter;
fFreeBuffers.erase(iter);
fUsedBuffers.push_back(thisbuffer);
return thisbuffer;
} else if ((*iter)->GetTotalSize()>size) {
AliHLTRawBuffer* thisbuffer=*iter;
AliHLTRawBuffer* newbuffer=thisbuffer->Split(size);
if (newbuffer) {
*iter=newbuffer;
fUsedBuffers.push_back(thisbuffer);
return thisbuffer;
} else {
HLTWarning("failed to alloc raw buffer: cannot split raw buffer %p of size %d (used %d) at size %d", *iter, (*iter)->GetTotalSize(), (*iter)->GetUsedSize(), size);
}
}
}
return NULL;
}
int AliHLTDataBuffer::AliHLTRawPage::Free(AliHLTRawBuffer* pBuffer)
{
int iResult=0;
for (AliHLTRawBufferPList::iterator iter=fUsedBuffers.begin();
iter!=fUsedBuffers.end() && iResult>=0;
iter++) {
if ((*iter)==pBuffer) {
fUsedBuffers.erase(iter);
AliHLTRawBufferPList::iterator prev=fFreeBuffers.begin();
for (; prev!=fFreeBuffers.end() && iResult>=0; prev++) {
if ((*pBuffer)<(*(*prev)) ||
((*prev)->GetTotalSize()==0 && pBuffer->GetPointer()<=(*prev)->GetPointer() && (*prev)->GetPointer()<=pBuffer->GetPointer()+pBuffer->GetTotalSize())) {
if ((*(*prev)) == (pBuffer->GetPointer()+pBuffer->GetTotalSize()) ||
((*prev)->GetTotalSize()==0 && pBuffer->GetPointer()<=(*prev)->GetPointer() && (*prev)->GetPointer()<=pBuffer->GetPointer()+pBuffer->GetTotalSize())) {
if ((iResult=pBuffer->Merge(*(*prev)))>=0) {
delete *prev;
*prev=pBuffer;
} else {
HLTError("failed to merge consecutive/overlapping buffers %p and %p", pBuffer, (*prev));
pBuffer->Print("");
(*prev)->Print("");
}
break;
}
fFreeBuffers.insert(prev, pBuffer);
break;
}
if ((*pBuffer)>(*(*prev)) ||
(pBuffer->GetTotalSize()==0 && (*prev)->GetPointer()<=pBuffer->GetPointer() && pBuffer->GetPointer()<=(*prev)->GetPointer()+(*prev)->GetTotalSize())) {
if ((*pBuffer) == ((*prev)->GetPointer()+(*prev)->GetTotalSize())||
(pBuffer->GetTotalSize()==0 && (*prev)->GetPointer()<=pBuffer->GetPointer() && pBuffer->GetPointer()<=(*prev)->GetPointer()+(*prev)->GetTotalSize())) {
if ((iResult=pBuffer->Merge(*(*prev)))>=0) {
AliHLTRawBufferPList::iterator succ=prev+1;
delete *prev;
*prev=pBuffer;
if (succ!=fFreeBuffers.end() &&
(*(*succ)) == (pBuffer->GetPointer()+pBuffer->GetTotalSize())) {
if ((iResult=pBuffer->Merge(*(*succ)))>=0) {
delete *succ;
fFreeBuffers.erase(succ);
}
}
}
break;
}
}
}
if (prev==fFreeBuffers.end()) {
fFreeBuffers.push_back(pBuffer);
}
prev=fFreeBuffers.begin();
for (AliHLTRawBufferPList::iterator current=prev+1; current!=fFreeBuffers.end() && iResult>=0; ) {
if ((*current)->GetTotalSize()==0 && (*prev)->GetPointer()<=(*current)->GetPointer() && (*current)->GetPointer()<(*prev)->GetPointer()+(*prev)->GetTotalSize()) {
if ((iResult=(*prev)->Merge(*(*current)))>=0) {
current=fFreeBuffers.erase(current);
continue;
} else {
HLTError("failed to merge embedded zero length buffer into preceeding buffer");
Print("");
}
}
if ((*(*current)) == ((*prev)->GetPointer()+(*prev)->GetTotalSize())) {
if ((iResult=(*prev)->Merge(*(*current)))>=0) {
current=fFreeBuffers.erase(current);
continue;
} else {
HLTError("failed to merge consecutive free buffers");
Print("");
}
}
prev=current++;
}
return 0;
}
}
return 1;
}
int AliHLTDataBuffer::AliHLTRawPage::SetSize(const AliHLTDataBuffer::AliHLTRawBuffer* pBuffer, AliHLTUInt32_t size)
{
int iResult=0;
for (AliHLTRawBufferPList::iterator iter=fUsedBuffers.begin();
iter!=fUsedBuffers.end() && iResult>=0;
iter++) {
if ((*iter)==pBuffer) {
if ((*iter)->GetTotalSize()==size) return 0;
if ((*iter)->GetTotalSize()<size) {
HLTError("%d exceeds total size of buffer %p (%d used %d)\n", size, *iter, (*iter)->GetTotalSize(), (*iter)->GetUsedSize());
return -ENOSPC;
}
AliHLTDataBuffer::AliHLTRawBuffer* freespace=(*iter)->Split(size);
if (freespace) {
fUsedBuffers.push_back(freespace);
Free(freespace);
} else {
HLTWarning("failed to relase unused memory: cannot split raw buffer %p of size %d (used %d) at size %d", *iter, (*iter)->GetTotalSize(), (*iter)->GetUsedSize(), size);
}
return 0;
}
}
return 1;
}
bool AliHLTDataBuffer::AliHLTRawPage::HasBuffer(const AliHLTDataBuffer::AliHLTRawBuffer* pBuffer)
{
for (AliHLTRawBufferPList::iterator iter=fUsedBuffers.begin();
iter!=fUsedBuffers.end();
iter++) {
if ((*iter)==pBuffer) {
return true;
}
}
return false;
}
AliHLTUInt32_t AliHLTDataBuffer::AliHLTRawPage::Capacity() const
{
AliHLTUInt32_t capacity=0;
for (unsigned i=0; i<fFreeBuffers.size(); i++) {
if (fFreeBuffers[i]->GetTotalSize()>capacity)
capacity=fFreeBuffers[i]->GetTotalSize();
}
return capacity;
}
void AliHLTDataBuffer::AliHLTRawPage::Print(const char* option)
{
if (strcmp(option, "global")==0) {
cout << "number of global pages: " << fgGlobalPages.size() << endl;
for (AliHLTRawPage* rawpage=NextPage(NULL);
rawpage!=NULL;
rawpage=NextPage(rawpage)) {
rawpage->Print("");
}
return;
}
cout << "************* AliHLTRawPage status ***********" << endl;
cout << " instance " << this << endl;
printf(" buffer %p size %d", fPtr, fSize);
cout << " used buffers: " << fUsedBuffers.size() << endl;
AliHLTRawBufferPList::iterator iter=fUsedBuffers.begin();
for (; iter!=fUsedBuffers.end(); iter++) {
cout << " "; (*iter)->Print("min");
}
cout << " free buffers: " << fFreeBuffers.size() << endl;
iter=fFreeBuffers.begin();
for (; iter!=fFreeBuffers.end(); iter++) {
cout << " "; (*iter)->Print("min");
}
}
vector<AliHLTDataBuffer::AliHLTRawPage*> AliHLTDataBuffer::AliHLTRawPage::fgGlobalPages;
AliHLTUInt32_t AliHLTDataBuffer::AliHLTRawPage::fgGlobalPageSize=30*1024*1024;
AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc(AliHLTUInt32_t size, int verbosity)
{
AliHLTDataBuffer::AliHLTRawBuffer* rawbuffer=NULL;
vector<AliHLTDataBuffer::AliHLTRawPage*>::iterator page=fgGlobalPages.begin();
AliHLTLogging log;
for (page=fgGlobalPages.begin();page!=fgGlobalPages.end(); page++) {
if ((rawbuffer=(*page)->Alloc(size))!=NULL) {
if (verbosity>1) {
log.Logging(kHLTLogInfo, "AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc", "data buffer handling", "allocated raw buffer %p from page %p\n", rawbuffer, *page);
rawbuffer->Print("min");
}
break;
}
}
if (!rawbuffer) {
AliHLTUInt32_t rawPageSize=fgGlobalPageSize;
if (rawPageSize<size) {
if (rawPageSize*10<size) {
log.Logging(kHLTLogError, "AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc", "data buffer handling", "refusing to allocate buffer of size %d", size);
return NULL;
}
rawPageSize=size;
}
AliHLTDataBuffer::AliHLTRawPage* rawpage=new AliHLTDataBuffer::AliHLTRawPage(rawPageSize);
if (!rawpage) {
log.Logging(kHLTLogError, "AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc", "data buffer handling", "can not create raw page");
return NULL;
}
for (page=fgGlobalPages.begin(); page!=fgGlobalPages.end(); page++) {
if ((*page)->IsUsed()) continue;
delete *page;
fgGlobalPages.erase(page);
break;
}
fgGlobalPages.push_back(rawpage);
if ((rawbuffer=rawpage->Alloc(size))!=NULL) {
if (verbosity>1) {
log.Logging(kHLTLogInfo, "AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc", "data buffer handling", "allocated raw buffer %p from page %p\n", rawbuffer, rawpage);
rawbuffer->Print("min");
}
}
}
return rawbuffer;
}
AliHLTDataBuffer::AliHLTRawPage* AliHLTDataBuffer::AliHLTRawPage::FindPage(AliHLTDataBuffer::AliHLTRawBuffer* buffer)
{
vector<AliHLTDataBuffer::AliHLTRawPage*>::iterator page=fgGlobalPages.begin();
for (; page!=fgGlobalPages.end(); page++) {
if ((*page)->HasBuffer(buffer)) {
return *page;
}
}
return NULL;
}
int AliHLTDataBuffer::AliHLTRawPage::GlobalClean()
{
vector<AliHLTDataBuffer::AliHLTRawPage*>::iterator page=fgGlobalPages.begin();
while (page!=fgGlobalPages.end()) {
if (!(*page)->IsUsed()) {
delete *page;
page=fgGlobalPages.erase(page);
continue;
}
AliHLTLogging log;
log.Logging(kHLTLogError, "AliHLTDataBuffer::AliHLTRawPage::GlobalClean", "data buffer handling", "HLT memory page still in use, skipping cleanup, potential memory leak");
page++;
}
return 0;
}
AliHLTDataBuffer::AliHLTRawPage* AliHLTDataBuffer::AliHLTRawPage::NextPage(const AliHLTDataBuffer::AliHLTRawPage* prev)
{
vector<AliHLTDataBuffer::AliHLTRawPage*>::iterator page=fgGlobalPages.begin();
for (; page!=fgGlobalPages.end(); page++) {
if (prev==NULL) return *page;
if (*page!=prev) continue;
if (++page!=fgGlobalPages.end()) return *page;
break;
}
return NULL;
}
void AliHLTDataBuffer::AliHLTDataSegment::Print(const char* ) const
{
cout << "AliHLTDataSegment " << this
<< " " << AliHLTComponent::DataType2Text(fDataType)
<< " " << hex << fSpecification << dec
<< " Ptr " << (void*)fPtr
<< " offset " << fSegmentOffset
<< " size " << fSegmentSize
<< endl;
}
void AliHLTDataBuffer::AliHLTForwardedDataSegment::Print(const char* option) const
{
cout << "AliHLTForwardeDataSegment " << this << endl;
cout << " my : "; AliHLTDataSegment::Print(option);
cout << " parent: "; fParentSegment.Print(option);
cout << " task : ";
if (fParentTask) fParentTask->Print("");
else cout << "nil" << endl;
}
void AliHLTDataBuffer::Print(const char* option) const
{
unsigned i=0;
cout << "AliHLTDataBuffer " << this << endl;
cout << " raw buffer " << fpBuffer << endl;
if (fpBuffer) {
cout << " ";
fpBuffer->Print(option);
}
cout << " total segments: " << GetNofSegments() << endl;
cout << " data segments: " << fSegments.size() << endl;
for (i=0; i<fSegments.size(); i++) {
cout << " ";
fSegments[i].Print(option);
}
cout << " forwarded segments: " << fForwardedSegments.size() << endl;
for (i=0; i<fForwardedSegments.size(); i++) {
cout << " ";
fForwardedSegments[i].Print(option);
}
cout << " consumers: " << GetNofConsumers() << endl;
for (i=0; i<fConsumers.size(); i++) {
cout << " ";
fConsumers[i]->Print(option);
}
cout << " active consumers: " << GetNofActiveConsumers() << endl;
for (i=0; i<fActiveConsumers.size(); i++) {
cout << " ";
fActiveConsumers[i]->Print(option);
}
cout << " released consumers: " << fReleasedConsumers.size() << endl;
for (i=0; i<fReleasedConsumers.size(); i++) {
cout << " ";
fReleasedConsumers[i]->Print(option);
}
}
AliHLTDataBuffer.cxx:1000 AliHLTDataBuffer.cxx:1001 AliHLTDataBuffer.cxx:1002 AliHLTDataBuffer.cxx:1003 AliHLTDataBuffer.cxx:1004 AliHLTDataBuffer.cxx:1005 AliHLTDataBuffer.cxx:1006 AliHLTDataBuffer.cxx:1007 AliHLTDataBuffer.cxx:1008 AliHLTDataBuffer.cxx:1009 AliHLTDataBuffer.cxx:1010 AliHLTDataBuffer.cxx:1011 AliHLTDataBuffer.cxx:1012 AliHLTDataBuffer.cxx:1013 AliHLTDataBuffer.cxx:1014 AliHLTDataBuffer.cxx:1015 AliHLTDataBuffer.cxx:1016 AliHLTDataBuffer.cxx:1017 AliHLTDataBuffer.cxx:1018 AliHLTDataBuffer.cxx:1019 AliHLTDataBuffer.cxx:1020 AliHLTDataBuffer.cxx:1021 AliHLTDataBuffer.cxx:1022 AliHLTDataBuffer.cxx:1023 AliHLTDataBuffer.cxx:1024 AliHLTDataBuffer.cxx:1025 AliHLTDataBuffer.cxx:1026 AliHLTDataBuffer.cxx:1027 AliHLTDataBuffer.cxx:1028 AliHLTDataBuffer.cxx:1029 AliHLTDataBuffer.cxx:1030 AliHLTDataBuffer.cxx:1031 AliHLTDataBuffer.cxx:1032 AliHLTDataBuffer.cxx:1033 AliHLTDataBuffer.cxx:1034 AliHLTDataBuffer.cxx:1035 AliHLTDataBuffer.cxx:1036 AliHLTDataBuffer.cxx:1037 AliHLTDataBuffer.cxx:1038 AliHLTDataBuffer.cxx:1039 AliHLTDataBuffer.cxx:1040 AliHLTDataBuffer.cxx:1041 AliHLTDataBuffer.cxx:1042 AliHLTDataBuffer.cxx:1043 AliHLTDataBuffer.cxx:1044 AliHLTDataBuffer.cxx:1045 AliHLTDataBuffer.cxx:1046 AliHLTDataBuffer.cxx:1047 AliHLTDataBuffer.cxx:1048 AliHLTDataBuffer.cxx:1049 AliHLTDataBuffer.cxx:1050 AliHLTDataBuffer.cxx:1051 AliHLTDataBuffer.cxx:1052 AliHLTDataBuffer.cxx:1053 AliHLTDataBuffer.cxx:1054 AliHLTDataBuffer.cxx:1055 AliHLTDataBuffer.cxx:1056 AliHLTDataBuffer.cxx:1057 AliHLTDataBuffer.cxx:1058 AliHLTDataBuffer.cxx:1059 AliHLTDataBuffer.cxx:1060 AliHLTDataBuffer.cxx:1061 AliHLTDataBuffer.cxx:1062 AliHLTDataBuffer.cxx:1063 AliHLTDataBuffer.cxx:1064 AliHLTDataBuffer.cxx:1065 AliHLTDataBuffer.cxx:1066 AliHLTDataBuffer.cxx:1067 AliHLTDataBuffer.cxx:1068 AliHLTDataBuffer.cxx:1069 AliHLTDataBuffer.cxx:1070 AliHLTDataBuffer.cxx:1071 AliHLTDataBuffer.cxx:1072 AliHLTDataBuffer.cxx:1073 AliHLTDataBuffer.cxx:1074 AliHLTDataBuffer.cxx:1075 AliHLTDataBuffer.cxx:1076 AliHLTDataBuffer.cxx:1077 AliHLTDataBuffer.cxx:1078 AliHLTDataBuffer.cxx:1079 AliHLTDataBuffer.cxx:1080 AliHLTDataBuffer.cxx:1081 AliHLTDataBuffer.cxx:1082 AliHLTDataBuffer.cxx:1083 AliHLTDataBuffer.cxx:1084 AliHLTDataBuffer.cxx:1085 AliHLTDataBuffer.cxx:1086 AliHLTDataBuffer.cxx:1087 AliHLTDataBuffer.cxx:1088 AliHLTDataBuffer.cxx:1089 AliHLTDataBuffer.cxx:1090 AliHLTDataBuffer.cxx:1091 AliHLTDataBuffer.cxx:1092 AliHLTDataBuffer.cxx:1093 AliHLTDataBuffer.cxx:1094 AliHLTDataBuffer.cxx:1095 AliHLTDataBuffer.cxx:1096 AliHLTDataBuffer.cxx:1097 AliHLTDataBuffer.cxx:1098 AliHLTDataBuffer.cxx:1099 AliHLTDataBuffer.cxx:1100 AliHLTDataBuffer.cxx:1101 AliHLTDataBuffer.cxx:1102 AliHLTDataBuffer.cxx:1103 AliHLTDataBuffer.cxx:1104 AliHLTDataBuffer.cxx:1105 AliHLTDataBuffer.cxx:1106 AliHLTDataBuffer.cxx:1107 AliHLTDataBuffer.cxx:1108 AliHLTDataBuffer.cxx:1109 AliHLTDataBuffer.cxx:1110 AliHLTDataBuffer.cxx:1111 AliHLTDataBuffer.cxx:1112 AliHLTDataBuffer.cxx:1113 AliHLTDataBuffer.cxx:1114 AliHLTDataBuffer.cxx:1115 AliHLTDataBuffer.cxx:1116 AliHLTDataBuffer.cxx:1117 AliHLTDataBuffer.cxx:1118 AliHLTDataBuffer.cxx:1119 AliHLTDataBuffer.cxx:1120 AliHLTDataBuffer.cxx:1121 AliHLTDataBuffer.cxx:1122 AliHLTDataBuffer.cxx:1123 AliHLTDataBuffer.cxx:1124 AliHLTDataBuffer.cxx:1125 AliHLTDataBuffer.cxx:1126 AliHLTDataBuffer.cxx:1127 AliHLTDataBuffer.cxx:1128 AliHLTDataBuffer.cxx:1129 AliHLTDataBuffer.cxx:1130 AliHLTDataBuffer.cxx:1131 AliHLTDataBuffer.cxx:1132 AliHLTDataBuffer.cxx:1133 AliHLTDataBuffer.cxx:1134 AliHLTDataBuffer.cxx:1135 AliHLTDataBuffer.cxx:1136 AliHLTDataBuffer.cxx:1137 AliHLTDataBuffer.cxx:1138 AliHLTDataBuffer.cxx:1139 AliHLTDataBuffer.cxx:1140 AliHLTDataBuffer.cxx:1141 AliHLTDataBuffer.cxx:1142 AliHLTDataBuffer.cxx:1143 AliHLTDataBuffer.cxx:1144 AliHLTDataBuffer.cxx:1145 AliHLTDataBuffer.cxx:1146 AliHLTDataBuffer.cxx:1147 AliHLTDataBuffer.cxx:1148 AliHLTDataBuffer.cxx:1149 AliHLTDataBuffer.cxx:1150 AliHLTDataBuffer.cxx:1151 AliHLTDataBuffer.cxx:1152 AliHLTDataBuffer.cxx:1153 AliHLTDataBuffer.cxx:1154 AliHLTDataBuffer.cxx:1155 AliHLTDataBuffer.cxx:1156 AliHLTDataBuffer.cxx:1157 AliHLTDataBuffer.cxx:1158 AliHLTDataBuffer.cxx:1159 AliHLTDataBuffer.cxx:1160 AliHLTDataBuffer.cxx:1161 AliHLTDataBuffer.cxx:1162 AliHLTDataBuffer.cxx:1163 AliHLTDataBuffer.cxx:1164 AliHLTDataBuffer.cxx:1165 AliHLTDataBuffer.cxx:1166 AliHLTDataBuffer.cxx:1167 AliHLTDataBuffer.cxx:1168 AliHLTDataBuffer.cxx:1169 AliHLTDataBuffer.cxx:1170 AliHLTDataBuffer.cxx:1171 AliHLTDataBuffer.cxx:1172 AliHLTDataBuffer.cxx:1173 AliHLTDataBuffer.cxx:1174 AliHLTDataBuffer.cxx:1175 AliHLTDataBuffer.cxx:1176 AliHLTDataBuffer.cxx:1177 AliHLTDataBuffer.cxx:1178 AliHLTDataBuffer.cxx:1179 AliHLTDataBuffer.cxx:1180 AliHLTDataBuffer.cxx:1181 AliHLTDataBuffer.cxx:1182 AliHLTDataBuffer.cxx:1183 AliHLTDataBuffer.cxx:1184 AliHLTDataBuffer.cxx:1185 AliHLTDataBuffer.cxx:1186 AliHLTDataBuffer.cxx:1187 AliHLTDataBuffer.cxx:1188 AliHLTDataBuffer.cxx:1189 AliHLTDataBuffer.cxx:1190 AliHLTDataBuffer.cxx:1191 AliHLTDataBuffer.cxx:1192 AliHLTDataBuffer.cxx:1193 AliHLTDataBuffer.cxx:1194 AliHLTDataBuffer.cxx:1195 AliHLTDataBuffer.cxx:1196 AliHLTDataBuffer.cxx:1197 AliHLTDataBuffer.cxx:1198 AliHLTDataBuffer.cxx:1199 AliHLTDataBuffer.cxx:1200 AliHLTDataBuffer.cxx:1201 AliHLTDataBuffer.cxx:1202 AliHLTDataBuffer.cxx:1203 AliHLTDataBuffer.cxx:1204 AliHLTDataBuffer.cxx:1205 AliHLTDataBuffer.cxx:1206 AliHLTDataBuffer.cxx:1207 AliHLTDataBuffer.cxx:1208 AliHLTDataBuffer.cxx:1209 AliHLTDataBuffer.cxx:1210 AliHLTDataBuffer.cxx:1211 AliHLTDataBuffer.cxx:1212 AliHLTDataBuffer.cxx:1213 AliHLTDataBuffer.cxx:1214 AliHLTDataBuffer.cxx:1215 AliHLTDataBuffer.cxx:1216 AliHLTDataBuffer.cxx:1217 AliHLTDataBuffer.cxx:1218 AliHLTDataBuffer.cxx:1219 AliHLTDataBuffer.cxx:1220 AliHLTDataBuffer.cxx:1221 AliHLTDataBuffer.cxx:1222 AliHLTDataBuffer.cxx:1223 AliHLTDataBuffer.cxx:1224 AliHLTDataBuffer.cxx:1225 AliHLTDataBuffer.cxx:1226 AliHLTDataBuffer.cxx:1227 AliHLTDataBuffer.cxx:1228 AliHLTDataBuffer.cxx:1229 AliHLTDataBuffer.cxx:1230 AliHLTDataBuffer.cxx:1231 AliHLTDataBuffer.cxx:1232 AliHLTDataBuffer.cxx:1233 AliHLTDataBuffer.cxx:1234 AliHLTDataBuffer.cxx:1235 AliHLTDataBuffer.cxx:1236 AliHLTDataBuffer.cxx:1237 AliHLTDataBuffer.cxx:1238 AliHLTDataBuffer.cxx:1239 AliHLTDataBuffer.cxx:1240 AliHLTDataBuffer.cxx:1241 AliHLTDataBuffer.cxx:1242 AliHLTDataBuffer.cxx:1243 AliHLTDataBuffer.cxx:1244 AliHLTDataBuffer.cxx:1245 AliHLTDataBuffer.cxx:1246 AliHLTDataBuffer.cxx:1247 AliHLTDataBuffer.cxx:1248 AliHLTDataBuffer.cxx:1249 AliHLTDataBuffer.cxx:1250 AliHLTDataBuffer.cxx:1251 AliHLTDataBuffer.cxx:1252 AliHLTDataBuffer.cxx:1253 AliHLTDataBuffer.cxx:1254 AliHLTDataBuffer.cxx:1255 AliHLTDataBuffer.cxx:1256 AliHLTDataBuffer.cxx:1257 AliHLTDataBuffer.cxx:1258 AliHLTDataBuffer.cxx:1259 AliHLTDataBuffer.cxx:1260 AliHLTDataBuffer.cxx:1261 AliHLTDataBuffer.cxx:1262 AliHLTDataBuffer.cxx:1263 AliHLTDataBuffer.cxx:1264 AliHLTDataBuffer.cxx:1265 AliHLTDataBuffer.cxx:1266 AliHLTDataBuffer.cxx:1267 AliHLTDataBuffer.cxx:1268 AliHLTDataBuffer.cxx:1269 AliHLTDataBuffer.cxx:1270 AliHLTDataBuffer.cxx:1271 AliHLTDataBuffer.cxx:1272 AliHLTDataBuffer.cxx:1273 AliHLTDataBuffer.cxx:1274 AliHLTDataBuffer.cxx:1275 AliHLTDataBuffer.cxx:1276 AliHLTDataBuffer.cxx:1277 AliHLTDataBuffer.cxx:1278 AliHLTDataBuffer.cxx:1279 AliHLTDataBuffer.cxx:1280 AliHLTDataBuffer.cxx:1281 AliHLTDataBuffer.cxx:1282 AliHLTDataBuffer.cxx:1283 AliHLTDataBuffer.cxx:1284 AliHLTDataBuffer.cxx:1285 AliHLTDataBuffer.cxx:1286 AliHLTDataBuffer.cxx:1287 AliHLTDataBuffer.cxx:1288 AliHLTDataBuffer.cxx:1289 AliHLTDataBuffer.cxx:1290 AliHLTDataBuffer.cxx:1291 AliHLTDataBuffer.cxx:1292 AliHLTDataBuffer.cxx:1293 AliHLTDataBuffer.cxx:1294 AliHLTDataBuffer.cxx:1295 AliHLTDataBuffer.cxx:1296 AliHLTDataBuffer.cxx:1297 AliHLTDataBuffer.cxx:1298 AliHLTDataBuffer.cxx:1299 AliHLTDataBuffer.cxx:1300 AliHLTDataBuffer.cxx:1301 AliHLTDataBuffer.cxx:1302 AliHLTDataBuffer.cxx:1303 AliHLTDataBuffer.cxx:1304 AliHLTDataBuffer.cxx:1305 AliHLTDataBuffer.cxx:1306 AliHLTDataBuffer.cxx:1307 AliHLTDataBuffer.cxx:1308 AliHLTDataBuffer.cxx:1309 AliHLTDataBuffer.cxx:1310 AliHLTDataBuffer.cxx:1311 AliHLTDataBuffer.cxx:1312 AliHLTDataBuffer.cxx:1313 AliHLTDataBuffer.cxx:1314 AliHLTDataBuffer.cxx:1315 AliHLTDataBuffer.cxx:1316 AliHLTDataBuffer.cxx:1317 AliHLTDataBuffer.cxx:1318 AliHLTDataBuffer.cxx:1319 AliHLTDataBuffer.cxx:1320 AliHLTDataBuffer.cxx:1321 AliHLTDataBuffer.cxx:1322 AliHLTDataBuffer.cxx:1323 AliHLTDataBuffer.cxx:1324 AliHLTDataBuffer.cxx:1325 AliHLTDataBuffer.cxx:1326 AliHLTDataBuffer.cxx:1327 AliHLTDataBuffer.cxx:1328 AliHLTDataBuffer.cxx:1329 AliHLTDataBuffer.cxx:1330 AliHLTDataBuffer.cxx:1331 AliHLTDataBuffer.cxx:1332 AliHLTDataBuffer.cxx:1333 AliHLTDataBuffer.cxx:1334 AliHLTDataBuffer.cxx:1335 AliHLTDataBuffer.cxx:1336