]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Making the TArrayL64 member variable of the AliHLTGlobalTrigger base class a dynamic...
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 30 Sep 2009 21:53:01 +0000 (21:53 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 30 Sep 2009 21:53:01 +0000 (21:53 +0000)
There have been problems in the contructor and potential memory corruption due to this class
See https://savannah.cern.ch/bugs/?56302

HLT/trigger/AliHLTGlobalTrigger.cxx
HLT/trigger/AliHLTGlobalTrigger.h
HLT/trigger/AliHLTGlobalTriggerComponent.cxx

index e931ebbc89322f14b6b78be8e92c4274ab470ac5..26238d4c23fcf6479081c1fc5b312d6082176112 100644 (file)
@@ -1,4 +1,4 @@
-// $Id:$
+// $Id$
 /**************************************************************************
  * This file is property of and copyright by the ALICE HLT Project        *
  * ALICE Experiment at CERN, All rights reserved.                         *
 
 #include "AliHLTGlobalTrigger.h"
 #include "AliHLTGlobalTriggerDecision.h"
+#include "TArrayL64.h"
+#include "TClonesArray.h"
 #include <cstring>
+#include <cassert>
 
 ClassImp(AliHLTGlobalTrigger)
 
@@ -37,8 +40,8 @@ AliHLTGlobalTrigger::Factory::fFactory[AliHLTGlobalTrigger::Factory::kMaxFactori
 
 
 AliHLTGlobalTrigger::AliHLTGlobalTrigger() :
-  AliHLTLogging(),
-  fCounters()
+  AliHLTLogging()
+  , fCounters(NULL)
 {
   // Default constructor.
 }
@@ -47,6 +50,9 @@ AliHLTGlobalTrigger::AliHLTGlobalTrigger() :
 AliHLTGlobalTrigger::~AliHLTGlobalTrigger()
 {
   // Default destructor.
+  if (fCounters) {
+    delete fCounters;
+  }
 }
 
 
@@ -106,10 +112,24 @@ void AliHLTGlobalTrigger::ResetCounters(UInt_t number)
 {
   // Resets the trigger counters.
   
-  fCounters.Set(number);
+  if (!fCounters) fCounters = new TArrayL64(number);
+  if (!fCounters) return;
+
+  fCounters->Set(number);
   for (UInt_t i = 0; i < number; i++)
   {
-    fCounters[i] = 0;
+    (*fCounters)[i] = 0;
   }
 }
 
+void AliHLTGlobalTrigger::IncrementCounter(UInt_t i) 
+{
+  // increment a specific counter
+  if (fCounters && i<fCounters->GetSize()) ++(*fCounters)[i]; 
+}
+
+Long64_t AliHLTGlobalTrigger::GetCounter(UInt_t i) const
+{
+  if (fCounters && i<fCounters->GetSize()) return (*fCounters)[i];
+  return 0;
+}
index b076f5b240c7324687686d60c8256e9ecbc07d65..0cbe1ebbd69dfbd63e0e09bc145b7ea22948765f 100644 (file)
@@ -1,5 +1,5 @@
 //-*- Mode: C++ -*-
-// $Id:$
+// $Id$
 #ifndef ALIHLTGLOBALTRIGGER_H
 #define ALIHLTGLOBALTRIGGER_H
 /* This file is property of and copyright by the ALICE HLT Project        *
@@ -12,7 +12,6 @@
 /// @brief  Declaration of the AliHLTGlobalTrigger base class.
 
 #include "TObject.h"
-#include "TArrayL64.h"
 #include "AliHLTDataTypes.h"
 #include "AliHLTLogging.h"
 
@@ -21,6 +20,7 @@ class AliHLTTriggerDecision;
 class AliHLTGlobalTriggerDecision;
 class AliHLTTriggerMenu;
 class TClonesArray;
+class TArrayL64;
 
 /**
  * \class AliHLTGlobalTrigger
@@ -94,8 +94,8 @@ class AliHLTGlobalTrigger : public AliHLTLogging
   /**
    * Returns the array of trigger counters.
    */
-  const TArrayL64& Counters() const { return fCounters; }
-  
+  const TArrayL64* Counters() const { return fCounters; }
+
  protected:
   
   /**
@@ -146,26 +146,25 @@ class AliHLTGlobalTrigger : public AliHLTLogging
     static Factory* fFactory[kMaxFactories];
   };
   
-  /// Not implemented. Do not allow copying of this object.
-  AliHLTGlobalTrigger(const AliHLTGlobalTrigger& obj);
-  /// Not implemented. Do not allow copying of this object.
-  AliHLTGlobalTrigger& operator = (const AliHLTGlobalTrigger& obj);
-  
   /**
    * Increments a trigger counter by one.
    * \param i  The counter to increment.
    */
-  void IncrementCounter(UInt_t i) { ++fCounters[i]; };
+  void IncrementCounter(UInt_t i);
   
   /**
    * Returns a trigger counter's value.
    * \param i  The counter number to return.
    */
-  Long64_t GetCounter(UInt_t i) const { return fCounters[i]; };
+  Long64_t GetCounter(UInt_t i) const;
   
  private:
-  
-  TArrayL64 fCounters; //! Event trigger counters. One counter for each trigger class.
+  /// Not implemented. Do not allow copying of this object.
+  AliHLTGlobalTrigger(const AliHLTGlobalTrigger& obj);
+  /// Not implemented. Do not allow copying of this object.
+  AliHLTGlobalTrigger& operator = (const AliHLTGlobalTrigger& obj);
+
+  TArrayL64* fCounters; //! Event trigger counters. One counter for each trigger class.
   
   ClassDef(AliHLTGlobalTrigger, 0) // Global HLT trigger base class which implements logic for a particular trigger menu.
 };
index 01de4fe74b878a46fa252e255b99d85ee7a6d4fe..837aabebce48dc736607882ccfd5a7d0921b9d99 100644 (file)
@@ -344,7 +344,10 @@ int AliHLTGlobalTriggerComponent::DoTrigger()
     decision.ReadoutList(maskedList);
   }
 
-  decision.SetCounters(fTrigger->Counters(), GetEventCount()+1);
+  const TArrayL64* counters=fTrigger->Counters();
+  if (counters) {
+    decision.SetCounters(*counters, GetEventCount()+1);
+  }
   static UInt_t lastTime=0;
   TDatime time;
   if (time.Get()-lastTime>5) {
@@ -843,8 +846,9 @@ int AliHLTGlobalTriggerComponent::PrintStatistics(const AliHLTGlobalTrigger* pTr
 {
   // print some statistics
   ULong64_t count=0;
-  for (int i=0; i<pTrigger->Counters().GetSize(); i++) {
-    count+=pTrigger->Counters()[i];
+  const TArrayL64* counters=pTrigger->Counters();
+  for (int i=0; counters!=NULL && i<counters->GetSize(); i++) {
+    count+=(*counters)[i];
   }
   int totalEvents=GetEventCount()+offset;
   float ratio=0;