//***************************************************************************
#include "AliHLTTPCCASliceOutput.h"
+#include "MemoryAssignmentHelpers.h"
+
GPUhd() int AliHLTTPCCASliceOutput::EstimateSize( int nOfTracks, int nOfTrackClusters )
{
return sizeof( AliHLTTPCCASliceOutput ) + sizeof( AliHLTTPCCASliceTrack )*nOfTracks + kClusterDataSize*nOfTrackClusters;
}
-template<typename T> inline void AssignNoAlignment( T *&dst, char *&mem, int count )
+#ifndef HLTCA_GPUCODE
+
+inline void AssignNoAlignment( int &dst, int &size, int count )
{
// assign memory to the pointer dst
- dst = ( T* ) mem;
- mem = ( char * )( dst + count );
+ dst = size;
+ size = dst + count ;
}
-GPUhd() void AliHLTTPCCASliceOutput::SetPointers()
+void AliHLTTPCCASliceOutput::SetPointers(int nTracks, int nTrackClusters, const outputControlStruct* outputControl)
{
// set all pointers
+ if (nTracks == -1) nTracks = fNTracks;
+ if (nTrackClusters == -1) nTrackClusters = fNTrackClusters;
+
+ int size = 0;
- char *mem = &fMemory[0];
- AssignNoAlignment( fTracks, mem, fNTracks );
- AssignNoAlignment( fClusterUnpackedYZ, mem, fNTrackClusters );
- AssignNoAlignment( fClusterUnpackedX, mem, fNTrackClusters );
- AssignNoAlignment( fClusterId, mem, fNTrackClusters );
- AssignNoAlignment( fClusterPackedYZ, mem, fNTrackClusters );
- AssignNoAlignment( fClusterRow, mem, fNTrackClusters );
- AssignNoAlignment( fClusterPackedAmp, mem, fNTrackClusters );
+ {
+ AssignNoAlignment( fTracksOffset, size, nTracks*sizeof(AliHLTTPCCASliceTrack) );
+ AssignNoAlignment( fClusterIdOffset, size, nTrackClusters*sizeof(int) );
+ AssignNoAlignment( fClusterRowOffset, size, nTrackClusters*sizeof(float) );
+ AssignNoAlignment( fClusterPackedXYZOffset, size, nTrackClusters*sizeof(AliHLTTPCCACompressedCluster) );
+ }
+
+ char *mem = fMemory + size;
+ if ((size_t) (mem - fMemory) + sizeof(AliHLTTPCCASliceOutput) > fMemorySize)
+ {
+ fMemorySize = NULL;
+ //printf("\nINTERNAL ERROR IN AliHLTTPCCASliceOutput MEMORY MANAGEMENT req: %d avail: %d\n", (int) ((size_t) (mem - fMemory) + sizeof(AliHLTTPCCASliceOutput)), (int) fMemorySize);
+ }
}
+void AliHLTTPCCASliceOutput::Allocate(AliHLTTPCCASliceOutput* &ptrOutput, int nTracks, int nTrackHits, outputControlStruct* outputControl)
+{
+ //Allocate All memory needed for slice output
+ const int memsize = EstimateSize(nTracks, nTrackHits);
+
+ if (outputControl->fOutputPtr)
+ {
+ if (outputControl->fOutputMaxSize < memsize)
+ {
+ outputControl->fEndOfSpace = 1;
+ ptrOutput = NULL;
+ return;
+ }
+ ptrOutput = (AliHLTTPCCASliceOutput*) outputControl->fOutputPtr;
+ outputControl->fOutputPtr += memsize;
+ outputControl->fOutputMaxSize -= memsize;
+ }
+ else
+ {
+ if (ptrOutput) free(ptrOutput);
+ ptrOutput = (AliHLTTPCCASliceOutput*) malloc(memsize);
+ }
+ ptrOutput->SetMemorySize(memsize);
+ ptrOutput->SetPointers(nTracks, nTrackHits, outputControl); // set pointers
+}
+#endif