Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "TGo4AnalysisMainRunnable.h"
00015
00016 #include <stdexcept>
00017
00018 #include "TGo4Log.h"
00019 #include "TGo4LockGuard.h"
00020 #include "TGo4Thread.h"
00021 #include "TGo4Task.h"
00022 #include "TGo4Command.h"
00023
00024 #include "TGo4AnalysisClientImp.h"
00025 #include "TGo4AnalysisImp.h"
00026 #include "TGo4CommandInvoker.h"
00027 #include "TGo4EventErrorException.h"
00028 #include "TGo4EventTimeoutException.h"
00029 #include "TGo4AnalysisStepException.h"
00030 #include "TGo4UserException.h"
00031 #include "TGo4EventEndException.h"
00032 #include "TGo4DynamicListException.h"
00033
00034 const UInt_t TGo4AnalysisMainRunnable::fguPOLLINTERVAL=1000;
00035
00036 TGo4AnalysisMainRunnable::TGo4AnalysisMainRunnable(const char* name, TGo4AnalysisClient* cli) :
00037 TGo4Runnable(name,cli->GetTask()),
00038 fxAnalysisClient(cli)
00039 {
00040 fxAnalysis = cli->GetAnalysis();
00041 }
00042
00043 TGo4AnalysisMainRunnable::~TGo4AnalysisMainRunnable()
00044 {
00045
00046 }
00047
00048 Int_t TGo4AnalysisMainRunnable::PostRun(void * )
00049 {
00050
00051 if (fxAnalysisClient && fxAnalysisClient->MainIsRunning() && !fxAnalysisClient->IsServer()) fxAnalysis->PostLoop();
00052
00053
00054
00055
00056
00057 return 0;
00058 }
00059
00060 Int_t TGo4AnalysisMainRunnable::PreRun(void * )
00061 {
00062 GO4TRACE((12,"TGo4AnalysisMainRunnable::PreRun()",__LINE__, __FILE__));
00063
00064
00065
00066
00067 return 0;
00068 }
00069
00070 Int_t TGo4AnalysisMainRunnable::Run(void*)
00071 {
00072
00073
00074 try
00075 {
00076 TGo4Command* com = fxAnalysisClient->NextCommand();
00077
00078 if(com)
00079 {
00080 if( com->GetCommandID() != TGo4Task::Get_fgiTERMID() )
00081 {
00082
00086 TMutex* smutex=fxAnalysisClient->GetTask()->GetStatusBufferMutex();
00087 TGo4LockGuard buflock(smutex);
00088 TMutex* tmutex=fxAnalysisClient->GetTaskManagerMutex();
00089 TGo4LockGuard tasklock(tmutex);
00090
00091 TGo4LockGuard mainlock;
00093 TGo4CommandInvoker::Instance()->Invoke(com);
00094 delete com;
00095 }
00096 else
00097 {
00098
00099
00100 GetThread()->Stop();
00101 }
00102
00103 }
00104 else
00105 {
00106
00107
00108
00109 if(fxAnalysisClient->MainIsRunning())
00110 {
00111
00112 if(!fxAnalysisClient->IsCintMode())
00113 fxAnalysis->MainCycle();
00114 }
00115 else
00116 {
00117
00118 TGo4Thread::Sleep(fguPOLLINTERVAL);
00119 }
00120
00121 }
00122 return 0;
00123 }
00124
00126
00127 catch(TGo4EventTimeoutException& ex)
00128 {
00129 ex.Handle();
00130 if(TGo4Log::GetIgnoreLevel()<1)
00131 {
00132
00133 fxAnalysisClient->SendStatusMessage(2,kTRUE, TString::Format(
00134 "Analysis %s TIMEOUT for event source %s:%s.",
00135 fxAnalysisClient->GetName(), ex.GetSourceClass(), ex.GetSourceName()));
00136 } else{}
00137 return 0;
00138 }
00139 catch(TGo4EventEndException& ex)
00140 {
00141 fxAnalysisClient->SendStatusMessage(2,kTRUE,TString::Format(
00142 "End of event source %s:\n %s - %s",
00143 ex.GetSourceClass(),
00144 ex.GetSourceName(),ex.GetErrMess()));
00145 if(fxAnalysis->IsErrorStopEnabled()) fxAnalysisClient->Stop();
00146 }
00147 catch(TGo4EventErrorException& ex)
00148 {
00149
00150 Int_t prio=ex.GetPriority();
00151 if(prio==0)
00152 {
00153
00154 fxAnalysisClient->SendStatusMessage(1,kTRUE,TString::Format(
00155 "Event source %s:\n %s - %s",
00156 ex.GetSourceClass(),
00157 ex.GetSourceName(),ex.GetErrMess()));
00158 }
00159 else
00160 {
00161 fxAnalysisClient->SendStatusMessage(3,kTRUE,TString::Format(
00162 "Analysis %s ERROR: %s from event source %s:%s",
00163 fxAnalysisClient->GetName(),ex.GetErrMess(),
00164 ex.GetSourceClass(), ex.GetSourceName()));
00165 if(fxAnalysis->IsErrorStopEnabled()) fxAnalysisClient->Stop();
00166 }
00167 return 0;
00168 }
00169
00170 catch(TGo4DynamicListException& ex)
00171 {
00172 ex.Handle();
00173 fxAnalysisClient->SendStatusMessage(3,kTRUE,TString::Format(
00174 "Analysis %s ERROR: %s from dynamic list entry %s:%s",
00175 fxAnalysisClient->GetName(),ex.GetStatusMessage(),
00176 ex.GetEntryName(), ex.GetEntryClass()));
00177 if(fxAnalysis->IsErrorStopEnabled())
00178 fxAnalysisClient->Stop();
00179 return 0;
00180 }
00181
00182 catch(TGo4AnalysisStepException& ex)
00183 {
00184 ex.Handle();
00185 fxAnalysisClient->SendStatusMessage(3,kTRUE,TString::Format(
00186 "Analysis %s ERROR: %s in Analysis Step %s",
00187 fxAnalysisClient->GetName(), ex.GetStatusMessage(), ex.GetStepName()));
00188 if(fxAnalysis->IsErrorStopEnabled())
00189 fxAnalysisClient->Stop();
00190 return 0;
00191 }
00192
00193 catch(TGo4UserException& ex)
00194 {
00195
00196 if(strlen(ex.GetMessage())!=0)
00197 fxAnalysisClient->SendStatusMessage(ex.GetPriority(),kTRUE, ex.GetMessage());
00198 if(fxAnalysis->IsErrorStopEnabled() && ex.GetPriority()>2)
00199 fxAnalysisClient->Stop();
00200 return 0;
00201 }
00202
00203 catch(std::exception& ex)
00204 {
00205 fxAnalysisClient->SendStatusMessage(3,kTRUE,TString::Format(
00206 "Analysis %s got standard exception %s",
00207 fxAnalysisClient->GetName(), ex.what()));
00208 if(fxAnalysis->IsErrorStopEnabled())
00209 fxAnalysisClient->Stop();
00210 return 0;
00211 }
00212
00214 return 0;
00215 }