Adding interruption handler to the DATE online raw-data reader. Will be used by the...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 7 Sep 2009 11:11:04 +0000 (11:11 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 7 Sep 2009 11:11:04 +0000 (11:11 +0000)
RAW/AliRawReaderDateOnline.cxx
RAW/AliRawReaderDateOnline.h

index 242b230..db47ba3 100644 (file)
@@ -27,6 +27,7 @@
 ///
 /// Cvetan Cheshkov 1/04/2008
 ///////////////////////////////////////////////////////////////////////////////
+#include <TSystem.h>
 
 #include "AliRawReaderDateOnline.h"
 #include "AliLog.h"
@@ -44,7 +45,8 @@ AliRawReaderDateOnline::AliRawReaderDateOnline(
                                   const char* /* filename */
 #endif
                                   ) :
-  AliRawReaderDate((void*)NULL)
+  AliRawReaderDate((void*)NULL),
+  fStop(kFALSE)
 {
 
 // Constructor
@@ -80,6 +82,9 @@ AliRawReaderDateOnline::AliRawReaderDateOnline(
                             NULL, NULL, NULL, NULL};
   monitorDeclareTableExtended(const_cast<char**>(table));
 
+  // install SIGUSR1 handler to allow clean end-of-events loop
+  gSystem->AddSignalHandler(new AliRawReaderDateIntHandler(this));
+
 #else
   Fatal("AliRawReaderDateOnline", "this class was compiled without DATE");
 #endif
@@ -92,6 +97,12 @@ Bool_t AliRawReaderDateOnline::NextEvent()
 
 #ifdef ALI_DATE
 
+  // Stop on SIGUSR1
+  if (fStop) {
+    AliInfo("Raw-data reading stopped by SIGUSR1");
+    return kFALSE;
+  }
+
   // Event already loaded no need take a new one
   if (AliRawReaderDate::NextEvent()) return kTRUE;
 
@@ -193,3 +204,11 @@ void AliRawReaderDateOnline::SelectEvents(Int_t type,
 #endif
   AliRawReader::SelectEvents(type,triggerMask,triggerExpr);
 }
+
+//______________________________________________________________________________
+void AliRawReaderDateOnline::Stop()
+{
+  // Stop the event loop (called on SIGUSR1)
+
+  fStop = kTRUE; 
+}
index 8f26b39..23042b3 100644 (file)
@@ -18,6 +18,8 @@
 /// Cvetan Cheshkov 1/04/2008
 ///////////////////////////////////////////////////////////////////////////////
 
+#include <TSysEvtHandler.h>
+
 #include "AliRawReaderDate.h"
 
 class AliRawReaderDateOnline: public AliRawReaderDate {
@@ -33,13 +35,37 @@ class AliRawReaderDateOnline: public AliRawReaderDate {
     // activated only for AliRawReaderDateOnline.
     virtual Bool_t   UseAutoSaveESD() const { return kTRUE; }
 
+    // Method triggered by signal hanlder
+    // Set fStop to false in which case
+    // NextEvent() returns fFALSE and the
+    // processing of raw data stops
+    virtual void     Stop();
+
   protected:
+    class AliRawReaderDateIntHandler : public TSignalHandler {
+    public:
+    AliRawReaderDateIntHandler(AliRawReaderDateOnline *rawReader):
+      TSignalHandler(kSigUser1, kFALSE), fRawReader(rawReader) { }
+      Bool_t Notify() {
+       Info("Notify", "received a SIGUSR1 signal");
+       fRawReader->Stop();
+       return kTRUE;
+      }
+    private:
+      AliRawReaderDateOnline *fRawReader;   // raw-reader to signal
+
+      AliRawReaderDateIntHandler(const AliRawReaderDateIntHandler& handler); // Not implemented
+      AliRawReaderDateIntHandler& operator=(const AliRawReaderDateIntHandler& handler); // Not implemented
+    };
+
     virtual void     SelectEvents(Int_t type, ULong64_t triggerMask = 0, const char *triggerExpr = NULL);
 
   private:
     AliRawReaderDateOnline(const AliRawReaderDateOnline& rawReader);
     AliRawReaderDateOnline& operator = (const AliRawReaderDateOnline& rawReader);
 
+    Bool_t           fStop; // raw-reader signaled to stop
+
     ClassDef(AliRawReaderDateOnline, 0) // class for reading DATE raw data from shared memory
 };