fixing HLT re-initialization
authortbreitne <timo.gunther.breitner@cern.ch>
Mon, 29 Sep 2014 15:34:48 +0000 (17:34 +0200)
committertbreitne <timo.gunther.breitner@cern.ch>
Mon, 29 Sep 2014 15:48:37 +0000 (17:48 +0200)
After a reconstruction run the (global) HLT component handler is
destroyed but still referenced by the various module agents. During
subsequent runs a new component handler can't be registered with the
agents which leaves HLT system in error state (component registration
fails).

Now the component handler is properly deregistered from the agents
on destruction.

HLT/BASE/AliHLTComponentHandler.cxx
HLT/BASE/AliHLTComponentHandler.h
HLT/BASE/AliHLTModuleAgent.h
HLT/BASE/AliHLTPluginBase.cxx
HLT/BASE/AliHLTSystem.cxx
HLT/MUON/OfflineInterface/AliHLTMUONAgent.cxx
HLT/MUON/OfflineInterface/AliHLTMUONAgent.h

index 0d833c6..6151d2d 100644 (file)
@@ -98,6 +98,7 @@ AliHLTComponentHandler::AliHLTComponentHandler(AliHLTAnalysisEnvironment* pEnv)
 AliHLTComponentHandler::~AliHLTComponentHandler()
 {
   // destructor
+  DeactivateAgents();
   DeleteOwnedComponents();
   UnloadLibraries();
   if (fRunType) delete [] fRunType;
@@ -639,6 +640,18 @@ int AliHLTComponentHandler::ActivateAgents(const char* library, const char* blac
   return agents.size();
 }
 
+int AliHLTComponentHandler::DeactivateAgents() const {
+  int ret=0;
+  for (AliHLTModuleAgent* pAgent=AliHLTModuleAgent::GetFirstAgent();
+       pAgent!=NULL; pAgent=AliHLTModuleAgent::GetNextAgent()) {
+    if(pAgent->GetComponentHandler()==this){
+      pAgent->ActivateComponentHandler(NULL);
+      ++ret;
+    }
+  }
+  return ret;
+}
+
 int AliHLTComponentHandler::DeleteOwnedComponents()
 {
   // delete all component samples owned by the handler
index 9c84ff6..74af823 100644 (file)
@@ -300,6 +300,12 @@ class AliHLTComponentHandler : public AliHLTLogging {
    */
   int ActivateAgents(const char* library=NULL, const char* blackList=NULL);
 
+  /**
+   * Loop through all the agents and deregister this instance if neccessary.
+   */
+
+  int DeactivateAgents() const;
+
 public:
   /**
    * Compound descriptor for component libraries - must be public 
index 5748cd6..0513a23 100644 (file)
@@ -388,6 +388,13 @@ class AliHLTModuleAgent : public TObject, public AliHLTLogging {
     return GetReconstructionChains(NULL,runloader);
   }
 
+  /**
+   * Get current component handler
+   */
+  AliHLTComponentHandler* GetComponentHandler() const {
+    return fpComponentHandler;
+  }
+
  protected:
 
  private:
index 3f6c8fb..ad19cb3 100644 (file)
@@ -44,6 +44,7 @@ AliHLTPluginBase::~AliHLTPluginBase()
   // see header file for class documentation
   if (--fNofInstances<=0) {
     delete fpSystem;
+    fpSystem=NULL;
 
     // 2010-04-07 not sure whether this is the best place for
     // the global cleanup of memory pages. In case of AliReconstruction
@@ -53,7 +54,6 @@ AliHLTPluginBase::~AliHLTPluginBase()
     // when we arrive at this point.
     AliHLTDataBuffer::AliHLTRawPage::GlobalClean();
   }
-  fpSystem=NULL;
 }
 
 void AliHLTPluginBase::InitInstance()
index 222605a..e6eca33 100644 (file)
@@ -104,7 +104,6 @@ AliHLTSystem::AliHLTSystem(AliHLTComponentLogSeverity loglevel, const char* name
     // AliHLTSystem is used in multiple instances for the kChain HLTOUT handler
     //HLTWarning("multiple instances of AliHLTSystem, you should not use more than one at a time");
   }
-
   SetGlobalLoggingLevel(loglevel);
   SetFrameworkLog(loglevel);
   if (fpComponentHandler) {
index 381514f..4abfc14 100644 (file)
@@ -53,8 +53,6 @@
 // The single global instance of the dimuon HLT agent.
 AliHLTMUONAgent AliHLTMUONAgent::fgkInstance;
 
-AliHLTOUTHandlerChain AliHLTMUONAgent::fgkESDMakerChain("libAliHLTMUON.so chains=dHLT-make-esd");
-AliHLTOUTHandlerChain AliHLTMUONAgent::fgkRootifyDumpChain("libAliHLTMUON.so chains=dHLT-rootify-and-dump");
 AliHLTOUTHandlerIgnore AliHLTMUONAgent::fgkDataIgnoreHandler;
 Int_t AliHLTMUONAgent::fgMuonModuleLoaded = 0;
 bool AliHLTMUONAgent::fgRunRootifyChain = false;
@@ -91,7 +89,9 @@ bool AliHLTMUONAgent::IsMuonModuleLoaded()
 }
 
 
-AliHLTMUONAgent::AliHLTMUONAgent() : AliHLTModuleAgent("MUON")
+AliHLTMUONAgent::AliHLTMUONAgent() : AliHLTModuleAgent("MUON"),
+                                    fgkESDMakerChain(NULL),
+                                    fgkRootifyDumpChain(NULL)
 {
        ///
        /// Default constructor.
@@ -587,7 +587,10 @@ AliHLTOUTHandler* AliHLTMUONAgent::GetOutputHandler(
            dt == AliHLTMUONConstants::TracksBlockDataType()
           )
        {
-               return &fgkESDMakerChain;
+         if(fgkESDMakerChain==NULL){
+           fgkESDMakerChain=new AliHLTOUTHandlerChain("libAliHLTMUON.so chains=dHLT-make-esd");
+         }
+         return fgkESDMakerChain;
        }
 
        if (dt == AliHLTMUONConstants::TriggerRecordsBlockDataType() or
@@ -604,7 +607,10 @@ AliHLTOUTHandler* AliHLTMUONAgent::GetOutputHandler(
        {
                if (fgRunRootifyChain)
                {
-                       return &fgkRootifyDumpChain;
+                 if(fgkRootifyDumpChain==NULL){
+                   fgkRootifyDumpChain=new AliHLTOUTHandlerChain("libAliHLTMUON.so chains=dHLT-rootify-and-dump");
+                 }
+                 return fgkRootifyDumpChain;
                }
                else
                {
@@ -623,18 +629,19 @@ AliHLTOUTHandler* AliHLTMUONAgent::GetOutputHandler(
 
 int AliHLTMUONAgent::DeleteOutputHandler(AliHLTOUTHandler* pInstance)
 {
-       /// Deletes the HLTOUT handlers. In this case since the handlers are
-       /// allocated statically, we just check that the right pointer was
-       /// given and exit.
-       
        HLTDebug("Trying to delete HLTOUT handler: %p", pInstance);
        
-       if (pInstance != &fgkESDMakerChain or pInstance != &fgkRootifyDumpChain
-           or pInstance != &fgkDataIgnoreHandler
-          )
-       {
-               return -EINVAL;
+       if (pInstance==NULL) return -EINVAL;
+
+       if (pInstance==fgkESDMakerChain) {
+         delete fgkESDMakerChain;
+         fgkESDMakerChain=NULL;
        }
-       
+
+       if (pInstance==fgkRootifyDumpChain) {
+         delete fgkRootifyDumpChain;
+         fgkRootifyDumpChain=NULL;
+       }
+
        return 0;
 }
index 9e529b9..2d07fbd 100644 (file)
@@ -115,11 +115,14 @@ public:
        static void RunRootifyChain(bool value) { fgRunRootifyChain = value; }
        
 private:
+       AliHLTMUONAgent(const AliHLTMUONAgent&);
+       AliHLTMUONAgent& operator=(const AliHLTMUONAgent&);
+
        // The following instance is used for automatic agent and component registration.
        static AliHLTMUONAgent fgkInstance;  ///< The single global instance of the dimuon HLT agent.
        
-       static AliHLTOUTHandlerChain  fgkESDMakerChain;  ///< Chain handler for converting dHLT raw data to ESD format.
-       static AliHLTOUTHandlerChain  fgkRootifyDumpChain;  ///< Chain handler for converting dHLT raw data to ROOT objects and dumping to file.
+       AliHLTOUTHandlerChain*  fgkESDMakerChain;  ///< Chain handler for converting dHLT raw data to ESD format.
+       AliHLTOUTHandlerChain*  fgkRootifyDumpChain;  ///< Chain handler for converting dHLT raw data to ROOT objects and dumping to file.
        static AliHLTOUTHandlerIgnore fgkDataIgnoreHandler;  ///< HLTOUT handler for ignoring data blocks.
 
        static Int_t fgMuonModuleLoaded; ///< Cached flag for indicating if the MUON module was loaded for a simulation.