components return -ENOSPC if output buffer too small, second trial by the AliRoot...
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Jul 2007 19:51:02 +0000 (19:51 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Jul 2007 19:51:02 +0000 (19:51 +0000)
HLT/AUTHORS
HLT/BASE/AliHLTComponent.h
HLT/BASE/AliHLTConfiguration.cxx
HLT/BASE/AliHLTConfiguration.h
HLT/BASE/AliHLTConfigurationHandler.h
HLT/BASE/AliHLTDataBuffer.cxx
HLT/BASE/AliHLTDataSource.h
HLT/BASE/AliHLTProcessor.h
HLT/BASE/AliHLTTask.h
HLT/BASE/util/AliHLTFilePublisher.cxx
HLT/BASE/util/AliHLTFilePublisher.h

index 01ae25b..3e37824 100644 (file)
@@ -3,7 +3,8 @@ Package: ALICE HLT
 This package implements the ALICE High Level Trigger analysis framework.
 
 /**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * This package is property of and copyright by the ALICE HLT Project     * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  *                                                                        *
  * Permission to use, copy, modify and distribute this software and its   *
  * documentation strictly for non-commercial purposes is hereby granted   *
@@ -33,6 +34,8 @@ PHOS: Per Thomas Hille, Yuri Kharlov, Boris Polichtchouk, Oystein Djuvsland
 
 TRD: Mateusz Ploskon
 
+MUON: Artur Szostak, Indranil Das
+
 Further author notice will be added in conjunction with new modules.
 
 Thanks to Christian H. Christensen for help with autotools and macros.
index 04d22a3..013f341 100644 (file)
@@ -109,6 +109,7 @@ class AliHLTMemoryFile;
  * member functions for those environment dependend functions. The member 
  * functions are used by the component implementation and are re-mapped to the
  * corresponding functions.
+ *
  * @section alihltcomponent-interfaces Component interfaces
  * Each of the 3 standard component base classes AliHLTProcessor, AliHLTDataSource
  * and AliHLTDataSink provides it's own processing method (see
@@ -119,6 +120,16 @@ class AliHLTMemoryFile;
  * The @ref alihltcomponent-high-level-interface is the standard processing
  * method and will be used whenever the low-level method is not overloaded.
  *
+ * In both cases it is necessary to calculate/estimate the size of the output
+ * buffer before the processing. Output buffers can never be allocated inside
+ * the component because of the push-architecture of the HLT.
+ * For that reason the @ref GetOutputDataSize function should return a rough
+ * estimatian of the data to be produced by the component. The component is
+ * responsible for checking the memory size and must return -ENOSPC if the
+ * available buffer is to small, and update the estimator respectively. The
+ * framework will allocate a buffer of appropriate size and call the processing
+ * again.
+ *
  * @subsection alihltcomponent-high-level-interface High-level interface
  * The high-level component interface provides functionality to exchange ROOT
  * structures between components. In contrast to the 
@@ -865,7 +876,6 @@ class AliHLTComponent : public AliHLTLogging {
    * The target struct must have a 32bit struct size indicator as first member.
    * @param pStruct     target struct
    * @param iStructSize size of the struct
-   * @param pData       block data
    * @param iBlockNo    index of input block
    * @param structname  name of the struct (log messages)
    * @param eventname   name of the event (log messages)
@@ -959,6 +969,7 @@ class AliHLTComponent : public AliHLTLogging {
    * @param spec        data specification
    * @param pHeader     pointer to header
    * @param iHeaderSize size of Header
+   * @return neg. error code if failed
    */
   int InsertOutputBlock(void* pBuffer, int iBufferSize,
                        const AliHLTComponentDataType& dt,
index 868332f..aa66f42 100644 (file)
@@ -895,13 +895,25 @@ int AliHLTTask::ProcessTask(Int_t eventNo)
     }
 
     // process the event
+    int iNofTrial=0; // repeat processing if component returns -ENOSPC
+    AliHLTUInt32_t size=0;
     if (iResult>=0) {
+    do {
       long unsigned int iConstBase=0;
       double fInputMultiplier=0;
       if (pComponent->GetComponentType()!=AliHLTComponent::kSink)
        pComponent->GetOutputDataSize(iConstBase, fInputMultiplier);
-      int iOutputDataSize=int(fInputMultiplier*iInputDataVolume) + iConstBase;
+      if (fInputMultiplier<0) {
+       HLTWarning("ignoring negative input multiplier");
+       fInputMultiplier=0;
+      }
+      long unsigned int iOutputDataSize=int(fInputMultiplier*iInputDataVolume) + iConstBase;
       //HLTDebug("task %s: reqired output size %d", GetName(), iOutputDataSize);
+      if (iNofTrial>0) {
+       // dont process again if the buffer size is the same
+       if (size==iOutputDataSize) break;
+       HLTInfo("processing task %s again with buffer size %d", GetName(), iOutputDataSize);
+      }
       AliHLTUInt8_t* pTgtBuffer=NULL;
       if (iOutputDataSize>0) pTgtBuffer=fpDataBuffer->GetTargetBuffer(iOutputDataSize);
       //HLTDebug("provided raw buffer %p", pTgtBuffer);
@@ -910,7 +922,7 @@ int AliHLTTask::ProcessTask(Int_t eventNo)
       evtData.fEventID=(AliHLTEventID_t)eventNo;
       evtData.fBlockCnt=iSourceDataBlock;
       AliHLTComponentTriggerData trigData;
-      AliHLTUInt32_t size=iOutputDataSize;
+      size=iOutputDataSize;
       AliHLTUInt32_t outputBlockCnt=0;
       AliHLTComponentBlockData* outputBlocks=NULL;
       AliHLTComponentEventDoneData* edd;
@@ -920,11 +932,14 @@ int AliHLTTask::ProcessTask(Int_t eventNo)
        if (iResult>=0 && pTgtBuffer) {
          iResult=fpDataBuffer->SetSegments(pTgtBuffer, outputBlocks, outputBlockCnt);
          delete [] outputBlocks; outputBlocks=NULL; outputBlockCnt=0;
+       } else {
+         fpDataBuffer->Reset();
        }
       } else {
        HLTError("task %s: no target buffer available", GetName());
        iResult=-EFAULT;
       }
+    } while (iResult==-ENOSPC && iNofTrial++<1);
     }
 
     // now release all buffers which we have subscribed to
