]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - SHUTTLE/AliShuttleTrigger.cxx
in AliShuttleTrigger:
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleTrigger.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*
17 $Log$
18 Revision 1.13 2006/11/16 16:16:48 jgrosseo
19 introducing strict run ordering flag
20 removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
21
22 Revision 1.12 2006/10/20 15:22:59 jgrosseo
23 o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
24 o) Merging Collect, CollectAll, CollectNew function
25 o) Removing implementation of empty copy constructors (declaration still there!)
26
27 Revision 1.11 2006/10/02 16:38:39 jgrosseo
28 update (alberto):
29 fixed memory leaks
30 storing of objects that failed to be stored to the grid before
31 interfacing of shuttle status table in daq system
32
33 Revision 1.10 2006/08/15 10:50:00 jgrosseo
34 effc++ corrections (alberto)
35
36 Revision 1.9 2006/08/08 14:19:29 jgrosseo
37 Update to shuttle classes (Alberto)
38
39 - Possibility to set the full object's path in the Preprocessor's and
40 Shuttle's Store functions
41 - Possibility to extend the object's run validity in the same classes
42 ("startValidity" and "validityInfinite" parameters)
43 - Implementation of the StoreReferenceData function to store reference
44 data in a dedicated CDB storage.
45
46 Revision 1.8 2006/07/21 07:37:20 jgrosseo
47 last run is stored after each run
48
49 Revision 1.7 2006/07/20 09:54:40 jgrosseo
50 introducing status management: The processing per subdetector is divided into several steps,
51 after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
52 can keep track of the number of failures and skips further processing after a certain threshold is
53 exceeded. These thresholds can be configured in LDAP.
54
55 Revision 1.6 2006/07/19 10:09:55 jgrosseo
56 new configuration, accesst to DAQ FES (Alberto)
57
58 Revision 1.5 2006/07/10 13:01:41 jgrosseo
59 enhanced storing of last sucessfully processed run (alberto)
60
61 Revision 1.4 2006/07/04 14:59:57 jgrosseo
62 revision of AliDCSValue: Removed wrapper classes, reduced storage size per value by factor 2
63
64 Revision 1.3 2006/06/12 09:11:16 jgrosseo
65 coding conventions (Alberto)
66
67 Revision 1.2 2006/06/06 14:26:40 jgrosseo
68 o) removed files that were moved to STEER
69 o) shuttle updated to follow the new interface (Alberto)
70
71 Revision 1.1 2006/03/07 07:52:34 hristov
72 New version (B.Yordanov)
73
74 Revision 1.5 2005/11/21 09:03:48 byordano
75 one more print added
76
77 Revision 1.4 2005/11/20 10:12:37 byordano
78 comments added to AliShuttleTrigger
79
80 */
81
82
83//
84// This class is to deal with DAQ LogBook and DAQ "end of run" notification.
85// It has severeal two modes:
86// 1) synchronized - Collect()
87// 2) asynchronized - Run() - starts listening for DAQ "end of run"
88// notification by DIM service.
89//
90
91#include "AliShuttleTrigger.h"
92
93#include <TSystem.h>
94
95#include "AliLog.h"
96#include "AliShuttleConfig.h"
97#include "AliShuttle.h"
98#include "DATENotifier.h"
99
100ClassImp(TerminateSignalHandler)
101ClassImp(AliShuttleTrigger)
102
103//______________________________________________________________________________________________
104Bool_t TerminateSignalHandler::Notify()
105{
106// Sentd terminate command to the Shuttle trigger
107
108 AliInfo("Terminate signal received ...");
109 fTrigger->Terminate();
110
111 return kTRUE;
112}
113
114//______________________________________________________________________________________________
115AliShuttleTrigger::AliShuttleTrigger(const AliShuttleConfig* config,
116 UInt_t timeout, Int_t retries):
117 fConfig(config), fShuttle(NULL),
118 fNotified(kFALSE), fTerminate(kFALSE),
119 fMutex(), fCondition(&fMutex),
120 fQuitSignalHandler(0),
121 fInterruptSignalHandler(0)
122{
123 //
124 // config - pointer to the AliShuttleConfig object which represents
125 // the configuration
126 // mainStorage - pointer to AliCDBStorage for the undelying CDBStorage
127 // localStorage (local) CDB storage to be used if mainStorage is unavailable
128 //
129
130 if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
131 fShuttle = new AliShuttle(config, timeout, retries);
132
133 TerminateSignalHandler* fQuitSignalHandler = new TerminateSignalHandler(this, kSigQuit);
134 TerminateSignalHandler* fInterruptSignalHandler = new TerminateSignalHandler(this, kSigInterrupt);
135
136 gSystem->AddSignalHandler(fQuitSignalHandler);
137 gSystem->AddSignalHandler(fInterruptSignalHandler);
138
139}
140
141//______________________________________________________________________________________________
142AliShuttleTrigger::~AliShuttleTrigger()
143{
144 // destructor
145
146 gSystem->RemoveSignalHandler(fQuitSignalHandler);
147 gSystem->RemoveSignalHandler(fInterruptSignalHandler);
148
149 delete fShuttle;
150
151 delete fQuitSignalHandler;
152 fQuitSignalHandler = 0;
153
154 delete fInterruptSignalHandler;
155 fInterruptSignalHandler = 0;
156}
157
158//______________________________________________________________________________________________
159Bool_t AliShuttleTrigger::Notify() {
160 //
161 // Trigger Collect() methods in asynchronized (listen) mode.
162 // Usually called automaticly by DATENotifier on "end of run"
163 // notification event.
164 //
165
166 fMutex.Lock();
167
168 fNotified = kTRUE;
169 fCondition.Signal();
170
171 fMutex.UnLock();
172
173 return kTRUE;
174}
175
176//______________________________________________________________________________________________
177void AliShuttleTrigger::Terminate() {
178 //
179 // Stop triggers listen mode and exist from Run()
180 // Usually called automaticly by TerminateSignalHandler.
181 //
182
183 fTerminate = kTRUE;
184 fCondition.Signal();
185}
186
187//______________________________________________________________________________________________
188void AliShuttleTrigger::Run() {
189 //
190 // AliShuttleTrigger main loop for asynchronized (listen) mode.
191 // It spawns DIM service listener and waits for DAQ "end of run"
192 // notification. Calls Collect() on notification.
193 //
194
195 fTerminate = kFALSE;
196
197 DATENotifier* notifier = new DATENotifier(this, "/DATE/LOGBOOK/UPDATE");
198
199 Int_t nTry=0;
200
201 while (1) {
202
203 fMutex.Lock();
204
205 while (!(fNotified || fTerminate)) {
206 if (fCondition.TimedWaitRelative(1000*fConfig->GetTriggerWait()) == 1)
207 break; // 1 = timeout
208 }
209
210 fNotified = kFALSE;
211
212 fMutex.UnLock();
213
214 if (fTerminate) {
215 AliInfo("Terminated.");
216 break;
217 }
218
219 // TODO Check this!
220 //nTry++;
221 //AliInfo(Form("Received %d triggers so far", nTry));
222 //if(nTry>5)
223 //{
224 // AliInfo("Collect() ran more than 5 times -> Exiting!");
225 // break;
226 //}
227
228 Collect();
229 }
230
231 delete notifier;
232}
233
234//______________________________________________________________________________________________
235Bool_t AliShuttleTrigger::Collect(Int_t run)
236{
237 //
238 // this function creates a thread that runs the shuttle
239 // then it checks if the shuttle is still running by checking the monitoring functions of the shuttle
240 //
241
242 return fShuttle->Collect(run);
243}