/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ #include "AliOnlineRecoTrigger.h" #include #include "AliLog.h" #ifdef ALI_DATE #include "SORNotifier.h" #endif ClassImp(TerminateSignalHandler) ClassImp(AliOnlineRecoTrigger) //______________________________________________________________________________________________ Bool_t TerminateSignalHandler::Notify() { // Sentd terminate command to the Shuttle trigger AliInfo("Terminate signal received ..."); fTrigger->Terminate(); return kTRUE; } //______________________________________________________________________________________________ AliOnlineRecoTrigger::AliOnlineRecoTrigger(): fNotified(kFALSE), fTerminate(kFALSE), fMutex(), fCondition(&fMutex), fQuitSignalHandler(0), fInterruptSignalHandler(0) { // Default constructor // fQuitSignalHandler = new TerminateSignalHandler(this, kSigQuit); fInterruptSignalHandler = new TerminateSignalHandler(this, kSigInterrupt); gSystem->AddSignalHandler(fQuitSignalHandler); gSystem->AddSignalHandler(fInterruptSignalHandler); } //______________________________________________________________________________________________ AliOnlineRecoTrigger::~AliOnlineRecoTrigger() { // destructor gSystem->RemoveSignalHandler(fQuitSignalHandler); gSystem->RemoveSignalHandler(fInterruptSignalHandler); delete fQuitSignalHandler; fQuitSignalHandler = 0; delete fInterruptSignalHandler; fInterruptSignalHandler = 0; } //______________________________________________________________________________________________ Bool_t AliOnlineRecoTrigger::Notify() { // // The method is called automaticly by SORNotifier on "start of run" // notification event from ECS // fMutex.Lock(); fNotified = kTRUE; fCondition.Signal(); fMutex.UnLock(); return kTRUE; } //______________________________________________________________________________________________ void AliOnlineRecoTrigger::Terminate() { // // Stop triggers listen mode and exist from Run() // Usually called automaticly by TerminateSignalHandler. // fTerminate = kTRUE; fCondition.Signal(); } //______________________________________________________________________________________________ Int_t AliOnlineRecoTrigger::Run() { // // AliOnlineRecoTrigger main loop for asynchronized (listen) mode. // It spawns DIM service listener and waits for DAQ "start of run" // notification. // fTerminate = kFALSE; #ifdef ALI_DATE SORNotifier* notifier = new SORNotifier(this); #endif Int_t received=0; AliInfo("Listening for ECS SOR trigger"); fMutex.Lock(); while (!(fNotified || fTerminate)) { received=fCondition.TimedWaitRelative(1000*86400); //wait 24h if (received==1) break; // 1 = timeout } fNotified = kFALSE; fMutex.UnLock(); Int_t run = -1; #ifdef ALI_DATE run = notifier->GetRun(); delete notifier; #endif if (fTerminate) { AliInfo("Terminated."); return -1; } if (received == 0) { AliInfo("Trigger from ECS received!"); if (run < 0) { AliError("Invalid run number received!"); return -1; } return run; } else if (received == 1) { AliWarning("Timeout waiting for trigger!"); return -1; } else { AliError("Error receiving trigger from ECS!"); return -1; } }