index 0c41a01..19553a0 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTCONFIGURATION_H
 #define ALIHLTCONFIGURATION_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTConfiguration.h
index aec210c..a3cd539 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTCONFIGURATIONHANDLER_H
 #define ALIHLTCONFIGURATIONHANDLER_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTConfigurationHandler.h
index b4f31b8..08c4577 100644 (file)
@@ -278,6 +278,9 @@ AliHLTUInt8_t* AliHLTDataBuffer::GetTargetBuffer(int iMinSize)
 {
   // see header file for function documentation
   AliHLTUInt8_t* pTargetBuffer=NULL;
+  if (fpBuffer!=NULL) {
+    HLTWarning("data buffer not properly reset, possible memory leak\n");
+  }
   fpBuffer=CreateRawBuffer(iMinSize);
   if (fpBuffer) {
     pTargetBuffer=(AliHLTUInt8_t*)fpBuffer->fPtr;
index 6977695..de266f0 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTDATASOURCE_H
 #define ALIHLTDATASOURCE_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTDataSource.h
@@ -47,7 +48,8 @@ class AliHLTDataSource : public AliHLTComponent {
    * Event processing function.
    * The method is called by the framework to process one event. After 
    * preparation of data structures. The call is redirected to GetEvent.
-   * @return neg. error code if failed
+   * @return neg. error code if failed                                <br>
+   *         -ENOSPC      output buffer too small
    */
   int DoProcessing( const AliHLTComponentEventData& evtData,
                    const AliHLTComponentBlockData* blocks, 
index 3f8cb0e..d8c8f32 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTPROCESSOR_H
 #define ALIHLTPROCESSOR_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTProcessor.h
@@ -81,7 +82,8 @@ class AliHLTProcessor : public AliHLTComponent {
    * @param size         <i>input</i>: size of target buffer
    *                     <i>output</i>:size of produced data
    * @param outputBlocks  list to receive output block descriptors
-   * @return neg. error code if failed
+   * @return neg. error code if failed                                <br>
+   *         -ENOSPC      output buffer too small
    */
   virtual int DoEvent( const AliHLTComponentEventData& evtData,
                       const AliHLTComponentBlockData* blocks, 
index b4075d2..adacd06 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTTASK_H
 #define ALIHLTTASK_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTTask.h
index bb5ceed..9c48653 100644 (file)
@@ -235,15 +235,14 @@ int AliHLTFilePublisher::DoDeinit()
   return iResult;
 }
 
-int AliHLTFilePublisher::GetEvent( const AliHLTComponentEventData& evtData,
-             AliHLTComponentTriggerData& trigData,
+int AliHLTFilePublisher::GetEvent( const AliHLTComponentEventData& /*evtData*/,
+                                  AliHLTComponentTriggerData& /*trigData*/,
              AliHLTUInt8_t* outputPtr, 
              AliHLTUInt32_t& size,
              vector<AliHLTComponentBlockData>& outputBlocks )
 {
   int iResult=0;
-  TObjLink *lnk=NULL;
-  if (fpCurrent) lnk=fpCurrent->Next();
+  TObjLink *lnk=fpCurrent;
   if (lnk==NULL) lnk=fFiles.FirstLink();
   fpCurrent=lnk;
   if (lnk) {
@@ -251,10 +250,7 @@ int AliHLTFilePublisher::GetEvent( const AliHLTComponentEventData& evtData,
     if (pFile) {
       int iCopy=pFile->GetSize();
       pFile->Seek(0);
-      if (iCopy>(int)size) {
-       iCopy=size;
-       HLTWarning("buffer to small, data of file %s truncated", pFile->GetName());
-      }
+      if (iCopy<=(int)size) {
       if (pFile->ReadBuffer((char*)outputPtr, iCopy)!=0) {
        // ReadBuffer returns 1 in case of failure and 0 in case of success
        iResult=-EIO;
@@ -269,6 +265,11 @@ int AliHLTFilePublisher::GetEvent( const AliHLTComponentEventData& evtData,
        outputBlocks.push_back(bd);
        size=iCopy;
       }
+      } else {
+       // output buffer too small, update GetOutputDataSize for the second trial
+       fMaxSize=iCopy;
+       iResult=-ENOSPC;
+      }
     } else {
       HLTError("no file available");
       iResult=-EFAULT;
@@ -276,9 +277,8 @@ int AliHLTFilePublisher::GetEvent( const AliHLTComponentEventData& evtData,
   } else {
     iResult=-ENOENT;
   }
-  if (evtData.fStructSize==0 && trigData.fStructSize==0) {
-    // this is just to get rid of the warning "unused parameter"
-  }
+  if (iResult>=0 && fpCurrent) fpCurrent=fpCurrent->Next();
+
   return iResult;
 }
 
index d11deba..1dc04da 100644 (file)
@@ -3,7 +3,8 @@
 
 #ifndef ALIHLTFILEPUBLISHER_H
 #define ALIHLTFILEPUBLISHER_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  * See cxx source for full Copyright notice                               */
 
 /** @file   AliHLTFilePublisher.h