X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HLT%2FBASE%2FAliHLTDataBuffer.h;h=4c7af5aa022781b511b2799f129965013da5f768;hb=4d11883f56a67c97226e278c9f63305dbece6506;hp=e7823c4c1d6243f57892586b5a8535d41dd772d5;hpb=e962f43899468ffa1ca718edfb8c14e331861d2b;p=u%2Fmrichter%2FAliRoot.git diff --git a/HLT/BASE/AliHLTDataBuffer.h b/HLT/BASE/AliHLTDataBuffer.h index e7823c4c1d6..4c7af5aa022 100644 --- a/HLT/BASE/AliHLTDataBuffer.h +++ b/HLT/BASE/AliHLTDataBuffer.h @@ -125,6 +125,12 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging int Release(AliHLTComponentBlockData* pBlockDesc, const AliHLTComponent* pConsumer, const AliHLTTask* pOwnerTask); + /** + * Release a forwarded data block. + */ + int ReleaseForwardedBlock(AliHLTComponentBlockData* pBlockDesc, + const AliHLTTask* pOwnerTask); + /** * Register an input data block for forwarding. * Consumer of this data buffer subscribe to forwarded data blocks in te same way. @@ -171,7 +177,7 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging //int GetTotalSize(); /** - * Get the number of segments + * Get the number of segments including the forwarded data blocks. * @return number of segments */ int GetNofSegments(); @@ -203,7 +209,7 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging * search only in fConsumer list if 0 * @return 1 if found, 0 if not */ - int FindConsumer(AliHLTComponent* pConsumer, int bAllLists=1); + int FindConsumer(const AliHLTComponent* pConsumer, int bAllLists=1); /** * Public method to reset the buffer. @@ -219,6 +225,19 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging void SetLocalLoggingLevel(AliHLTComponentLogSeverity level) {fgLogging.SetLocalLoggingLevel(level); AliHLTLogging::SetLocalLoggingLevel(level);} + /** + * Print summary of the global buffer management. + */ + static int PrintStatistics(); + + /** + * Set the global event count. + * The event count is deployed to find buffers which have not been used + * for a while. In such a case to policy to find an appropriate buffer is + * adjusted. + */ + static int SetGlobalEventCount(AliHLTUInt32_t eventCount) {fgEventCount=eventCount; return 0;} + /** * @class AliHLTDataSegment * @brief Descriptor of a data segment within the buffer. @@ -290,6 +309,75 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging AliHLTUInt32_t fSpecification; // see above }; + class AliHLTRawBuffer; + typedef vector AliHLTRawBufferPList; + + /** + * @class AliHLTRawPage + * Memory allocation is organized in pages of a fixed size. Within a + * page, AliHLTRawBuffer chunks are created. + */ + class AliHLTRawPage : public AliHLTLogging { + public: + /** standard constructor */ + AliHLTRawPage() : fSize(0), fPtr(NULL), fFreeBuffers(), fUsedBuffers() {} + /** constructor */ + AliHLTRawPage(AliHLTUInt32_t pagesize); + /** destructor */ + virtual ~AliHLTRawPage(); + + /** alloc a buffer of specified size from the global pages*/ + static AliHLTRawBuffer* GlobalAlloc(AliHLTUInt32_t size, int verbosity=0); + /** find buffer in the global pages */ + static AliHLTRawPage* FindPage(AliHLTRawBuffer* buffer); + /** cleanup the global pages */ + static int GlobalClean(); + /** adjust global page size */ + static void SetGlobalPageSize(AliHLTUInt32_t size) {fgGlobalPageSize=size;} + /** find next page after prev, or first page */ + static AliHLTRawPage* NextPage(AliHLTRawPage* prev=NULL); + + /** alloc a buffer of specified size */ + AliHLTRawBuffer* Alloc(AliHLTUInt32_t size); + /** free a buffer and merge consecutive free buffers */ + int Free(AliHLTRawBuffer* pBuffer); + /** set the size of a raw buffer and release the remaining part */ + int SetSize(AliHLTRawBuffer* pBuffer, AliHLTUInt32_t size); + /// check if the buffer is in this page + bool HasBuffer(AliHLTRawBuffer* pBuffer); + + AliHLTUInt32_t Size() const {return fSize;} + AliHLTUInt32_t Capacity() const; + bool IsUsed() const {return fUsedBuffers.size()>0;} + bool IsFragmented() const {return (fFreeBuffers.size()+fUsedBuffers.size())>1;} + + /** + * Print page information + */ + void Print(const char* option); + + private: + /** copy constructor prohibited */ + AliHLTRawPage(const AliHLTRawPage&); + /** assignment operator prohibited */ + AliHLTRawPage& operator=(const AliHLTRawPage&); + + /// list of global pages + static vector fgGlobalPages; //! transient + /// pages size of global pages + static AliHLTUInt32_t fgGlobalPageSize; //! transient + + /** page size */ + AliHLTUInt32_t fSize; // see above + /** the memory segment */ + AliHLTUInt8_t* fPtr; //! transient + + /** list of free buffers */ + AliHLTRawBufferPList fFreeBuffers; //! transient + /** list of used buffers */ + AliHLTRawBufferPList fUsedBuffers; //! transient + }; + /** * @class AliHLTRawBuffer * @brief Descriptor of the raw data buffer which can host several segments. @@ -297,9 +385,11 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging class AliHLTRawBuffer { public: /** standard constructor */ - AliHLTRawBuffer() : fSize(0), fTotalSize(0), fPtr(NULL) {} + AliHLTRawBuffer() : fSize(0), fTotalSize(0), fExternalPtr(NULL), fPtr(NULL), fLastEventCount(0) {} /** constructor */ AliHLTRawBuffer(AliHLTUInt32_t size); + /** constructor */ + AliHLTRawBuffer(AliHLTUInt32_t size, AliHLTUInt8_t* buffer); /** destructor */ virtual ~AliHLTRawBuffer(); @@ -310,8 +400,17 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging */ AliHLTUInt8_t* UseBuffer(AliHLTUInt32_t size); + /** + * split a buffer at specified size + * only possible for buffers with external memory + */ + AliHLTRawBuffer* Split(AliHLTUInt32_t size); + /** * Check whether buffer fits for a request. + * A buffer fits if it is at least of the requested size and at most + * the requested size plus a margin. The margin increases with the + * number of events the buffer has not been used. * @param size size of the request in bytes * @return 1 if buffer is big enough, 0 if not */ @@ -348,11 +447,26 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging */ int Reset(); + /* + * Merge buffer with succeeding buffer. + * Only possible if the buffers are consecutive with out any gap. + */ + int Merge(const AliHLTRawBuffer& succ); + + /** + * Print buffer information + */ + void Print(const char* option); + int operator==(void*) const; int operator==(AliHLTUInt8_t* ptr) const {return fPtr==ptr;} + int operator<(void*) const; int operator<=(void*) const; int operator>(void*) const; int operator-(void*) const; + int operator<(const AliHLTRawBuffer&) const; + int operator<=(const AliHLTRawBuffer&) const; + int operator>(const AliHLTRawBuffer&) const; operator void*() const {return fPtr;} operator AliHLTUInt8_t*() const {return fPtr;} @@ -367,8 +481,12 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging AliHLTUInt32_t fSize; // see above /** total size of the buffer, including safety margin */ AliHLTUInt32_t fTotalSize; // see above - /** the buffer */ + /** optional external buffer */ + AliHLTUInt8_t* fExternalPtr; //! transient + /** the buffer, external or allocated */ AliHLTUInt8_t* fPtr; //! transient + /** last event count where the buffer has been used */ + AliHLTUInt32_t fLastEventCount; //! transient }; private: @@ -392,12 +510,15 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging int FindMatchingDataSegments(const AliHLTComponent* pConsumer, vector& tgtList); + protected: + // 2010-02-01 make function protected in order to be used from unit test /** * Reset the data buffer. * Removes all consumers back to the @ref fConsumers list, deletes * segments and releases the Raw Buffer. */ int ResetDataBuffer(); + private: ////////////////////////////////////////////////////////////////////////////// @@ -438,6 +559,12 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging */ static AliHLTRawBuffer* CreateRawBuffer(AliHLTUInt32_t size); + /** + * Set the data size of a raw buffer after it has been filled by + * the component. + */ + int SetRawBufferDataSize(AliHLTRawBuffer* pBuffer, AliHLTUInt32_t size) const; + /** * Mark a buffer as free. * After the Data Buffer has finnished using the raw buffer, it is released @@ -477,6 +604,8 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging /** the safety pattern */ static const char fgkSafetyPattern[]; //!transient + static AliHLTUInt32_t fgEventCount; //!transient + ////////////////////////////////////////////////////////////////////////////// // internal helper functions @@ -509,7 +638,7 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging */ int CleanupConsumerList(); - ClassDef(AliHLTDataBuffer, 0) + ClassDef(AliHLTDataBuffer, 1) }; #endif // ALIHLTDATABUFFER_H