fix buffer allocation
authormkrzewic <mikolaj.krzewicki@cern.ch>
Tue, 20 Jan 2015 13:37:06 +0000 (14:37 +0100)
committertbreitne <timo.gunther.breitner@cern.ch>
Thu, 29 Jan 2015 13:41:56 +0000 (14:41 +0100)
HLT/BASE/AliHLTDataBuffer.cxx
HLT/BASE/AliHLTDataBuffer.h
HLT/BASE/AliHLTTask.cxx
HLT/global/AliHLTGlobalEsdConverterComponent.cxx

index 4b6ffba..0236334 100644 (file)
@@ -1174,6 +1174,11 @@ vector<AliHLTDataBuffer::AliHLTRawPage*> AliHLTDataBuffer::AliHLTRawPage::fgGlob
 
 AliHLTUInt32_t AliHLTDataBuffer::AliHLTRawPage::fgGlobalPageSize=30*1024*1024;
 
+unsigned int AliHLTDataBuffer::GetMaxBufferSize()
+{
+       return(30 * AliHLTRawPage::GetGlobalPageSize()); //Use a max data size of 30 * GlobalPageSize, as this is the maximum AliHLTRawPage::GlobalAlloc will allocate
+}
+
 AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc(AliHLTUInt32_t size, int verbosity)
 {
   // alloc a buffer of specified size from the global pages
@@ -1192,7 +1197,7 @@ AliHLTDataBuffer::AliHLTRawBuffer* AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc(
   if (!rawbuffer) {
     AliHLTUInt32_t rawPageSize=fgGlobalPageSize;
     if (rawPageSize<size) {
-      if (rawPageSize*10<size) {
+      if (rawPageSize*30+fgkSafetyPatternSize<size) {
        log.Logging(kHLTLogError, "AliHLTDataBuffer::AliHLTRawPage::GlobalAlloc", "data buffer handling", "refusing to allocate buffer of size %d", size);
        return NULL;
       }
index 067d022..858ef3a 100644 (file)
@@ -146,6 +146,7 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging
    * @return: pointer to target buffer if 
    */
   AliHLTUInt8_t* GetTargetBuffer(int iMinSize);
+  static unsigned int GetMaxBufferSize();
 
   /**
    * Set the segments for the data buffer.
@@ -416,6 +417,7 @@ class AliHLTDataBuffer : public TObject, public AliHLTLogging
     static int GlobalClean();
     /** adjust global page size */
     static void SetGlobalPageSize(AliHLTUInt32_t size) {fgGlobalPageSize=size;}
+    static AliHLTUInt32_t GetGlobalPageSize() {return fgGlobalPageSize;}
     /** find next page after prev, or first page */
     static AliHLTRawPage* NextPage(const AliHLTRawPage* prev=NULL);
 
index 2fd75b7..01c718d 100644 (file)
@@ -553,9 +553,15 @@ int AliHLTTask::ProcessTask(Int_t eventNo, AliHLTUInt32_t eventType, AliHLTTrigg
       iOutputDataSize=int(fInputMultiplier*iInputDataVolume) + iConstBase;
       //HLTDebug("task %s: reqired output size %d", GetName(), iOutputDataSize);
       }
+      if (iNofTrial == 0 && fpDataBuffer->GetMaxBufferSize() < iOutputDataSize) {
+        //If the estimated buffer size exceeds the maximum buffer size of AliHLTRawBuffer, decrease the buffer size.
+        //The estimation is often quite high, and GetMaxBufferSize should usually return a size that is sufficient.
+        HLTImportant("Reducing estimated output buffer size of %d to maximum output buffer size\n", iOutputDataSize);
+        iOutputDataSize = fpDataBuffer->GetMaxBufferSize();
+      }
       if (iNofTrial>0) {
        // dont process again if the buffer size is the same
-       if (iLastOutputDataSize==iOutputDataSize) break;
+       if (iLastOutputDataSize>=iOutputDataSize) break;
        HLTImportant("processing event %d again with buffer size %d", eventNo, iOutputDataSize);
       }
       AliHLTUInt8_t* pTgtBuffer=NULL;
index 1658cdd..a2783eb 100644 (file)
@@ -205,7 +205,7 @@ void AliHLTGlobalEsdConverterComponent::GetOutputDataSize(unsigned long& constBa
 {
   // see header file for class documentation
   constBase=2000000;
-  inputMultiplier=10.0;
+  inputMultiplier=3.0;
 }
 
 int AliHLTGlobalEsdConverterComponent::DoInit(int argc, const char** argv)