]>
Commit | Line | Data |
---|---|---|
4acc2401 | 1 | // @(#) $Id$ |
ce565086 | 2 | // ************************************************************************** |
fbb9b71b | 3 | // This file is property of and copyright by the ALICE HLT Project * |
d54804bf | 4 | // ALICE Experiment at CERN, All rights reserved. * |
5 | // * | |
6 | // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> * | |
7 | // Ivan Kisel <kisel@kip.uni-heidelberg.de> * | |
8 | // for The ALICE HLT Project. * | |
9 | // * | |
10 | // Permission to use, copy, modify and distribute this software and its * | |
11 | // documentation strictly for non-commercial purposes is hereby granted * | |
12 | // without fee, provided that the above copyright notice appears in all * | |
13 | // copies and that both the copyright notice and this permission notice * | |
14 | // appear in the supporting documentation. The authors make no claims * | |
15 | // about the suitability of this software for any purpose. It is * | |
16 | // provided "as is" without express or implied warranty. * | |
ce565086 | 17 | // * |
d54804bf | 18 | //*************************************************************************** |
326c2d4b | 19 | |
4acc2401 | 20 | #include "AliHLTTPCCASliceOutput.h" |
b22af1bf | 21 | #include "MemoryAssignmentHelpers.h" |
22 | ||
326c2d4b | 23 | |
4acc2401 | 24 | GPUhd() int AliHLTTPCCASliceOutput::EstimateSize( int nOfTracks, int nOfTrackClusters ) |
25 | { | |
26 | // calculate the amount of memory [bytes] needed for the event | |
27 | ||
b8139972 | 28 | const int kClusterDataSize = sizeof( int ) + sizeof( unsigned short ) + sizeof( float2 ) + sizeof( float ) + sizeof( UChar_t ) + sizeof( UChar_t ); |
4acc2401 | 29 | |
30 | return sizeof( AliHLTTPCCASliceOutput ) + sizeof( AliHLTTPCCASliceTrack )*nOfTracks + kClusterDataSize*nOfTrackClusters; | |
31 | } | |
326c2d4b | 32 | |
7be9b0d7 | 33 | #ifndef HLTCA_GPUCODE |
b22af1bf | 34 | |
ef1d207e | 35 | template<typename T> inline void AssignNoAlignment( T *&dst, char *&mem, int count ) |
36 | { | |
37 | // assign memory to the pointer dst | |
c26cae51 | 38 | dst = ( T* ) mem; |
39 | mem = ( char * )( dst + count ); | |
ef1d207e | 40 | } |
6de2bc40 | 41 | |
d4594e7d | 42 | void AliHLTTPCCASliceOutput::SetPointers(int nTracks, int nTrackClusters, const outputControlStruct* outputControl) |
dc4788ec | 43 | { |
4acc2401 | 44 | // set all pointers |
98512261 | 45 | if (nTracks == -1) nTracks = fNTracks; |
d3ccf1c0 | 46 | if (nTrackClusters == -1) nTrackClusters = fNTrackClusters; |
00d07bcd | 47 | |
b22af1bf | 48 | char *mem = fMemory; |
ef1d207e | 49 | |
d4594e7d | 50 | if (outputControl == NULL || outputControl->fDefaultOutput) |
51 | { | |
52 | AssignNoAlignment( fTracks, mem, nTracks ); | |
53 | AssignNoAlignment( fClusterUnpackedYZ, mem, nTrackClusters ); | |
54 | AssignNoAlignment( fClusterUnpackedX, mem, nTrackClusters ); | |
55 | AssignNoAlignment( fClusterId, mem, nTrackClusters ); | |
d4594e7d | 56 | AssignNoAlignment( fClusterRow, mem, nTrackClusters ); |
d4594e7d | 57 | } |
58 | ||
59 | if (outputControl == NULL || outputControl->fObsoleteOutput) | |
60 | { | |
61 | // memory for output tracks | |
62 | AssignMemory( fOutTracks, mem, nTracks ); | |
63 | // arrays for track hits | |
64 | AssignMemory( fOutTrackHits, mem, nTrackClusters ); | |
65 | } | |
66 | if ((size_t) (mem - fMemory) + sizeof(AliHLTTPCCASliceOutput) > fMemorySize) | |
67 | { | |
68 | fMemorySize = NULL; | |
69 | //printf("\nINTERNAL ERROR IN AliHLTTPCCASliceOutput MEMORY MANAGEMENT req: %d avail: %d\n", (int) ((size_t) (mem - fMemory) + sizeof(AliHLTTPCCASliceOutput)), (int) fMemorySize); | |
70 | } | |
b22af1bf | 71 | } |
72 | ||
d4594e7d | 73 | void AliHLTTPCCASliceOutput::Allocate(AliHLTTPCCASliceOutput* &ptrOutput, int nTracks, int nTrackHits, outputControlStruct* outputControl) |
b22af1bf | 74 | { |
75 | //Allocate All memory needed for slice output | |
d4594e7d | 76 | const int memsize = (outputControl->fDefaultOutput ? EstimateSize(nTracks, nTrackHits) : sizeof(AliHLTTPCCASliceOutput)) + |
77 | (outputControl->fObsoleteOutput? (nTracks * sizeof(AliHLTTPCCAOutTrack) + nTrackHits * sizeof(int)) : 0); | |
78 | if (outputControl->fOutputPtr) | |
79 | { | |
80 | if (outputControl->fOutputMaxSize < memsize) | |
81 | { | |
90da1ad5 | 82 | outputControl->fEndOfSpace = 1; |
d4594e7d | 83 | ptrOutput = NULL; |
84 | return; | |
85 | } | |
86 | ptrOutput = (AliHLTTPCCASliceOutput*) outputControl->fOutputPtr; | |
87 | outputControl->fOutputPtr += memsize; | |
88 | outputControl->fOutputMaxSize -= memsize; | |
89 | } | |
90 | else | |
91 | { | |
92 | if (ptrOutput) free(ptrOutput); | |
93 | ptrOutput = (AliHLTTPCCASliceOutput*) malloc(memsize); | |
94 | } | |
95 | ptrOutput->SetMemorySize(memsize); | |
96 | ptrOutput->SetPointers(nTracks, nTrackHits, outputControl); // set pointers | |
dc4788ec | 97 | } |
7be9b0d7 | 98 | #endif |