7ac563122983a77ddb2edd6528d29d954fc843cd
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleTrigger.cxx
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.10  2006/08/15 10:50:00  jgrosseo
19  effc++ corrections (alberto)
20
21  Revision 1.9  2006/08/08 14:19:29  jgrosseo
22  Update to shuttle classes (Alberto)
23
24  - Possibility to set the full object's path in the Preprocessor's and
25  Shuttle's  Store functions
26  - Possibility to extend the object's run validity in the same classes
27  ("startValidity" and "validityInfinite" parameters)
28  - Implementation of the StoreReferenceData function to store reference
29  data in a dedicated CDB storage.
30
31  Revision 1.8  2006/07/21 07:37:20  jgrosseo
32  last run is stored after each run
33
34  Revision 1.7  2006/07/20 09:54:40  jgrosseo
35  introducing status management: The processing per subdetector is divided into several steps,
36  after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
37  can keep track of the number of failures and skips further processing after a certain threshold is
38  exceeded. These thresholds can be configured in LDAP.
39
40  Revision 1.6  2006/07/19 10:09:55  jgrosseo
41  new configuration, accesst to DAQ FES (Alberto)
42
43  Revision 1.5  2006/07/10 13:01:41  jgrosseo
44  enhanced storing of last sucessfully processed run (alberto)
45
46  Revision 1.4  2006/07/04 14:59:57  jgrosseo
47  revision of AliDCSValue: Removed wrapper classes, reduced storage size per value by factor 2
48
49  Revision 1.3  2006/06/12 09:11:16  jgrosseo
50  coding conventions (Alberto)
51
52  Revision 1.2  2006/06/06 14:26:40  jgrosseo
53  o) removed files that were moved to STEER
54  o) shuttle updated to follow the new interface (Alberto)
55
56  Revision 1.1  2006/03/07 07:52:34  hristov
57  New version (B.Yordanov)
58
59  Revision 1.5  2005/11/21 09:03:48  byordano
60  one more print added
61
62  Revision 1.4  2005/11/20 10:12:37  byordano
63  comments added to AliShuttleTrigger
64
65  */
66
67
68 // 
69 // This class is to deal with DAQ LogBook and DAQ "end of run" notification.
70 // It has severeal two modes:
71 //      1) syncrhnized - Collect(), CollectNew() and CollectAll methods
72 //      2) asynchronized - Run() - starts listening for DAQ "end of run"
73 //              notification by DIM service.
74 //
75
76 #include "AliShuttleTrigger.h"
77
78 #include <TSystem.h>
79 #include "AliLog.h"
80 #include "AliShuttleConfig.h"
81 #include "AliShuttle.h"
82 #include "DATENotifier.h"
83
84 ClassImp(TerminateSignalHandler)
85
86 //______________________________________________________________________
87 TerminateSignalHandler::TerminateSignalHandler(const TerminateSignalHandler& /*other*/):
88 TSignalHandler(), fTrigger()
89 {
90 // copy constructor (not implemented)
91
92 }
93
94 //______________________________________________________________________
95 TerminateSignalHandler &TerminateSignalHandler::operator=(const TerminateSignalHandler& /*other*/)
96 {
97 // assignment operator (not implemented)
98
99 return *this;
100 }
101
102 //______________________________________________________________________________________________
103 Bool_t TerminateSignalHandler::Notify() 
104 {
105 // Sentd terminate command to the Shuttle trigger
106
107         AliInfo("Terminate signal received ...");
108         fTrigger->Terminate();
109
110         return kTRUE;
111 }
112
113 //______________________________________________________________________________________________
114 //______________________________________________________________________________________________
115
116 ClassImp(AliShuttleTrigger)
117
118 //______________________________________________________________________________________________
119 AliShuttleTrigger::AliShuttleTrigger(const AliShuttleConfig* config,
120                 UInt_t timeout, Int_t retries):
121         fConfig(config), fShuttle(NULL),
122         fNotified(kFALSE), fTerminate(kFALSE),
123         fMutex(), fCondition(&fMutex),
124         fQuitSignalHandler(this, kSigQuit),
125         fInterruptSignalHandler(this, kSigInterrupt)
126 {
127         //
128         // config - pointer to the AliShuttleConfig object which represents
129         // the configuration
130         // mainStorage - pointer to AliCDBStorage for the undelying CDBStorage
131         // localStorage (local) CDB storage to be used if mainStorage is unavailable
132         //
133
134         fShuttle = new AliShuttle(config, timeout, retries);
135
136         gSystem->AddSignalHandler(&fQuitSignalHandler);
137         gSystem->AddSignalHandler(&fInterruptSignalHandler);
138
139 }
140
141
142
143 //______________________________________________________________________
144 AliShuttleTrigger::AliShuttleTrigger(const AliShuttleTrigger& /*other*/):
145         TObject(), fConfig(), fShuttle(NULL),
146         fNotified(kFALSE), fTerminate(kFALSE),
147         fMutex(), fCondition(&fMutex),
148         fQuitSignalHandler(this, kSigQuit),
149         fInterruptSignalHandler(this, kSigInterrupt)
150
151 {
152 // copy constructor (not implemented)
153
154 }
155
156 //______________________________________________________________________
157 AliShuttleTrigger &AliShuttleTrigger::operator=(const AliShuttleTrigger& /*other*/)
158 {
159 // assignment operator (not implemented)
160
161 return *this;
162 }
163
164
165
166
167
168 //______________________________________________________________________________________________
169 AliShuttleTrigger::~AliShuttleTrigger() 
170 {
171 // destructor
172
173         gSystem->RemoveSignalHandler(&fQuitSignalHandler);
174         gSystem->RemoveSignalHandler(&fInterruptSignalHandler);
175
176         delete fShuttle;
177 }
178
179 //______________________________________________________________________________________________
180 Bool_t AliShuttleTrigger::Notify() {
181         //
182         // Trigger CollectNew() methods in asynchronized (listen) mode.
183         // Usually called automaticly by DATENotifier on "end of run" 
184         // notification event.
185         //
186
187         fMutex.Lock();
188
189         fNotified = kTRUE;
190         fCondition.Signal();
191
192         fMutex.UnLock();
193
194         return kTRUE;
195 }
196
197 //______________________________________________________________________________________________
198 void AliShuttleTrigger::Terminate() {
199         //
200         // Stop triggers listen mode and exist from Run()
201         // Usually called automaticly by TerminateSignalHandler.
202         //
203
204         fTerminate = kTRUE;
205         fCondition.Signal();
206 }
207
208 //______________________________________________________________________________________________
209 void AliShuttleTrigger::Run() {
210         //
211         // AliShuttleTrigger main loop for asynchronized (listen) mode.
212         // It spawns DIM service listener and waits for DAQ "end of run"
213         // notification. Calls CollectNew() on notification.
214         //
215
216         fTerminate = kFALSE;
217
218         DATENotifier* notifier = new DATENotifier(this, "/DATE/LOGBOOK/UPDATE");
219
220         while (1) {
221         
222                 fMutex.Lock();
223
224                 while (!(fNotified || fTerminate)) {
225                         fCondition.Wait();
226                 }
227
228                 fNotified = kFALSE;
229                 
230                 fMutex.UnLock();
231
232                 if (fTerminate) {
233                         AliInfo("Terminated.");
234                         break;          
235                 }
236         
237                 CollectNew();
238         }
239
240         delete notifier;
241 }
242
243 //______________________________________________________________________________________________
244 Bool_t AliShuttleTrigger::Collect(Int_t run)
245 {
246         //
247         // Collects conditions data for the given run.
248         //
249
250         return fShuttle->Collect(run);
251 }
252
253 //______________________________________________________________________________________________
254 Bool_t AliShuttleTrigger::CollectNew()
255 {
256         //
257         // Collects conditions data for all UNPROCESSED run written to DAQ LogBook.
258         //
259
260         return fShuttle->CollectNew();
261 }
262
263 //______________________________________________________________________________________________
264 Bool_t AliShuttleTrigger::CollectAll()
265 {
266         //
267         // Collects conditions data for all runs (even if they're already done!) written in Shuttle LogBook.
268         //
269
270         return fShuttle->CollectAll();
271 }
272