]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCASliceOutput.cxx
cosmetic changes
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCASliceOutput.cxx
index d8e1e5a0e448e9f393411abe102fe27fa14c8ac2..59c8e7e159536193893f4e71edbea0c9d101edf1 100644 (file)
@@ -20,6 +20,7 @@
 #include "AliHLTTPCCASliceOutput.h"
 #include "MemoryAssignmentHelpers.h"
 
+
 GPUhd() int AliHLTTPCCASliceOutput::EstimateSize( int nOfTracks, int nOfTrackClusters )
 {
   // calculate the amount of memory [bytes] needed for the event
@@ -29,18 +30,70 @@ GPUhd() int AliHLTTPCCASliceOutput::EstimateSize( int nOfTracks, int nOfTrackClu
   return sizeof( AliHLTTPCCASliceOutput ) + sizeof( AliHLTTPCCASliceTrack )*nOfTracks + kClusterDataSize*nOfTrackClusters;
 }
 
+#ifndef HLTCA_GPUCODE
+
+template<typename T> inline void AssignNoAlignment( T *&dst, char *&mem, int count )
+{
+  // assign memory to the pointer dst
+  dst = ( T* ) mem;
+  mem = ( char * )( 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;
 
-  char *mem = &fMemory[0];
-  AssignMemory( fTracks,            mem, fNTracks );
-  AssignMemory( fClusterUnpackedYZ, mem, fNTrackClusters );
-  AssignMemory( fClusterUnpackedX,  mem, fNTrackClusters );
-  AssignMemory( fClusterId,         mem, fNTrackClusters );
-  AssignMemory( fClusterPackedYZ,   mem, fNTrackClusters );
-  AssignMemory( fClusterRow,        mem, fNTrackClusters );
-  AssignMemory( fClusterPackedAmp,  mem, fNTrackClusters );
+  char *mem = fMemory;
+
+  if (outputControl == NULL || outputControl->fDefaultOutput)
+  {
+         AssignNoAlignment( fTracks,            mem, nTracks );
+         AssignNoAlignment( fClusterUnpackedYZ, mem, nTrackClusters );
+         AssignNoAlignment( fClusterUnpackedX,  mem, nTrackClusters );
+         AssignNoAlignment( fClusterId,         mem, nTrackClusters );
+         AssignNoAlignment( fClusterPackedYZ,   mem, nTrackClusters );
+         AssignNoAlignment( fClusterRow,        mem, nTrackClusters );
+         AssignNoAlignment( fClusterPackedAmp,  mem, nTrackClusters );
+  }
+
+  if (outputControl == NULL || outputControl->fObsoleteOutput)
+  {
+         // memory for output tracks
+         AssignMemory( fOutTracks, mem, nTracks );
+         // arrays for track hits
+         AssignMemory( fOutTrackHits, mem, nTrackClusters );
+  }
+  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 = (outputControl->fDefaultOutput ? EstimateSize(nTracks, nTrackHits) : sizeof(AliHLTTPCCASliceOutput)) +
+         (outputControl->fObsoleteOutput? (nTracks * sizeof(AliHLTTPCCAOutTrack) + nTrackHits * sizeof(int)) : 0);
+  if (outputControl->fOutputPtr)
+  {
+         if (outputControl->fOutputMaxSize < memsize)
+         {
+                 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