Logo ROOT   6.14/05
Reference Guide
TROOT.cxx
Go to the documentation of this file.
1 // @(#)root/base:$Id$
2 // Author: Rene Brun 08/12/94
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 /** \class TROOT
13 \ingroup Base
14 
15 ROOT top level object description.
16 
17 The TROOT object is the entry point to the ROOT system.
18 The single instance of TROOT is accessible via the global gROOT.
19 Using the gROOT pointer one has access to basically every object
20 created in a ROOT based program. The TROOT object is essentially a
21 container of several lists pointing to the main ROOT objects.
22 
23 The following lists are accessible from gROOT object:
24 
25 ~~~ {.cpp}
26  gROOT->GetListOfClasses
27  gROOT->GetListOfColors
28  gROOT->GetListOfTypes
29  gROOT->GetListOfGlobals
30  gROOT->GetListOfGlobalFunctions
31  gROOT->GetListOfFiles
32  gROOT->GetListOfMappedFiles
33  gROOT->GetListOfSockets
34  gROOT->GetListOfSecContexts
35  gROOT->GetListOfCanvases
36  gROOT->GetListOfStyles
37  gROOT->GetListOfFunctions
38  gROOT->GetListOfSpecials (for example graphical cuts)
39  gROOT->GetListOfGeometries
40  gROOT->GetListOfBrowsers
41  gROOT->GetListOfCleanups
42  gROOT->GetListOfMessageHandlers
43 ~~~
44 
45 The TROOT class provides also many useful services:
46  - Get pointer to an object in any of the lists above
47  - Time utilities TROOT::Time
48 
49 The ROOT object must be created as a static object. An example
50 of a main program creating an interactive version is shown below:
51 
52 ### Example of a main program
53 
54 ~~~ {.cpp}
55  #include "TRint.h"
56 
57  int main(int argc, char **argv)
58  {
59  TRint *theApp = new TRint("ROOT example", &argc, argv);
60 
61  // Init Intrinsics, build all windows, and enter event loop
62  theApp->Run();
63 
64  return(0);
65  }
66 ~~~
67 */
68 
69 #include <ROOT/RConfig.h>
70 #include "RConfigure.h"
71 #include "RConfigOptions.h"
72 #include "RVersion.h"
73 #include "RGitCommit.h"
74 
75 #include <string>
76 #include <map>
77 #include <stdlib.h>
78 #ifdef WIN32
79 #include <io.h>
80 #include "Windows4Root.h"
81 #include <Psapi.h>
82 #define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
83 //#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
84 #define dlopen(library_name, flags) ::LoadLibrary(library_name)
85 #define dlclose(library) ::FreeLibrary((HMODULE)library)
86 char *dlerror() {
87  static char Msg[1000];
88  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
89  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg,
90  sizeof(Msg), NULL);
91  return Msg;
92 }
93 FARPROC dlsym(void *library, const char *function_name)
94 {
95  HMODULE hMods[1024];
96  DWORD cbNeeded;
97  FARPROC address = NULL;
98  unsigned int i;
99  if (library == RTLD_DEFAULT) {
100  if (EnumProcessModules(::GetCurrentProcess(), hMods, sizeof(hMods), &cbNeeded)) {
101  for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
102  address = ::GetProcAddress((HMODULE)hMods[i], function_name);
103  if (address)
104  return address;
105  }
106  }
107  return address;
108  } else {
109  return ::GetProcAddress((HMODULE)library, function_name);
110  }
111 }
112 #else
113 #include <dlfcn.h>
114 #endif
115 
116 #include "Riostream.h"
117 #include "Gtypes.h"
118 #include "TROOT.h"
119 #include "TClass.h"
120 #include "TClassEdit.h"
121 #include "TClassGenerator.h"
122 #include "TDataType.h"
123 #include "TDatime.h"
124 #include "TStyle.h"
125 #include "TObjectTable.h"
126 #include "TClassTable.h"
127 #include "TSystem.h"
128 #include "THashList.h"
129 #include "TObjArray.h"
130 #include "TEnv.h"
131 #include "TError.h"
132 #include "TColor.h"
133 #include "TGlobal.h"
134 #include "TFunction.h"
135 #include "TVirtualPad.h"
136 #include "TBrowser.h"
137 #include "TSystemDirectory.h"
138 #include "TApplication.h"
139 #include "TInterpreter.h"
140 #include "TGuiFactory.h"
141 #include "TMessageHandler.h"
142 #include "TFolder.h"
143 #include "TQObject.h"
144 #include "TProcessUUID.h"
145 #include "TPluginManager.h"
146 #include "TMap.h"
147 #include "TObjString.h"
148 #include "TVirtualMutex.h"
149 #include "TInterpreter.h"
150 #include "TListOfTypes.h"
151 #include "TListOfDataMembers.h"
152 #include "TListOfEnumsWithLock.h"
153 #include "TListOfFunctions.h"
155 #include "TFunctionTemplate.h"
156 #include "ThreadLocalStorage.h"
157 #include "TVirtualRWMutex.h"
158 
159 #include <string>
160 namespace std {} using namespace std;
161 
162 #if defined(R__UNIX)
163 #if defined(R__HAS_COCOA)
164 #include "TMacOSXSystem.h"
165 #include "TUrl.h"
166 #else
167 #include "TUnixSystem.h"
168 #endif
169 #elif defined(R__WIN32)
170 #include "TWinNTSystem.h"
171 #endif
172 
173 extern "C" void R__SetZipMode(int);
174 
176 static void *gInterpreterLib = 0;
177 
178 // Mutex for protection of concurrent gROOT access
181 
182 // For accessing TThread::Tsd indirectly.
183 void **(*gThreadTsd)(void*,Int_t) = 0;
184 
185 //-------- Names of next three routines are a small homage to CMZ --------------
186 ////////////////////////////////////////////////////////////////////////////////
187 /// Return version id as an integer, i.e. "2.22/04" -> 22204.
188 
189 static Int_t IVERSQ()
190 {
191  Int_t maj, min, cycle;
192  sscanf(ROOT_RELEASE, "%d.%d/%d", &maj, &min, &cycle);
193  return 10000*maj + 100*min + cycle;
194 }
195 
196 ////////////////////////////////////////////////////////////////////////////////
197 /// Return built date as integer, i.e. "Apr 28 2000" -> 20000428.
198 
199 static Int_t IDATQQ(const char *date)
200 {
201  static const char *months[] = {"Jan","Feb","Mar","Apr","May",
202  "Jun","Jul","Aug","Sep","Oct",
203  "Nov","Dec"};
204 
205  char sm[12];
206  Int_t yy, mm=0, dd;
207  sscanf(date, "%s %d %d", sm, &dd, &yy);
208  for (int i = 0; i < 12; i++)
209  if (!strncmp(sm, months[i], 3)) {
210  mm = i+1;
211  break;
212  }
213  return 10000*yy + 100*mm + dd;
214 }
215 
216 ////////////////////////////////////////////////////////////////////////////////
217 /// Return built time as integer (with min precision), i.e.
218 /// "17:32:37" -> 1732.
219 
220 static Int_t ITIMQQ(const char *time)
221 {
222  Int_t hh, mm, ss;
223  sscanf(time, "%d:%d:%d", &hh, &mm, &ss);
224  return 100*hh + mm;
225 }
226 
227 ////////////////////////////////////////////////////////////////////////////////
228 /// Clean up at program termination before global objects go out of scope.
229 
230 static void CleanUpROOTAtExit()
231 {
232  if (gROOT) {
233  R__LOCKGUARD(gROOTMutex);
234 
235  if (gROOT->GetListOfFiles())
236  gROOT->GetListOfFiles()->Delete("slow");
237  if (gROOT->GetListOfSockets())
238  gROOT->GetListOfSockets()->Delete();
239  if (gROOT->GetListOfMappedFiles())
240  gROOT->GetListOfMappedFiles()->Delete("slow");
241  if (gROOT->GetListOfClosedObjects())
242  gROOT->GetListOfClosedObjects()->Delete("slow");
243  }
244 }
245 
246 ////////////////////////////////////////////////////////////////////////////////
247 /// A module and its headers. Intentionally not a copy:
248 /// If these strings end up in this struct they are
249 /// long lived by definition because they get passed in
250 /// before initialization of TCling.
251 
252 namespace {
253  struct ModuleHeaderInfo_t {
254  ModuleHeaderInfo_t(const char* moduleName,
255  const char** headers,
256  const char** includePaths,
257  const char* payloadCode,
258  const char* fwdDeclCode,
259  void (*triggerFunc)(),
260  const TROOT::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
261  const char **classesHeaders,
262  bool hasCxxModule):
263  fModuleName(moduleName),
264  fHeaders(headers),
265  fPayloadCode(payloadCode),
266  fFwdDeclCode(fwdDeclCode),
267  fIncludePaths(includePaths),
268  fTriggerFunc(triggerFunc),
269  fClassesHeaders(classesHeaders),
270  fFwdNargsToKeepColl(fwdDeclsArgToSkip),
271  fHasCxxModule(hasCxxModule) {}
272 
273  const char* fModuleName; // module name
274  const char** fHeaders; // 0-terminated array of header files
275  const char* fPayloadCode; // Additional code to be given to cling at library load
276  const char* fFwdDeclCode; // Additional code to let cling know about selected classes and functions
277  const char** fIncludePaths; // 0-terminated array of header files
278  void (*fTriggerFunc)(); // Pointer to the dict initialization used to find the library name
279  const char** fClassesHeaders; // 0-terminated list of classes and related header files
280  const TROOT::FwdDeclArgsToKeepCollection_t fFwdNargsToKeepColl; // Collection of
281  // pairs of template fwd decls and number of
282  bool fHasCxxModule; // Whether this module has a C++ module alongside it.
283  };
284 
285  std::vector<ModuleHeaderInfo_t>& GetModuleHeaderInfoBuffer() {
286  static std::vector<ModuleHeaderInfo_t> moduleHeaderInfoBuffer;
287  return moduleHeaderInfoBuffer;
288  }
289 }
290 
294 
295 static void at_exit_of_TROOT() {
298 }
299 
300 // This local static object initializes the ROOT system
301 namespace ROOT {
302 namespace Internal {
303  class TROOTAllocator {
304  // Simple wrapper to separate, time-wise, the call to the
305  // TROOT destructor and the actual free-ing of the memory.
306  //
307  // Since the interpreter implementation (currently TCling) is
308  // loaded via dlopen by libCore, the destruction of its global
309  // variable (i.e. in particular clang's) is scheduled before
310  // those in libCore so we need to schedule the call to the TROOT
311  // destructor before that *but* we want to make sure the memory
312  // stay around until libCore itself is unloaded so that code
313  // using gROOT can 'properly' check for validity.
314  //
315  // The order of loading for is:
316  // libCore.so
317  // libRint.so
318  // ... anything other library hard linked to the executable ...
319  // ... for example libEvent
320  // libCling.so
321  // ... other libraries like libTree for example ....
322  // and the destruction order is (of course) the reverse.
323  // By default the unloading of the dictionary, does use
324  // the service of the interpreter ... which of course
325  // fails if libCling is already unloaded by that information
326  // has not been registered per se.
327  //
328  // To solve this problem, we now schedule the destruction
329  // of the TROOT object to happen _just_ before the
330  // unloading/destruction of libCling so that we can
331  // maximize the amount of clean-up we can do correctly
332  // and we can still allocate the TROOT object's memory
333  // statically.
334  //
335  char fHolder[sizeof(TROOT)];
336  public:
337  TROOTAllocator() {
338  new(&(fHolder[0])) TROOT("root", "The ROOT of EVERYTHING");
339  }
340 
341  ~TROOTAllocator() {
342  if (gROOTLocal) {
343  gROOTLocal->~TROOT();
344  }
345  }
346  };
347 
348  // The global gROOT is defined to be a function (ROOT::GetROOT())
349  // which itself is dereferencing a function pointer.
350 
351  // Initially this function pointer's value is & GetROOT1 whose role is to
352  // create and initialize the TROOT object itself.
353  // At the very end of the TROOT constructor the value of the function pointer
354  // is switch to & GetROOT2 whose role is to initialize the interpreter.
355 
356  // This mechanism was primarily intended to fix the issues with order in which
357  // global TROOT and LLVM globals are initialized. TROOT was initializing
358  // Cling, but Cling could not be used yet due to LLVM globals not being
359  // Initialized yet. The solution is to delay initializing the interpreter in
360  // TROOT till after main() when all LLVM globals are initialized.
361 
362  // Technically, the mechanism used actually delay the interpreter
363  // initialization until the first use of gROOT *after* the end of the
364  // TROOT constructor.
365 
366  // So to delay until after the start of main, we also made sure that none
367  // of the ROOT code (mostly the dictionary code) used during library loading
368  // is using gROOT (directly or indirectly).
369 
370  // In practice, the initialization of the interpreter is now delayed until
371  // the first use gROOT (or gInterpreter) after the start of main (but user
372  // could easily break this by using gROOT in their library initialization
373  // code).
374 
375  extern TROOT *gROOTLocal;
376 
378  if (gROOTLocal)
379  return gROOTLocal;
380  static TROOTAllocator alloc;
381  return gROOTLocal;
382  }
383 
385  static Bool_t initInterpreter = kFALSE;
386  if (!initInterpreter) {
387  initInterpreter = kTRUE;
388  gROOTLocal->InitInterpreter();
389  // Load and init threads library
390  gROOTLocal->InitThreads();
391  }
392  return gROOTLocal;
393  }
394  typedef TROOT *(*GetROOTFun_t)();
395 
397 
398  static Func_t GetSymInLibImt(const char *funcname)
399  {
400  const static bool loadSuccess = dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")? false : 0 <= gSystem->Load("libImt");
401  if (loadSuccess) {
402  if (auto sym = gSystem->DynFindSymbol(nullptr, funcname)) {
403  return sym;
404  } else {
405  Error("GetSymInLibImt", "Cannot get symbol %s.", funcname);
406  }
407  }
408  return nullptr;
409  }
410 
411  //////////////////////////////////////////////////////////////////////////////
412  /// Globally enables the parallel branch processing, which is a case of
413  /// implicit multi-threading (IMT) in ROOT, activating the required locks.
414  /// This IMT use case, implemented in TTree::GetEntry, spawns a task for
415  /// each branch of the tree. Therefore, a task takes care of the reading,
416  /// decompression and deserialisation of a given branch.
418  {
419 #ifdef R__USE_IMT
420  if (!IsImplicitMTEnabled())
422  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableParBranchProcessing");
423  if (sym)
424  sym();
425 #else
426  ::Warning("EnableParBranchProcessing", "Cannot enable parallel branch processing, please build ROOT with -Dimt=ON");
427 #endif
428  }
429 
430  //////////////////////////////////////////////////////////////////////////////
431  /// Globally disables the IMT use case of parallel branch processing,
432  /// deactivating the corresponding locks.
434  {
435 #ifdef R__USE_IMT
436  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableParBranchProcessing");
437  if (sym)
438  sym();
439 #else
440  ::Warning("DisableParBranchProcessing", "Cannot disable parallel branch processing, please build ROOT with -Dimt=ON");
441 #endif
442  }
443 
444  //////////////////////////////////////////////////////////////////////////////
445  /// Returns true if parallel branch processing is enabled.
447  {
448 #ifdef R__USE_IMT
449  static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_IsParBranchProcessingEnabled");
450  if (sym)
451  return sym();
452  else
453  return kFALSE;
454 #else
455  return kFALSE;
456 #endif
457  }
458 
459  ////////////////////////////////////////////////////////////////////////////////
460  /// Globally enables the parallel tree processing, which is a case of
461  /// implicit multi-threading in ROOT, activating the required locks.
462  /// This IMT use case, implemented in TTreeProcessor::Process, receives a user
463  /// function and applies it to subranges of the tree, which correspond to its
464  /// clusters. Hence, for every cluster, a task is spawned to potentially
465  /// process it in parallel with the other clusters.
467  {
468 #ifdef R__USE_IMT
469  if (!IsImplicitMTEnabled())
471  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableParTreeProcessing");
472  if (sym)
473  sym();
474 #else
475  ::Warning("EnableParTreeProcessing", "Cannot enable parallel tree processing, please build ROOT with -Dimt=ON");
476 #endif
477  }
478 
479  //////////////////////////////////////////////////////////////////////////////
480  /// Globally disables the IMT use case of parallel branch processing,
481  /// deactivating the corresponding locks.
483  {
484 #ifdef R__USE_IMT
485  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableParTreeProcessing");
486  if (sym)
487  sym();
488 #else
489  ::Warning("DisableParTreeProcessing", "Cannot disable parallel tree processing, please build ROOT with -Dimt=ON");
490 #endif
491  }
492 
493  ////////////////////////////////////////////////////////////////////////////////
494  /// Returns true if parallel tree processing is enabled.
496  {
497 #ifdef R__USE_IMT
498  static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_IsParTreeProcessingEnabled");
499  if (sym)
500  return sym();
501  else
502  return kFALSE;
503 #else
504  return kFALSE;
505 #endif
506  }
507 
508  ////////////////////////////////////////////////////////////////////////////////
509  /// Keeps track of the status of ImplicitMT w/o resorting to the load of
510  /// libImt
512  {
513  static Bool_t isImplicitMTEnabled = kFALSE;
514  return isImplicitMTEnabled;
515  }
516 
517 } // end of Internal sub namespace
518 // back to ROOT namespace
519 
521  return (*Internal::gGetROOT)();
522  }
523 
524  TString &GetMacroPath() {
525  static TString macroPath;
526  return macroPath;
527  }
528 
529  // clang-format off
530  ////////////////////////////////////////////////////////////////////////////////
531  /// Enables the global mutex to make ROOT thread safe/aware.
532  ///
533  /// The following becomes safe:
534  /// - concurrent construction and destruction of TObjects, including the ones registered in ROOT's global lists (e.g. gROOT->GetListOfCleanups(), gROOT->GetListOfFiles())
535  /// - concurrent usage of _different_ ROOT objects from different threads, including ones with global state (e.g. TFile, TTree, TChain) with the exception of graphics classes (e.g. TCanvas)
536  /// - concurrent calls to ROOT's type system classes, e.g. TClass and TEnum
537  /// - concurrent calls to the interpreter through gInterpreter
538  /// - concurrent loading of ROOT plug-ins
539  ///
540  /// In addition, gDirectory, gFile and gPad become a thread-local variable.
541  /// In all threads, gDirectory defaults to gROOT, a singleton which supports thread-safe insertion and deletion of contents.
542  /// gFile and gPad default to nullptr, as it is for single-thread programs.
543  ///
544  /// Note that there is no `DisableThreadSafety()`. ROOT's thread-safety features cannot be disabled once activated.
545  // clang-format on
547  {
548  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TThread_Initialize");
549  if (sym)
550  sym();
551  }
552 
553  ////////////////////////////////////////////////////////////////////////////////
554  /// @param[in] numthreads Number of threads to use. If not specified or
555  /// set to zero, the number of threads is automatically
556  /// decided by the implementation. Any other value is
557  /// used as a hint.
558  ///
559  /// ROOT must be built with the compilation flag `imt=ON` for this feature to be available.
560  /// The following objects and methods automatically take advantage of
561  /// multi-threading if a call to `EnableImplicitMT` has been made before usage:
562  ///
563  /// - TDataFrame internally runs the event-loop by parallelizing over clusters of entries
564  /// - TTree::GetEntry reads multiple branches in parallel
565  /// - TTree::FlushBaskets writes multiple baskets to disk in parallel
566  /// - TTreeCacheUnzip decompresses baskets in parallel
567  /// - THx::Fit performs in parallel the evaluation of the objective function over the data
568  /// - TMVA::DNN trains the deep neural networks in parallel
569  ///
570  /// EnableImplicitMT calls in turn EnableThreadSafety.
571  /// The 'numthreads' parameter allows to control the number of threads to
572  /// be used by the implicit multi-threading. However, this parameter is just
573  /// a hint for ROOT: it will try to satisfy the request if the execution
574  /// scenario allows it. For example, if ROOT is configured to use an external
575  /// scheduler, setting a value for 'numthreads' might not have any effect.
576  void EnableImplicitMT(UInt_t numthreads)
577  {
578 #ifdef R__USE_IMT
580  return;
582  static void (*sym)(UInt_t) = (void(*)(UInt_t))Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableImplicitMT");
583  if (sym)
584  sym(numthreads);
586 #else
587  ::Warning("EnableImplicitMT", "Cannot enable implicit multi-threading with %d threads, please build ROOT with -Dimt=ON", numthreads);
588 #endif
589  }
590 
591  ////////////////////////////////////////////////////////////////////////////////
592  /// Disables the implicit multi-threading in ROOT (see EnableImplicitMT).
594  {
595 #ifdef R__USE_IMT
596  static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableImplicitMT");
597  if (sym)
598  sym();
600 #else
601  ::Warning("DisableImplicitMT", "Cannot disable implicit multi-threading, please build ROOT with -Dimt=ON");
602 #endif
603  }
604 
605  ////////////////////////////////////////////////////////////////////////////////
606  /// Returns true if the implicit multi-threading in ROOT is enabled.
608  {
610  }
611 
612  ////////////////////////////////////////////////////////////////////////////////
613  /// Returns the size of the pool used for implicit multi-threading.
615  {
616 #ifdef R__USE_IMT
617  static UInt_t (*sym)() = (UInt_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_GetImplicitMTPoolSize");
618  if (sym)
619  return sym();
620  else
621  return 0;
622 #else
623  return 0;
624 #endif
625  }
626 
627 }
628 
630 
631 // Global debug flag (set to > 0 to get debug output).
632 // Can be set either via the interpreter (gDebug is exported to CINT),
633 // via the rootrc resource "Root.Debug", via the shell environment variable
634 // ROOTDEBUG, or via the debugger.
636 
637 
638 ClassImp(TROOT);
639 
640 ////////////////////////////////////////////////////////////////////////////////
641 /// Default ctor.
642 
644  fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
645  fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
646  fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
647  fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
648  fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
649  fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
650  fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
651  fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
652  fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
653  fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
654  fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
655  fPluginManager(0)
656 {
657 }
658 
659 ////////////////////////////////////////////////////////////////////////////////
660 /// Initialize the ROOT system. The creation of the TROOT object initializes
661 /// the ROOT system. It must be the first ROOT related action that is
662 /// performed by a program. The TROOT object must be created on the stack
663 /// (can not be called via new since "operator new" is protected). The
664 /// TROOT object is either created as a global object (outside the main()
665 /// program), or it is one of the first objects created in main().
666 /// Make sure that the TROOT object stays in scope for as long as ROOT
667 /// related actions are performed. TROOT is a so called singleton so
668 /// only one instance of it can be created. The single TROOT object can
669 /// always be accessed via the global pointer gROOT.
670 /// The name and title arguments can be used to identify the running
671 /// application. The initfunc argument can contain an array of
672 /// function pointers (last element must be 0). These functions are
673 /// executed at the end of the constructor. This way one can easily
674 /// extend the ROOT system without adding permanent dependencies
675 /// (e.g. the graphics system is initialized via such a function).
676 
677 TROOT::TROOT(const char *name, const char *title, VoidFuncPtr_t *initfunc)
689  fPluginManager(0)
690 {
691  if (fgRootInit || ROOT::Internal::gROOTLocal) {
692  //Warning("TROOT", "only one instance of TROOT allowed");
693  return;
694  }
695 
696  R__LOCKGUARD(gROOTMutex);
697 
698  ROOT::Internal::gROOTLocal = this;
699  gDirectory = 0;
700 
701  SetName(name);
702  SetTitle(title);
703 
704  // will be used by global "operator delete" so make sure it is set
705  // before anything is deleted
706  fMappedFiles = 0;
707 
708  // create already here, but only initialize it after gEnv has been created
710 
711  // Initialize Operating System interface
712  InitSystem();
713 
714  // Initialize static directory functions
715  GetRootSys();
716  GetBinDir();
717  GetLibDir();
718  GetIncludeDir();
719  GetEtcDir();
720  GetDataDir();
721  GetDocDir();
722  GetMacroDir();
723  GetTutorialDir();
724  GetSourceDir();
725  GetIconPath();
726  GetTTFFontDir();
727 
728  gRootDir = GetRootSys().Data();
729 
731 
732  // Initialize interface to CINT C++ interpreter
733  fVersionInt = 0; // check in TROOT dtor in case TCling fails
734  fClasses = 0; // might be checked via TCling ctor
735  fEnums = 0;
736 
737  fConfigOptions = R__CONFIGUREOPTIONS;
738  fConfigFeatures = R__CONFIGUREFEATURES;
741  fVersionInt = IVERSQ();
744  fBuiltDate = IDATQQ(__DATE__);
745  fBuiltTime = ITIMQQ(__TIME__);
746 
747  ReadGitInfo();
748 
749  fClasses = new THashTable(800,3); fClasses->UseRWLock();
750  //fIdMap = new IdMap_t;
752  fClassGenerators = new TList;
753 
754  // usedToIdentifyRootClingByDlSym is available when TROOT is part of
755  // rootcling.
756  if (!dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")) {
757  // initialize plugin manager early
759 #if defined(R__MACOSX) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
760  if (TARGET_OS_IPHONE | TARGET_IPHONE_SIMULATOR) {
761  TEnv plugins(".plugins-ios");
763  }
764 #endif
765  }
766 
767  TSystemDirectory *workdir = new TSystemDirectory("workdir", gSystem->WorkingDirectory());
768 
769  auto setNameLocked = [](TSeqCollection *l, const char *collection_name) {
770  l->SetName(collection_name);
771  l->UseRWLock();
772  return l;
773  };
774 
775  fTimer = 0;
776  fApplication = 0;
777  fColors = setNameLocked(new TObjArray(1000), "ListOfColors");
778  fTypes = 0;
779  fGlobals = 0;
780  fGlobalFunctions = 0;
781  // fList was created in TDirectory::Build but with different sizing.
782  delete fList;
783  fList = new THashList(1000,3); fList->UseRWLock();
784  fClosedObjects = setNameLocked(new TList, "ClosedFiles");
785  fFiles = setNameLocked(new TList, "Files");
786  fMappedFiles = setNameLocked(new TList, "MappedFiles");
787  fSockets = setNameLocked(new TList, "Sockets");
788  fCanvases = setNameLocked(new TList, "Canvases");
789  fStyles = setNameLocked(new TList, "Styles");
790  fFunctions = setNameLocked(new TList, "Functions");
791  fTasks = setNameLocked(new TList, "Tasks");
792  fGeometries = setNameLocked(new TList, "Geometries");
793  fBrowsers = setNameLocked(new TList, "Browsers");
794  fSpecials = setNameLocked(new TList, "Specials");
795  fBrowsables = (TList*)setNameLocked(new TList, "Browsables");
796  fCleanups = setNameLocked(new THashList, "Cleanups");
797  fMessageHandlers = setNameLocked(new TList, "MessageHandlers");
798  fSecContexts = setNameLocked(new TList, "SecContexts");
799  fProofs = setNameLocked(new TList, "Proofs");
800  fClipboard = setNameLocked(new TList, "Clipboard");
801  fDataSets = setNameLocked(new TList, "DataSets");
803 
805  fUUIDs = new TProcessUUID();
806 
807  fRootFolder = new TFolder();
808  fRootFolder->SetName("root");
809  fRootFolder->SetTitle("root of all folders");
810  fRootFolder->AddFolder("Classes", "List of Active Classes",fClasses);
811  fRootFolder->AddFolder("Colors", "List of Active Colors",fColors);
812  fRootFolder->AddFolder("MapFiles", "List of MapFiles",fMappedFiles);
813  fRootFolder->AddFolder("Sockets", "List of Socket Connections",fSockets);
814  fRootFolder->AddFolder("Canvases", "List of Canvases",fCanvases);
815  fRootFolder->AddFolder("Styles", "List of Styles",fStyles);
816  fRootFolder->AddFolder("Functions", "List of Functions",fFunctions);
817  fRootFolder->AddFolder("Tasks", "List of Tasks",fTasks);
818  fRootFolder->AddFolder("Geometries","List of Geometries",fGeometries);
819  fRootFolder->AddFolder("Browsers", "List of Browsers",fBrowsers);
820  fRootFolder->AddFolder("Specials", "List of Special Objects",fSpecials);
821  fRootFolder->AddFolder("Handlers", "List of Message Handlers",fMessageHandlers);
822  fRootFolder->AddFolder("Cleanups", "List of RecursiveRemove Collections",fCleanups);
823  fRootFolder->AddFolder("StreamerInfo","List of Active StreamerInfo Classes",fStreamerInfo);
824  fRootFolder->AddFolder("SecContexts","List of Security Contexts",fSecContexts);
825  fRootFolder->AddFolder("PROOF Sessions", "List of PROOF sessions",fProofs);
826  fRootFolder->AddFolder("ROOT Memory","List of Objects in the gROOT Directory",fList);
827  fRootFolder->AddFolder("ROOT Files","List of Connected ROOT Files",fFiles);
828 
829  // by default, add the list of files, tasks, canvases and browsers in the Cleanups list
835  // And add TROOT's TDirectory personality
836  fCleanups->Add(fList);
837 
840  fFromPopUp = kFALSE;
842  fInterrupt = kFALSE;
843  fEscape = kFALSE;
844  fMustClean = kTRUE;
845  fPrimitive = 0;
846  fSelectPad = 0;
847  fEditorMode = 0;
848  fDefCanvasName = "c1";
850  fLineIsProcessing = 1; // This prevents WIN32 "Windows" thread to pick ROOT objects with mouse
851  gDirectory = this;
852  gPad = 0;
853 
854  //set name of graphical cut class for the graphics editor
855  //cannot call SetCutClassName at this point because the TClass of TCutG
856  //is not yet build
857  fCutClassName = "TCutG";
858 
859  // Create a default MessageHandler
860  new TMessageHandler((TClass*)0);
861 
862  // Create some styles
863  gStyle = 0;
865  SetStyle(gEnv->GetValue("Canvas.Style", "Modern"));
866 
867  // Setup default (batch) graphics and GUI environment
870  gGXBatch = new TVirtualX("Batch", "ROOT Interface to batch graphics");
872 
873 #if defined(R__WIN32)
874  fBatch = kFALSE;
875 #elif defined(R__HAS_COCOA)
876  fBatch = kFALSE;
877 #else
878  if (gSystem->Getenv("DISPLAY"))
879  fBatch = kFALSE;
880  else
881  fBatch = kTRUE;
882 #endif
883 
884  int i = 0;
885  while (initfunc && initfunc[i]) {
886  (initfunc[i])();
887  fBatch = kFALSE; // put system in graphics mode (backward compatible)
888  i++;
889  }
890 
891  // Set initial/default list of browsable objects
892  fBrowsables->Add(fRootFolder, "root");
893  fBrowsables->Add(fProofs, "PROOF Sessions");
894  fBrowsables->Add(workdir, gSystem->WorkingDirectory());
895  fBrowsables->Add(fFiles, "ROOT Files");
896 
897  atexit(CleanUpROOTAtExit);
898 
900 }
901 
902 ////////////////////////////////////////////////////////////////////////////////
903 /// Clean up and free resources used by ROOT (files, network sockets,
904 /// shared memory segments, etc.).
905 
907 {
908  using namespace ROOT::Internal;
909 
910  if (gROOTLocal == this) {
911 
912  // If the interpreter has not yet been initialized, don't bother
913  gGetROOT = &GetROOT1;
914 
915  // Mark the object as invalid, so that we can veto some actions
916  // (like autoloading) while we are in the destructor.
918 
919  // Turn-off the global mutex to avoid recreating mutexes that have
920  // already been deleted during the destruction phase
921  gGlobalMutex = 0;
922 
923  // Return when error occurred in TCling, i.e. when setup file(s) are
924  // out of date
925  if (!fVersionInt) return;
926 
927  // ATTENTION!!! Order is important!
928 
929 #ifdef R__COMPLETE_MEM_TERMINATION
931 
932  // FIXME: Causes rootcling to deadlock, debug and uncomment
933  // SafeDelete(fRootFolder);
934 
935  fSpecials->Delete(); SafeDelete(fSpecials); // delete special objects : PostScript, Minuit, Html
936 #endif
937  fClosedObjects->Delete("slow"); // and closed files
938  fFiles->Delete("slow"); // and files
940  fSecContexts->Delete("slow"); SafeDelete(fSecContexts); // and security contexts
941  fSockets->Delete(); SafeDelete(fSockets); // and sockets
942  fMappedFiles->Delete("slow"); // and mapped files
943  TSeqCollection *tl = fMappedFiles; fMappedFiles = 0; delete tl;
944 
946 
947  delete fUUIDs;
948  TProcessID::Cleanup(); // and list of ProcessIDs
949 
950  fFunctions->Delete(); SafeDelete(fFunctions); // etc..
953 #ifdef R__COMPLETE_MEM_TERMINATION
955 #endif
958 
959 #ifdef R__COMPLETE_MEM_TERMINATION
964 #endif
965 
966  // Stop emitting signals
968 
970 
971 #ifdef R__COMPLETE_MEM_TERMINATION
977 
978  fCleanups->Clear();
980  delete gClassTable; gClassTable = 0;
981  delete gEnv; gEnv = 0;
982 
983  if (fTypes) fTypes->Delete();
985  if (fGlobals) fGlobals->Delete();
989  fEnums.load()->Delete();
990 
991  // FIXME: Causes segfault in rootcling, debug and uncomment
992  // fClasses->Delete(); SafeDelete(fClasses); // TClass'es must be deleted last
993 #endif
994 
995  // Remove shared libraries produced by the TSystem::CompileMacro() call
997 
998  // Cleanup system class
999  delete gSystem;
1000 
1001  // ROOT-6022:
1002  // if (gInterpreterLib) dlclose(gInterpreterLib);
1003 #ifdef R__COMPLETE_MEM_TERMINATION
1004  // On some 'newer' platform (Fedora Core 17+, Ubuntu 12), the
1005  // initialization order is (by default?) is 'wrong' and so we can't
1006  // delete the interpreter now .. because any of the static in the
1007  // interpreter's library have already been deleted.
1008  // On the link line, we must list the most dependent .o file
1009  // and end with the least dependent (LLVM libraries), unfortunately,
1010  // Fedora Core 17+ or Ubuntu 12 will also execute the initialization
1011  // in the same order (hence doing libCore's before LLVM's and
1012  // vice et versa for both the destructor. We worked around the
1013  // initialization order by delay the TROOT creation until first use.
1014  // We can not do the same for destruction as we have no way of knowing
1015  // the last access ...
1016  // So for now, let's avoid delete TCling except in the special build
1017  // checking the completeness of the termination deletion.
1018 
1019  // TODO: Should we do more cleanup here than just call delete?
1020  // Segfaults rootcling in some cases, debug and uncomment
1021  // delete fInterpreter;
1022 #endif
1023 
1024 #ifdef R__COMPLETE_MEM_TERMINATION
1026 #endif
1027 
1028  // Prints memory stats
1030 
1031  gROOTLocal = 0;
1032  fgRootInit = kFALSE;
1033  }
1034 }
1035 
1036 ////////////////////////////////////////////////////////////////////////////////
1037 /// Add a class to the list and map of classes.
1038 /// This routine is deprecated, use TClass::AddClass directly.
1039 
1041 {
1042  TClass::AddClass(cl);
1043 }
1044 
1045 ////////////////////////////////////////////////////////////////////////////////
1046 /// Add a class generator. This generator will be called by TClass::GetClass
1047 /// in case its does not find a loaded rootcint dictionary to request the
1048 /// creation of a TClass object.
1049 
1051 {
1052  if (!generator) return;
1053  fClassGenerators->Add(generator);
1054 }
1055 
1056 ////////////////////////////////////////////////////////////////////////////////
1057 /// Append object to this directory.
1058 ///
1059 /// If replace is true:
1060 /// remove any existing objects with the same same (if the name is not "")
1061 
1062 void TROOT::Append(TObject *obj, Bool_t replace /* = kFALSE */)
1063 {
1064  R__LOCKGUARD(gROOTMutex);
1065  TDirectory::Append(obj,replace);
1066 }
1067 
1068 ////////////////////////////////////////////////////////////////////////////////
1069 /// Add browsable objects to TBrowser.
1070 
1072 {
1073  TObject *obj;
1074  TIter next(fBrowsables);
1075 
1076  while ((obj = (TObject *) next())) {
1077  const char *opt = next.GetOption();
1078  if (opt && strlen(opt))
1079  b->Add(obj, opt);
1080  else
1081  b->Add(obj, obj->GetName());
1082  }
1083 }
1084 
1085 ////////////////////////////////////////////////////////////////////////////////
1086 /// return class status bit kClassSaved for class cl
1087 /// This function is called by the SavePrimitive functions writing
1088 /// the C++ code for an object.
1089 
1091 {
1092  if (cl == 0) return kFALSE;
1093  if (cl->TestBit(TClass::kClassSaved)) return kTRUE;
1095  return kFALSE;
1096 }
1097 
1098 namespace {
1099  static void R__ListSlowClose(TList *files)
1100  {
1101  // Routine to close a list of files using the 'slow' techniques
1102  // that also for the deletion ot update the list itself.
1103 
1104  static TObject harmless;
1105  TObjLink *cursor = files->FirstLink();
1106  while (cursor) {
1107  TDirectory *dir = static_cast<TDirectory*>( cursor->GetObject() );
1108  if (dir) {
1109  // In order for the iterator to stay valid, we must
1110  // prevent the removal of the object (dir) from the list
1111  // (which is done in TFile::Close). We can also can not
1112  // just move to the next iterator since the Close might
1113  // also (indirectly) remove that file.
1114  // So we SetObject to a harmless value, so that 'dir'
1115  // is not seen as part of the list.
1116  // We will later, remove all the object (see files->Clear()
1117  cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1118  // See related comment at the files->Clear("nodelete");
1119  dir->Close("nodelete");
1120  // Put it back
1121  cursor->SetObject(dir);
1122  }
1123  cursor = cursor->Next();
1124  };
1125  // Now were done, clear the list but do not delete the objects as
1126  // they have been moved to the list of closed objects and must be
1127  // deleted from there in order to avoid a double delete from a
1128  // use objects (on the interpreter stack).
1129  files->Clear("nodelete");
1130  }
1131 
1132  static void R__ListSlowDeleteContent(TList *files)
1133  {
1134  // Routine to delete the content of list of files using the 'slow' techniques
1135 
1136  static TObject harmless;
1137  TObjLink *cursor = files->FirstLink();
1138  while (cursor) {
1139  TDirectory *dir = dynamic_cast<TDirectory*>( cursor->GetObject() );
1140  if (dir) {
1141  // In order for the iterator to stay valid, we must
1142  // prevent the removal of the object (dir) from the list
1143  // (which is done in TFile::Close). We can also can not
1144  // just move to the next iterator since the Close might
1145  // also (indirectly) remove that file.
1146  // So we SetObject to a harmless value, so that 'dir'
1147  // is not seen as part of the list.
1148  // We will later, remove all the object (see files->Clear()
1149  cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1150  // See related comment at the files->Clear("nodelete");
1151  dir->GetList()->Delete("slow");
1152  // Put it back
1153  cursor->SetObject(dir);
1154  }
1155  cursor = cursor->Next();
1156  };
1157  }
1158 }
1159 
1160 ////////////////////////////////////////////////////////////////////////////////
1161 /// Close any files and sockets that gROOT knows about.
1162 /// This can be used to insures that the files and sockets are closed before any library is unloaded!
1163 
1165 {
1166  if (fFiles && fFiles->First()) {
1167  R__ListSlowClose(static_cast<TList*>(fFiles));
1168  }
1169  // and Close TROOT itself.
1170  Close("slow");
1171  // Now sockets.
1172  if (fSockets && fSockets->First()) {
1173  if (0==fCleanups->FindObject(fSockets) ) {
1176  }
1177  CallFunc_t *socketCloser = gInterpreter->CallFunc_Factory();
1178  Long_t offset = 0;
1179  TClass *socketClass = TClass::GetClass("TSocket");
1180  gInterpreter->CallFunc_SetFuncProto(socketCloser, socketClass->GetClassInfo(), "Close", "", &offset);
1181  if (gInterpreter->CallFunc_IsValid(socketCloser)) {
1182  static TObject harmless;
1183  TObjLink *cursor = static_cast<TList*>(fSockets)->FirstLink();
1184  TList notclosed;
1185  while (cursor) {
1186  TObject *socket = cursor->GetObject();
1187  // In order for the iterator to stay valid, we must
1188  // prevent the removal of the object (dir) from the list
1189  // (which is done in TFile::Close). We can also can not
1190  // just move to the next iterator since the Close might
1191  // also (indirectly) remove that file.
1192  // So we SetObject to a harmless value, so that 'dir'
1193  // is not seen as part of the list.
1194  // We will later, remove all the object (see files->Clear()
1195  cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1196 
1197  if (socket->IsA()->InheritsFrom(socketClass)) {
1198  gInterpreter->CallFunc_Exec(socketCloser, ((char*)socket)+offset);
1199  // Put the object in the closed list for later deletion.
1200  socket->SetBit(kMustCleanup);
1201  fClosedObjects->AddLast(socket);
1202  } else {
1203  // Crap ... this is not a socket, likely Proof or something, let's try to find a Close
1204  Long_t other_offset;
1205  CallFunc_t *otherCloser = gInterpreter->CallFunc_Factory();
1206  gInterpreter->CallFunc_SetFuncProto(otherCloser, socket->IsA()->GetClassInfo(), "Close", "", &other_offset);
1207  if (gInterpreter->CallFunc_IsValid(otherCloser)) {
1208  gInterpreter->CallFunc_Exec(otherCloser, ((char*)socket)+other_offset);
1209  // Put the object in the closed list for later deletion.
1210  socket->SetBit(kMustCleanup);
1211  fClosedObjects->AddLast(socket);
1212  } else {
1213  notclosed.AddLast(socket);
1214  }
1215  gInterpreter->CallFunc_Delete(otherCloser);
1216  // Put it back
1217  cursor->SetObject(socket);
1218  }
1219  cursor = cursor->Next();
1220  }
1221  // Now were done, clear the list
1222  fSockets->Clear();
1223  // Read the one we did not close
1224  cursor = notclosed.FirstLink();
1225  while (cursor) {
1226  static_cast<TList*>(fSockets)->AddLast(cursor->GetObject());
1227  cursor = cursor->Next();
1228  }
1229  }
1230  gInterpreter->CallFunc_Delete(socketCloser);
1231  }
1232  if (fMappedFiles && fMappedFiles->First()) {
1233  R__ListSlowClose(static_cast<TList*>(fMappedFiles));
1234  }
1235 
1236 }
1237 
1238 ////////////////////////////////////////////////////////////////////////////////
1239 /// Execute the cleanups necessary at the end of the process, in particular
1240 /// those that must be executed before the library start being unloaded.
1241 
1243 {
1244  // This will not delete the objects 'held' by the TFiles so that
1245  // they can still be 'reacheable' when ResetGlobals is run.
1246  CloseFiles();
1247 
1248  if (gInterpreter) {
1249  gInterpreter->ResetGlobals();
1250  }
1251 
1252  // Now delete the objects 'held' by the TFiles so that it
1253  // is done before the tear down of the libraries.
1254  if (fClosedObjects && fClosedObjects->First()) {
1255  R__ListSlowDeleteContent(static_cast<TList*>(fClosedObjects));
1256  }
1257 
1258  // Now a set of simpler things to delete. See the same ordering in
1259  // TROOT::~TROOT
1260  fFunctions->Delete();
1261  fGeometries->Delete();
1262  fBrowsers->Delete();
1263  fCanvases->Delete("slow");
1264  fColors->Delete();
1265  fStyles->Delete();
1266 }
1267 
1268 
1269 ////////////////////////////////////////////////////////////////////////////////
1270 /// Find an object in one Root folder
1271 
1273 {
1274  Error("FindObject","Not yet implemented");
1275  return 0;
1276 }
1277 
1278 ////////////////////////////////////////////////////////////////////////////////
1279 /// Returns address of a ROOT object if it exists
1280 ///
1281 /// If name contains at least one "/" the function calls FindObjectany
1282 /// else
1283 /// This function looks in the following order in the ROOT lists:
1284 /// - List of files
1285 /// - List of memory mapped files
1286 /// - List of functions
1287 /// - List of geometries
1288 /// - List of canvases
1289 /// - List of styles
1290 /// - List of specials
1291 /// - List of materials in current geometry
1292 /// - List of shapes in current geometry
1293 /// - List of matrices in current geometry
1294 /// - List of Nodes in current geometry
1295 /// - Current Directory in memory
1296 /// - Current Directory on file
1297 
1298 TObject *TROOT::FindObject(const char *name) const
1299 {
1300  if (name && strstr(name,"/")) return FindObjectAny(name);
1301 
1302  TObject *temp = 0;
1303 
1304  temp = fFiles->FindObject(name); if (temp) return temp;
1305  temp = fMappedFiles->FindObject(name); if (temp) return temp;
1306  {
1307  R__LOCKGUARD(gROOTMutex);
1308  temp = fFunctions->FindObject(name);if (temp) return temp;
1309  }
1310  temp = fGeometries->FindObject(name); if (temp) return temp;
1311  temp = fCanvases->FindObject(name); if (temp) return temp;
1312  temp = fStyles->FindObject(name); if (temp) return temp;
1313  {
1314  R__LOCKGUARD(gROOTMutex);
1315  temp = fSpecials->FindObject(name); if (temp) return temp;
1316  }
1317  TIter next(fGeometries);
1318  TObject *obj;
1319  while ((obj=next())) {
1320  temp = obj->FindObject(name); if (temp) return temp;
1321  }
1322  if (gDirectory) temp = gDirectory->Get(name);
1323  if (temp) return temp;
1324  if (gPad) {
1325  TVirtualPad *canvas = gPad->GetVirtCanvas();
1326  if (fCanvases->FindObject(canvas)) { //this check in case call from TCanvas ctor
1327  temp = canvas->FindObject(name);
1328  if (!temp && canvas != gPad) temp = gPad->FindObject(name);
1329  }
1330  }
1331  return temp;
1332 }
1333 
1334 ////////////////////////////////////////////////////////////////////////////////
1335 /// Returns address and folder of a ROOT object if it exists
1336 ///
1337 /// This function looks in the following order in the ROOT lists:
1338 /// - List of files
1339 /// - List of memory mapped files
1340 /// - List of functions
1341 /// - List of geometries
1342 /// - List of canvases
1343 /// - List of styles
1344 /// - List of specials
1345 /// - List of materials in current geometry
1346 /// - List of shapes in current geometry
1347 /// - List of matrices in current geometry
1348 /// - List of Nodes in current geometry
1349 /// - Current Directory in memory
1350 /// - Current Directory on file
1351 
1352 TObject *TROOT::FindSpecialObject(const char *name, void *&where)
1353 {
1354  TObject *temp = 0;
1355  where = 0;
1356 
1357  if (!temp) {
1358  temp = fFiles->FindObject(name);
1359  where = fFiles;
1360  }
1361  if (!temp) {
1362  temp = fMappedFiles->FindObject(name);
1363  where = fMappedFiles;
1364  }
1365  if (!temp) {
1366  R__LOCKGUARD(gROOTMutex);
1367  temp = fFunctions->FindObject(name);
1368  where = fFunctions;
1369  }
1370  if (!temp) {
1371  temp = fCanvases->FindObject(name);
1372  where = fCanvases;
1373  }
1374  if (!temp) {
1375  temp = fStyles->FindObject(name);
1376  where = fStyles;
1377  }
1378  if (!temp) {
1379  temp = fSpecials->FindObject(name);
1380  where = fSpecials;
1381  }
1382  if (!temp) {
1383  TObject *glast = fGeometries->Last();
1384  if (glast) {where = glast; temp = glast->FindObject(name);}
1385  }
1386  if (!temp && gDirectory) {
1387  temp = gDirectory->Get(name);
1388  where = gDirectory;
1389  }
1390  if (!temp && gPad) {
1391  TVirtualPad *canvas = gPad->GetVirtCanvas();
1392  if (fCanvases->FindObject(canvas)) { //this check in case call from TCanvas ctor
1393  temp = canvas->FindObject(name);
1394  where = canvas;
1395  if (!temp && canvas != gPad) {
1396  temp = gPad->FindObject(name);
1397  where = gPad;
1398  }
1399  }
1400  }
1401  if (!temp) return 0;
1402  if (temp->TestBit(kNotDeleted)) return temp;
1403  return 0;
1404 }
1405 
1406 ////////////////////////////////////////////////////////////////////////////////
1407 /// Return a pointer to the first object with name starting at //root.
1408 /// This function scans the list of all folders.
1409 /// if no object found in folders, it scans the memory list of all files.
1410 
1411 TObject *TROOT::FindObjectAny(const char *name) const
1412 {
1413  TObject *obj = fRootFolder->FindObjectAny(name);
1414  if (obj) return obj;
1415  return gDirectory->FindObjectAnyFile(name);
1416 }
1417 
1418 ////////////////////////////////////////////////////////////////////////////////
1419 /// Scan the memory lists of all files for an object with name
1420 
1422 {
1423  R__LOCKGUARD(gROOTMutex);
1424  TDirectory *d;
1425  TIter next(GetListOfFiles());
1426  while ((d = (TDirectory*)next())) {
1427  // Call explicitly TDirectory::FindObject to restrict the search to the
1428  // already in memory object.
1429  TObject *obj = d->TDirectory::FindObject(name);
1430  if (obj) return obj;
1431  }
1432  return 0;
1433 }
1434 
1435 ////////////////////////////////////////////////////////////////////////////////
1436 /// Returns class name of a ROOT object including CINT globals.
1437 
1438 const char *TROOT::FindObjectClassName(const char *name) const
1439 {
1440  // Search first in the list of "standard" objects
1441  TObject *obj = FindObject(name);
1442  if (obj) return obj->ClassName();
1443 
1444  // Is it a global variable?
1445  TGlobal *g = GetGlobal(name);
1446  if (g) return g->GetTypeName();
1447 
1448  return 0;
1449 }
1450 
1451 ////////////////////////////////////////////////////////////////////////////////
1452 /// Return path name of obj somewhere in the //root/... path.
1453 /// The function returns the first occurence of the object in the list
1454 /// of folders. The returned string points to a static char array in TROOT.
1455 /// If this function is called in a loop or recursively, it is the
1456 /// user's responsibility to copy this string in their area.
1457 
1458 const char *TROOT::FindObjectPathName(const TObject *) const
1459 {
1460  Error("FindObjectPathName","Not yet implemented");
1461  return "??";
1462 }
1463 
1464 ////////////////////////////////////////////////////////////////////////////////
1465 /// return a TClass object corresponding to 'name' assuming it is an STL container.
1466 /// In particular we looking for possible alternative name (default template
1467 /// parameter, typedefs template arguments, typedefed name).
1468 
1469 TClass *TROOT::FindSTLClass(const char *name, Bool_t load, Bool_t silent) const
1470 {
1471  // Example of inputs are
1472  // vector<int> (*)
1473  // vector<Int_t>
1474  // vector<long long>
1475  // vector<Long_64_t> (*)
1476  // vector<int, allocator<int> >
1477  // vector<Int_t, allocator<int> >
1478  //
1479  // One of the possibly expensive operation is the resolving of the typedef
1480  // which can provoke the parsing of the header files (and/or the loading
1481  // of clang pcms information).
1482 
1484 
1485  // Remove std::, allocator, typedef, add Long64_t, etc. in just one call.
1486  std::string normalized;
1487  TClassEdit::GetNormalizedName(normalized, name);
1488 
1489  TClass *cl = 0;
1490  if (normalized != name) cl = TClass::GetClass(normalized.c_str(),load,silent);
1491 
1492  if (load && cl==0) {
1493  // Create an Emulated class for this container.
1494  cl = gInterpreter->GenerateTClass(normalized.c_str(), kTRUE, silent);
1495  }
1496 
1497  return cl;
1498 }
1499 
1500 ////////////////////////////////////////////////////////////////////////////////
1501 /// Return pointer to class with name. Obsolete, use TClass::GetClass directly
1502 
1503 TClass *TROOT::GetClass(const char *name, Bool_t load, Bool_t silent) const
1504 {
1505  return TClass::GetClass(name,load,silent);
1506 }
1507 
1508 
1509 ////////////////////////////////////////////////////////////////////////////////
1510 /// Return pointer to class from its name. Obsolete, use TClass::GetClass directly
1511 /// See TClass::GetClass
1512 
1513 TClass *TROOT::GetClass(const std::type_info& typeinfo, Bool_t load, Bool_t silent) const
1514 {
1515  return TClass::GetClass(typeinfo,load,silent);
1516 }
1517 
1518 ////////////////////////////////////////////////////////////////////////////////
1519 /// Return address of color with index color.
1520 
1522 {
1524  TObjArray *lcolors = (TObjArray*) GetListOfColors();
1525  if (!lcolors) return 0;
1526  if (color < 0 || color >= lcolors->GetSize()) return 0;
1527  TColor *col = (TColor*)lcolors->At(color);
1528  if (col && col->GetNumber() == color) return col;
1529  TIter next(lcolors);
1530  while ((col = (TColor *) next()))
1531  if (col->GetNumber() == color) return col;
1532 
1533  return 0;
1534 }
1535 
1536 ////////////////////////////////////////////////////////////////////////////////
1537 /// Return a default canvas.
1538 
1540 {
1541  return (TCanvas*)gROOT->ProcessLine("TCanvas::MakeDefCanvas();");
1542 }
1543 
1544 ////////////////////////////////////////////////////////////////////////////////
1545 /// Return pointer to type with name.
1546 
1547 TDataType *TROOT::GetType(const char *name, Bool_t /* load */) const
1548 {
1549  return (TDataType*)gROOT->GetListOfTypes()->FindObject(name);
1550 }
1551 
1552 ////////////////////////////////////////////////////////////////////////////////
1553 /// Return pointer to file with name.
1554 
1555 TFile *TROOT::GetFile(const char *name) const
1556 {
1557  R__LOCKGUARD(gROOTMutex);
1558  return (TFile*)GetListOfFiles()->FindObject(name);
1559 }
1560 
1561 ////////////////////////////////////////////////////////////////////////////////
1562 /// Return pointer to style with name
1563 
1564 TStyle *TROOT::GetStyle(const char *name) const
1565 {
1566  return (TStyle*)GetListOfStyles()->FindObject(name);
1567 }
1568 
1569 ////////////////////////////////////////////////////////////////////////////////
1570 /// Return pointer to function with name.
1571 
1572 TObject *TROOT::GetFunction(const char *name) const
1573 {
1574  if (name == 0 || name[0] == 0) {
1575  return 0;
1576  }
1577 
1578  {
1579  R__LOCKGUARD(gROOTMutex);
1580  TObject *f1 = fFunctions->FindObject(name);
1581  if (f1) return f1;
1582  }
1583 
1584  gROOT->ProcessLine("TF1::InitStandardFunctions();");
1585 
1586  R__LOCKGUARD(gROOTMutex);
1587  return fFunctions->FindObject(name);
1588 }
1589 
1590 ////////////////////////////////////////////////////////////////////////////////
1591 
1593 {
1594  if (!gInterpreter) return 0;
1595 
1597 
1598  return (TFunctionTemplate*)fFuncTemplate->FindObject(name);
1599 }
1600 
1601 ////////////////////////////////////////////////////////////////////////////////
1602 /// Return pointer to global variable by name. If load is true force
1603 /// reading of all currently defined globals from CINT (more expensive).
1604 
1605 TGlobal *TROOT::GetGlobal(const char *name, Bool_t load) const
1606 {
1607  return (TGlobal *)gROOT->GetListOfGlobals(load)->FindObject(name);
1608 }
1609 
1610 ////////////////////////////////////////////////////////////////////////////////
1611 /// Return pointer to global variable with address addr.
1612 
1613 TGlobal *TROOT::GetGlobal(const TObject *addr, Bool_t /* load */) const
1614 {
1615  if (addr == 0 || ((Long_t)addr) == -1) return 0;
1616 
1617  TInterpreter::DeclId_t decl = gInterpreter->GetDataMemberAtAddr(addr);
1618  if (decl) {
1619  TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1620  return (TGlobal*)globals->Get(decl);
1621  }
1622  // If we are actually looking for a global that is held by a global
1623  // pointer (for example gRandom), we need to find a pointer with the
1624  // correct value.
1625  decl = gInterpreter->GetDataMemberWithValue(addr);
1626  if (decl) {
1627  TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1628  return (TGlobal*)globals->Get(decl);
1629  }
1630  return 0;
1631 }
1632 
1633 ////////////////////////////////////////////////////////////////////////////////
1634 /// Internal routine returning, and creating if necessary, the list
1635 /// of global function.
1636 
1638 {
1640  return fGlobalFunctions;
1641 }
1642 
1643 ////////////////////////////////////////////////////////////////////////////////
1644 /// Return the collection of functions named "name".
1645 
1647 {
1648  return ((TListOfFunctions*)fGlobalFunctions)->GetListForObject(name);
1649 }
1650 
1651 ////////////////////////////////////////////////////////////////////////////////
1652 /// Return pointer to global function by name.
1653 /// If params != 0 it will also resolve overloading other it returns the first
1654 /// name match.
1655 /// If params == 0 and load is true force reading of all currently defined
1656 /// global functions from Cling.
1657 /// The param string must be of the form: "3189,\"aap\",1.3".
1658 
1659 TFunction *TROOT::GetGlobalFunction(const char *function, const char *params,
1660  Bool_t load)
1661 {
1662  if (!params) {
1663  R__LOCKGUARD(gROOTMutex);
1664  return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(function);
1665  } else {
1666  if (!fInterpreter)
1667  Fatal("GetGlobalFunction", "fInterpreter not initialized");
1668 
1669  R__LOCKGUARD(gROOTMutex);
1670  TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithValues(0,
1671  function, params,
1672  false);
1673 
1674  if (!decl) return 0;
1675 
1676  TFunction *f = GetGlobalFunctions()->Get(decl);
1677  if (f) return f;
1678 
1679  Error("GetGlobalFunction",
1680  "\nDid not find matching TFunction <%s> with \"%s\".",
1681  function,params);
1682  return 0;
1683  }
1684 }
1685 
1686 ////////////////////////////////////////////////////////////////////////////////
1687 /// Return pointer to global function by name. If proto != 0
1688 /// it will also resolve overloading. If load is true force reading
1689 /// of all currently defined global functions from CINT (more expensive).
1690 /// The proto string must be of the form: "int, char*, float".
1691 
1693  const char *proto, Bool_t load)
1694 {
1695  if (!proto) {
1696  R__LOCKGUARD(gROOTMutex);
1697  return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(function);
1698  } else {
1699  if (!fInterpreter)
1700  Fatal("GetGlobalFunctionWithPrototype", "fInterpreter not initialized");
1701 
1702  R__LOCKGUARD(gROOTMutex);
1703  TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithPrototype(0,
1704  function, proto);
1705 
1706  if (!decl) return 0;
1707 
1708  TFunction *f = GetGlobalFunctions()->Get(decl);
1709  if (f) return f;
1710 
1711  Error("GetGlobalFunctionWithPrototype",
1712  "\nDid not find matching TFunction <%s> with \"%s\".",
1713  function,proto);
1714  return 0;
1715  }
1716 }
1717 
1718 ////////////////////////////////////////////////////////////////////////////////
1719 /// Return pointer to Geometry with name
1720 
1721 TObject *TROOT::GetGeometry(const char *name) const
1722 {
1723  return GetListOfGeometries()->FindObject(name);
1724 }
1725 
1726 ////////////////////////////////////////////////////////////////////////////////
1727 
1729 {
1730  if(!fEnums.load()) {
1731  R__LOCKGUARD(gROOTMutex);
1732  // Test again just in case, another thread did the work while we were
1733  // waiting.
1734  if (!fEnums.load()) fEnums = new TListOfEnumsWithLock(0);
1735  }
1736  if (load) {
1737  R__LOCKGUARD(gROOTMutex);
1738  (*fEnums).Load(); // Refresh the list of enums.
1739  }
1740  return fEnums.load();
1741 }
1742 
1743 ////////////////////////////////////////////////////////////////////////////////
1744 
1746 {
1747  R__LOCKGUARD(gROOTMutex);
1748  if(!fFuncTemplate) {
1750  }
1751  return fFuncTemplate;
1752 }
1753 
1754 ////////////////////////////////////////////////////////////////////////////////
1755 /// Return list containing the TGlobals currently defined.
1756 /// Since globals are created and deleted during execution of the
1757 /// program, we need to update the list of globals every time we
1758 /// execute this method. However, when calling this function in
1759 /// a (tight) loop where no interpreter symbols will be created
1760 /// you can set load=kFALSE (default).
1761 
1763 {
1764  if (!fGlobals) {
1765  // We add to the list the "funcky-fake" globals.
1766  fGlobals = new TListOfDataMembers(0);
1767  fGlobals->Add(new TGlobalMappedFunction("gROOT", "TROOT*",
1769  fGlobals->Add(new TGlobalMappedFunction("gPad", "TVirtualPad*",
1771  fGlobals->Add(new TGlobalMappedFunction("gInterpreter", "TInterpreter*",
1773  fGlobals->Add(new TGlobalMappedFunction("gVirtualX", "TVirtualX*",
1775  fGlobals->Add(new TGlobalMappedFunction("gDirectory", "TDirectory*",
1777  // Don't let TGlobalMappedFunction delete our globals, now that we take them.
1781  }
1782 
1783  if (!fInterpreter)
1784  Fatal("GetListOfGlobals", "fInterpreter not initialized");
1785 
1786  if (load) fGlobals->Load();
1787 
1788  return fGlobals;
1789 }
1790 
1791 ////////////////////////////////////////////////////////////////////////////////
1792 /// Return list containing the TFunctions currently defined.
1793 /// Since functions are created and deleted during execution of the
1794 /// program, we need to update the list of functions every time we
1795 /// execute this method. However, when calling this function in
1796 /// a (tight) loop where no interpreter symbols will be created
1797 /// you can set load=kFALSE (default).
1798 
1800 {
1801  R__LOCKGUARD(gROOTMutex);
1802 
1803  if (!fGlobalFunctions) {
1805  }
1806 
1807  if (!fInterpreter)
1808  Fatal("GetListOfGlobalFunctions", "fInterpreter not initialized");
1809 
1810  // A thread that calls with load==true and a thread that calls with load==false
1811  // will conflict here (the load==true will be updating the list while the
1812  // other is reading it). To solve the problem, we could use a read-write lock
1813  // inside the list itself.
1814  if (load) fGlobalFunctions->Load();
1815 
1816  return fGlobalFunctions;
1817 }
1818 
1819 ////////////////////////////////////////////////////////////////////////////////
1820 /// Return a dynamic list giving access to all TDataTypes (typedefs)
1821 /// currently defined.
1822 ///
1823 /// The list is populated on demand. Calling
1824 /// ~~~ {.cpp}
1825 /// gROOT->GetListOfTypes()->FindObject(nameoftype);
1826 /// ~~~
1827 /// will return the TDataType corresponding to 'nameoftype'. If the
1828 /// TDataType is not already in the list itself and the type does exist,
1829 /// a new TDataType will be created and added to the list.
1830 ///
1831 /// Calling
1832 /// ~~~ {.cpp}
1833 /// gROOT->GetListOfTypes()->ls(); // or Print()
1834 /// ~~~
1835 /// list only the typedefs that have been previously accessed through the
1836 /// list (plus the builtins types).
1837 
1839 {
1840  if (!fInterpreter)
1841  Fatal("GetListOfTypes", "fInterpreter not initialized");
1842 
1843  return fTypes;
1844 }
1845 
1846 
1847 ////////////////////////////////////////////////////////////////////////////////
1848 /// Execute command when system has been idle for idleTimeInSec seconds.
1849 
1850 void TROOT::Idle(UInt_t idleTimeInSec, const char *command)
1851 {
1852  if (!fApplication.load())
1854 
1855  if (idleTimeInSec <= 0)
1856  (*fApplication).RemoveIdleTimer();
1857  else
1858  (*fApplication).SetIdleTimer(idleTimeInSec, command);
1859 }
1860 
1861 ////////////////////////////////////////////////////////////////////////////////
1862 /// Check whether className is a known class, and only autoload
1863 /// if we can. Helper function for TROOT::IgnoreInclude().
1864 
1865 static TClass* R__GetClassIfKnown(const char* className)
1866 {
1867  // Check whether the class is available for auto-loading first:
1868  const char* libsToLoad = gInterpreter->GetClassSharedLibs(className);
1869  TClass* cla = 0;
1870  if (libsToLoad) {
1871  // trigger autoload, and only create TClass in this case.
1872  return TClass::GetClass(className);
1873  } else if (gROOT->GetListOfClasses()
1874  && (cla = (TClass*)gROOT->GetListOfClasses()->FindObject(className))) {
1875  // cla assigned in if statement
1876  } else if (gClassTable->FindObject(className)) {
1877  return TClass::GetClass(className);
1878  }
1879  return cla;
1880 }
1881 
1882 ////////////////////////////////////////////////////////////////////////////////
1883 /// Return 1 if the name of the given include file corresponds to a class that
1884 /// is known to ROOT, e.g. "TLorentzVector.h" versus TLorentzVector.
1885 
1886 Int_t TROOT::IgnoreInclude(const char *fname, const char * /*expandedfname*/)
1887 {
1888  if (fname == 0) return 0;
1889 
1890  TString stem(fname);
1891  // Remove extension if any, ignore files with extension not being .h*
1892  Int_t where = stem.Last('.');
1893  if (where != kNPOS) {
1894  if (stem.EndsWith(".so") || stem.EndsWith(".sl") ||
1895  stem.EndsWith(".dl") || stem.EndsWith(".a") ||
1896  stem.EndsWith(".dll", TString::kIgnoreCase))
1897  return 0;
1898  stem.Remove(where);
1899  }
1900 
1901  TString className = gSystem->BaseName(stem);
1902  TClass* cla = R__GetClassIfKnown(className);
1903  if (!cla) {
1904  // Try again with modifications to the file name:
1905  className = stem;
1906  className.ReplaceAll("/", "::");
1907  className.ReplaceAll("\\", "::");
1908  if (className.Contains(":::")) {
1909  // "C:\dir" becomes "C:::dir".
1910  // fname corresponds to whatever is stated after #include and
1911  // a full path name usually means that it's not a regular #include
1912  // but e.g. a ".L", so we can assume that this is not a header of
1913  // a class in a namespace (a global-namespace class would have been
1914  // detected already before).
1915  return 0;
1916  }
1917  cla = R__GetClassIfKnown(className);
1918  }
1919 
1920  if (!cla) {
1921  return 0;
1922  }
1923 
1924  // cla is valid, check wether it's actually in the header of the same name:
1925  if (cla->GetDeclFileLine() <= 0) return 0; // to a void an error with VisualC++
1926  TString decfile = gSystem->BaseName(cla->GetDeclFileName());
1927  if (decfile != gSystem->BaseName(fname)) {
1928  return 0;
1929  }
1930  return 1;
1931 }
1932 
1933 ////////////////////////////////////////////////////////////////////////////////
1934 /// Initialize operating system interface.
1935 
1937 {
1938  if (gSystem == 0) {
1939 #if defined(R__UNIX)
1940 #if defined(R__HAS_COCOA)
1941  gSystem = new TMacOSXSystem;
1942 #else
1943  gSystem = new TUnixSystem;
1944 #endif
1945 #elif defined(R__WIN32)
1946  gSystem = new TWinNTSystem;
1947 #else
1948  gSystem = new TSystem;
1949 #endif
1950 
1951  if (gSystem->Init())
1952  fprintf(stderr, "Fatal in <TROOT::InitSystem>: can't init operating system layer\n");
1953 
1954  if (!gSystem->HomeDirectory()) {
1955  fprintf(stderr, "Fatal in <TROOT::InitSystem>: HOME directory not set\n");
1956  fprintf(stderr, "Fix this by defining the HOME shell variable\n");
1957  }
1958 
1959  // read default files
1960  gEnv = new TEnv(".rootrc");
1961 
1962  gDebug = gEnv->GetValue("Root.Debug", 0);
1963 
1964  if (!gEnv->GetValue("Root.ErrorHandlers", 1))
1965  gSystem->ResetSignals();
1966 
1967  Int_t zipmode = gEnv->GetValue("Root.CompressionAlgorithm", 0);
1968  if (zipmode != 0) R__SetZipMode(zipmode);
1969 
1970  const char *sdeb;
1971  if ((sdeb = gSystem->Getenv("ROOTDEBUG")))
1972  gDebug = atoi(sdeb);
1973 
1974  if (gDebug > 0 && isatty(2))
1975  fprintf(stderr, "Info in <TROOT::InitSystem>: running with gDebug = %d\n", gDebug);
1976 
1977  if (gEnv->GetValue("Root.MemStat", 0))
1979  int msize = gEnv->GetValue("Root.MemStat.size", -1);
1980  int mcnt = gEnv->GetValue("Root.MemStat.cnt", -1);
1981  if (msize != -1 || mcnt != -1)
1982  TStorage::EnableStatistics(msize, mcnt);
1983 
1984  fgMemCheck = gEnv->GetValue("Root.MemCheck", 0);
1985 
1986 #if defined(R__HAS_COCOA)
1987  // create and delete a dummy TUrl so that TObjectStat table does not contain
1988  // objects that are deleted after recording is turned-off (in next line),
1989  // like the TUrl::fgSpecialProtocols list entries which are created in the
1990  // TMacOSXSystem ctor.
1991  { TUrl dummy("/dummy"); }
1992 #endif
1993  TObject::SetObjectStat(gEnv->GetValue("Root.ObjectStat", 0));
1994  }
1995 }
1996 
1997 ////////////////////////////////////////////////////////////////////////////////
1998 /// Load and initialize thread library.
1999 
2001 {
2002  if (gEnv->GetValue("Root.UseThreads", 0) || gEnv->GetValue("Root.EnableThreadSafety", 0)) {
2004  }
2005 }
2006 
2007 ////////////////////////////////////////////////////////////////////////////////
2008 /// Initialize the interpreter. Should be called only after main(),
2009 /// to make sure LLVM/Clang is fully initialized.
2010 
2012 {
2013  // usedToIdentifyRootClingByDlSym is available when TROOT is part of
2014  // rootcling.
2015  if (!dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")
2016  && !dlsym(RTLD_DEFAULT, "usedToIdentifyStaticRoot")) {
2017  // Make sure no llvm symbols are visible before loading libCling. If they
2018  // exist libCling will use those and not ours, causing havoc in the
2019  // interpreter. Look for an extern "C" symbol to avoid mangling; look for a
2020  // symbol from llvm because clang builds on top, so users would likely
2021  // have also their own llvm symbols when providing their own clang.
2022  void *LLVMEnablePrettyStackTraceAddr = 0;
2023  // Can't use gSystem->DynFindSymbol() because that iterates over all *known*
2024  // libraries which is not the same!
2025  LLVMEnablePrettyStackTraceAddr = dlsym(RTLD_DEFAULT, "LLVMEnablePrettyStackTrace");
2026  // FIXME: When we configure with -Dclingtest=On we intentionally export the symbols. Silence this error.
2027  if (LLVMEnablePrettyStackTraceAddr) {
2028  Error("InitInterpreter()", "LLVM SYMBOLS ARE EXPOSED TO CLING! "
2029  "This will cause problems; please hide them or dlopen() them "
2030  "after the call to TROOT::InitInterpreter()!");
2031  }
2032 
2033  char *libRIO = gSystem->DynamicPathName("libRIO");
2034  void *libRIOHandle = dlopen(libRIO, RTLD_NOW|RTLD_GLOBAL);
2035  delete [] libRIO;
2036  if (!libRIOHandle) {
2037  TString err = dlerror();
2038  fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2039  exit(1);
2040  }
2041 
2042  char *libcling = gSystem->DynamicPathName("libCling");
2043  gInterpreterLib = dlopen(libcling, RTLD_LAZY|RTLD_LOCAL);
2044  delete [] libcling;
2045 
2046  if (!gInterpreterLib) {
2047  TString err = dlerror();
2048  fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2049  exit(1);
2050  }
2051  dlerror(); // reset error message
2052  } else {
2053  gInterpreterLib = RTLD_DEFAULT;
2054  }
2055  CreateInterpreter_t *CreateInterpreter = (CreateInterpreter_t*) dlsym(gInterpreterLib, "CreateInterpreter");
2056  if (!CreateInterpreter) {
2057  TString err = dlerror();
2058  fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2059  exit(1);
2060  }
2061  // Schedule the destruction of TROOT.
2062  atexit(at_exit_of_TROOT);
2063 
2064  gDestroyInterpreter = (DestroyInterpreter_t*) dlsym(gInterpreterLib, "DestroyInterpreter");
2065  if (!gDestroyInterpreter) {
2066  TString err = dlerror();
2067  fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2068  exit(1);
2069  }
2070 
2071  const char *interpArgs[] = {
2072 #ifdef NDEBUG
2073  "-DNDEBUG",
2074 #else
2075  "-UNDEBUG",
2076 #endif
2077 #ifdef DEBUG
2078  "-DDEBUG",
2079 #else
2080  "-UDEBUG",
2081 #endif
2082 #ifdef _DEBUG
2083  "-D_DEBUG",
2084 #else
2085  "-U_DEBUG",
2086 #endif
2087  nullptr};
2088 
2089  fInterpreter = CreateInterpreter(gInterpreterLib, interpArgs);
2090 
2093 
2094  fgRootInit = kTRUE;
2095 
2096  // initialize gClassTable is not already done
2097  if (!gClassTable)
2098  new TClassTable;
2099 
2100  // Initialize all registered dictionaries.
2101  for (std::vector<ModuleHeaderInfo_t>::const_iterator
2102  li = GetModuleHeaderInfoBuffer().begin(),
2103  le = GetModuleHeaderInfoBuffer().end(); li != le; ++li) {
2104  // process buffered module registrations
2105  fInterpreter->RegisterModule(li->fModuleName,
2106  li->fHeaders,
2107  li->fIncludePaths,
2108  li->fPayloadCode,
2109  li->fFwdDeclCode,
2110  li->fTriggerFunc,
2111  li->fFwdNargsToKeepColl,
2112  li->fClassesHeaders,
2113  kTRUE /*lateRegistration*/,
2114  li->fHasCxxModule);
2115  }
2116  GetModuleHeaderInfoBuffer().clear();
2117 
2119 
2120  // Read the rules before enabling the auto loading to not inadvertently
2121  // load the libraries for the classes concerned even-though the user is
2122  // *not* using them.
2123  TClass::ReadRules(); // Read the default customization rules ...
2124 
2125  // Enable autoloading
2127 }
2128 
2129 ////////////////////////////////////////////////////////////////////////////////
2130 /// Helper function used by TClass::GetClass().
2131 /// This function attempts to load the dictionary for 'classname'
2132 /// either from the TClassTable or from the list of generator.
2133 /// If silent is 'true', do not warn about missing dictionary for the class.
2134 /// (typically used for class that are used only for transient members)
2135 ///
2136 /// The 'requestedname' is expected to be already normalized.
2137 
2138 TClass *TROOT::LoadClass(const char *requestedname, Bool_t silent) const
2139 {
2140  return TClass::LoadClass(requestedname, silent);
2141 }
2142 
2143 ////////////////////////////////////////////////////////////////////////////////
2144 /// Check if class "classname" is known to the interpreter (in fact,
2145 /// this check is not needed anymore, so classname is ignored). If
2146 /// not it will load library "libname". If the library name does
2147 /// not start with "lib", "lib" will be prepended and a search will
2148 /// be made in the DynamicPath (see .rootrc). If not found a search
2149 /// will be made on libname (without "lib" prepended) and if not found
2150 /// a direct try of libname will be made (in case it contained an
2151 /// absolute path).
2152 /// If check is true it will only check if libname exists and is
2153 /// readable.
2154 /// Returns 0 on successful loading, -1 in case libname does not
2155 /// exist or in case of error and -2 in case of version mismatch.
2156 
2157 Int_t TROOT::LoadClass(const char * /*classname*/, const char *libname,
2158  Bool_t check)
2159 {
2160  Int_t err = -1;
2161 
2162  char *path;
2163  TString lib = libname;
2164  if (!lib.BeginsWith("lib"))
2165  lib = "lib" + lib;
2166  if ((path = gSystem->DynamicPathName(lib, kTRUE))) {
2167  if (check)
2168  err = 0;
2169  else {
2170  err = gSystem->Load(path, 0, kTRUE);
2171  }
2172  delete [] path;
2173  } else {
2174  if (check) {
2175  FileStat_t stat;
2176  if (!gSystem->GetPathInfo(libname, stat)) {
2177  if (R_ISREG(stat.fMode) &&
2179  err = 0;
2180  else
2181  err = -1;
2182  } else
2183  err = -1;
2184  } else {
2185  err = gSystem->Load(libname, 0, kTRUE);
2186  }
2187  }
2188 
2189  if (err == -1) {
2190  //Error("LoadClass", "library %s could not be loaded", libname);
2191  }
2192 
2193  if (err == 1) {
2194  //Error("LoadClass", "library %s already loaded, but class %s unknown",
2195  // libname, classname);
2196  err = 0;
2197  }
2198 
2199  return err;
2200 }
2201 
2202 ////////////////////////////////////////////////////////////////////////////////
2203 /// Return true if the file is local and is (likely) to be a ROOT file
2204 
2205 Bool_t TROOT::IsRootFile(const char *filename) const
2206 {
2207  Bool_t result = kFALSE;
2208  FILE *mayberootfile = fopen(filename,"rb");
2209  if (mayberootfile) {
2210  char header[5];
2211  if (fgets(header,5,mayberootfile)) {
2212  result = strncmp(header,"root",4)==0;
2213  }
2214  fclose(mayberootfile);
2215  }
2216  return result;
2217 }
2218 
2219 ////////////////////////////////////////////////////////////////////////////////
2220 /// To list all objects of the application.
2221 /// Loop on all objects created in the ROOT linked lists.
2222 /// Objects may be files and windows or any other object directly
2223 /// attached to the ROOT linked list.
2224 
2225 void TROOT::ls(Option_t *option) const
2226 {
2227 // TObject::SetDirLevel();
2228 // GetList()->R__FOR_EACH(TObject,ls)(option);
2229  TDirectory::ls(option);
2230 }
2231 
2232 ////////////////////////////////////////////////////////////////////////////////
2233 /// Load a macro in the interpreter's memory. Equivalent to the command line
2234 /// command ".L filename". If the filename has "+" or "++" appended
2235 /// the macro will be compiled by ACLiC. The filename must have the format:
2236 /// [path/]macro.C[+|++[g|O]].
2237 /// The possible error codes are defined by TInterpreter::EErrorCode.
2238 /// If check is true it will only check if filename exists and is
2239 /// readable.
2240 /// Returns 0 on successful loading and -1 in case filename does not
2241 /// exist or in case of error.
2242 
2243 Int_t TROOT::LoadMacro(const char *filename, int *error, Bool_t check)
2244 {
2245  Int_t err = -1;
2246  Int_t lerr, *terr;
2247  if (error)
2248  terr = error;
2249  else
2250  terr = &lerr;
2251 
2252  if (fInterpreter) {
2253  TString aclicMode;
2254  TString arguments;
2255  TString io;
2256  TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2257 
2258  if (arguments.Length()) {
2259  Warning("LoadMacro", "argument(%s) ignored in %s", arguments.Data(), GetMacroPath());
2260  }
2261  char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2262  if (!mac) {
2263  if (!check)
2264  Error("LoadMacro", "macro %s not found in path %s", fname.Data(), GetMacroPath());
2265  *terr = TInterpreter::kFatal;
2266  } else {
2267  err = 0;
2268  if (!check) {
2269  fname = mac;
2270  fname += aclicMode;
2271  fname += io;
2272  gInterpreter->LoadMacro(fname.Data(), (TInterpreter::EErrorCode*)terr);
2273  if (*terr)
2274  err = -1;
2275  }
2276  }
2277  delete [] mac;
2278  }
2279  return err;
2280 }
2281 
2282 ////////////////////////////////////////////////////////////////////////////////
2283 /// Execute a macro in the interpreter. Equivalent to the command line
2284 /// command ".x filename". If the filename has "+" or "++" appended
2285 /// the macro will be compiled by ACLiC. The filename must have the format:
2286 /// [path/]macro.C[+|++[g|O]][(args)].
2287 /// The possible error codes are defined by TInterpreter::EErrorCode.
2288 /// If padUpdate is true (default) update the current pad.
2289 /// Returns the macro return value.
2290 
2291 Long_t TROOT::Macro(const char *filename, Int_t *error, Bool_t padUpdate)
2292 {
2293  Long_t result = 0;
2294 
2295  if (fInterpreter) {
2296  TString aclicMode;
2297  TString arguments;
2298  TString io;
2299  TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2300 
2301  char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2302  if (!mac) {
2303  Error("Macro", "macro %s not found in path %s", fname.Data(), GetMacroPath());
2304  if (error)
2305  *error = TInterpreter::kFatal;
2306  } else {
2307  fname = mac;
2308  fname += aclicMode;
2309  fname += arguments;
2310  fname += io;
2311  result = gInterpreter->ExecuteMacro(fname, (TInterpreter::EErrorCode*)error);
2312  }
2313  delete [] mac;
2314 
2315  if (padUpdate && gPad)
2316  gPad->Update();
2317  }
2318 
2319  return result;
2320 }
2321 
2322 ////////////////////////////////////////////////////////////////////////////////
2323 /// Process message id called by obj.
2324 
2325 void TROOT::Message(Int_t id, const TObject *obj)
2326 {
2327  TIter next(fMessageHandlers);
2328  TMessageHandler *mh;
2329  while ((mh = (TMessageHandler*)next())) {
2330  mh->HandleMessage(id,obj);
2331  }
2332 }
2333 
2334 ////////////////////////////////////////////////////////////////////////////////
2335 /// Process interpreter command via TApplication::ProcessLine().
2336 /// On Win32 the line will be processed asynchronously by sending
2337 /// it to the CINT interpreter thread. For explicit synchronous processing
2338 /// use ProcessLineSync(). On non-Win32 platforms there is no difference
2339 /// between ProcessLine() and ProcessLineSync().
2340 /// The possible error codes are defined by TInterpreter::EErrorCode. In
2341 /// particular, error will equal to TInterpreter::kProcessing until the
2342 /// CINT interpreted thread has finished executing the line.
2343 /// Returns the result of the command, cast to a Long_t.
2344 
2345 Long_t TROOT::ProcessLine(const char *line, Int_t *error)
2346 {
2347  TString sline = line;
2348  sline = sline.Strip(TString::kBoth);
2349 
2350  if (!fApplication.load())
2352 
2353  return (*fApplication).ProcessLine(sline, kFALSE, error);
2354 }
2355 
2356 ////////////////////////////////////////////////////////////////////////////////
2357 /// Process interpreter command via TApplication::ProcessLine().
2358 /// On Win32 the line will be processed synchronously (i.e. it will
2359 /// only return when the CINT interpreter thread has finished executing
2360 /// the line). On non-Win32 platforms there is no difference between
2361 /// ProcessLine() and ProcessLineSync().
2362 /// The possible error codes are defined by TInterpreter::EErrorCode.
2363 /// Returns the result of the command, cast to a Long_t.
2364 
2366 {
2367  TString sline = line;
2368  sline = sline.Strip(TString::kBoth);
2369 
2370  if (!fApplication.load())
2372 
2373  return (*fApplication).ProcessLine(sline, kTRUE, error);
2374 }
2375 
2376 ////////////////////////////////////////////////////////////////////////////////
2377 /// Process interpreter command directly via CINT interpreter.
2378 /// Only executable statements are allowed (no variable declarations),
2379 /// In all other cases use TROOT::ProcessLine().
2380 /// The possible error codes are defined by TInterpreter::EErrorCode.
2381 
2383 {
2384  TString sline = line;
2385  sline = sline.Strip(TString::kBoth);
2386 
2387  if (!fApplication.load())
2389 
2390  Long_t result = 0;
2391 
2392  if (fInterpreter) {
2394  result = gInterpreter->Calc(sline, code);
2395  }
2396 
2397  return result;
2398 }
2399 
2400 ////////////////////////////////////////////////////////////////////////////////
2401 /// Read Git commit information and branch name from the
2402 /// etc/gitinfo.txt file.
2403 
2405 {
2406 #ifdef ROOT_GIT_COMMIT
2407  fGitCommit = ROOT_GIT_COMMIT;
2408 #endif
2409 #ifdef ROOT_GIT_BRANCH
2410  fGitBranch = ROOT_GIT_BRANCH;
2411 #endif
2412 
2413  TString gitinfo = "gitinfo.txt";
2414  char *filename = gSystem->ConcatFileName(TROOT::GetEtcDir(), gitinfo);
2415 
2416  FILE *fp = fopen(filename, "r");
2417  if (fp) {
2418  TString s;
2419  // read branch name
2420  s.Gets(fp);
2421  fGitBranch = s;
2422  // read commit SHA1
2423  s.Gets(fp);
2424  fGitCommit = s;
2425  // read date/time make was run
2426  s.Gets(fp);
2427  fGitDate = s;
2428  fclose(fp);
2429  }
2430  delete [] filename;
2431 }
2432 
2434  TTHREAD_TLS(Bool_t) fgReadingObject = false;
2435  return fgReadingObject;
2436 }
2437 
2438 ////////////////////////////////////////////////////////////////////////////////
2439 /// Deprecated (will be removed in next release).
2440 
2442 {
2443  return GetReadingObject();
2444 }
2445 
2447 {
2448  GetReadingObject() = flag;
2449 }
2450 
2451 
2452 ////////////////////////////////////////////////////////////////////////////////
2453 /// Return date/time make was run.
2454 
2455 const char *TROOT::GetGitDate()
2456 {
2457  if (fGitDate == "") {
2458  Int_t iday,imonth,iyear, ihour, imin;
2459  static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
2460  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
2461  Int_t idate = gROOT->GetBuiltDate();
2462  Int_t itime = gROOT->GetBuiltTime();
2463  iday = idate%100;
2464  imonth = (idate/100)%100;
2465  iyear = idate/10000;
2466  ihour = itime/100;
2467  imin = itime%100;
2468  fGitDate.Form("%s %02d %4d, %02d:%02d:00", months[imonth-1], iday, iyear, ihour, imin);
2469  }
2470  return fGitDate;
2471 }
2472 
2473 ////////////////////////////////////////////////////////////////////////////////
2474 /// Recursively remove this object from the list of Cleanups.
2475 /// Typically RecursiveRemove is implemented by classes that can contain
2476 /// mulitple references to a same object or shared ownership of the object
2477 /// with others.
2478 
2480 {
2481  R__READ_LOCKGUARD(ROOT::gCoreMutex);
2482 
2483  fCleanups->RecursiveRemove(obj);
2484 }
2485 
2486 ////////////////////////////////////////////////////////////////////////////////
2487 /// Refresh all browsers. Call this method when some command line
2488 /// command or script has changed the browser contents. Not needed
2489 /// for objects that have the kMustCleanup bit set. Most useful to
2490 /// update browsers that show the file system or other objects external
2491 /// to the running ROOT session.
2492 
2494 {
2495  TIter next(GetListOfBrowsers());
2496  TBrowser *b;
2497  while ((b = (TBrowser*) next()))
2498  b->SetRefreshFlag(kTRUE);
2499 }
2500 ////////////////////////////////////////////////////////////////////////////////
2501 /// Insure that the files, canvases and sockets are closed.
2502 
2503 static void CallCloseFiles()
2504 {
2505  if (TROOT::Initialized() && ROOT::Internal::gROOTLocal) {
2506  gROOT->CloseFiles();
2507  }
2508 }
2509 
2510 ////////////////////////////////////////////////////////////////////////////////
2511 /// Called by static dictionary initialization to register clang modules
2512 /// for headers. Calls TCling::RegisterModule() unless gCling
2513 /// is NULL, i.e. during startup, where the information is buffered in
2514 /// the static GetModuleHeaderInfoBuffer().
2515 
2516 void TROOT::RegisterModule(const char* modulename,
2517  const char** headers,
2518  const char** includePaths,
2519  const char* payloadCode,
2520  const char* fwdDeclCode,
2521  void (*triggerFunc)(),
2522  const TInterpreter::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
2523  const char** classesHeaders,
2524  bool hasCxxModule)
2525 {
2526 
2527  // First a side track to insure proper end of process behavior.
2528 
2529  // Register for each loaded dictionary (and thus for each library),
2530  // that we need to Close the ROOT files as soon as this library
2531  // might start being unloaded after main.
2532  //
2533  // By calling atexit here (rather than directly from within the
2534  // library) we make sure that this is not called if the library is
2535  // 'only' dlclosed.
2536 
2537  // On Ubuntu the linker strips the unused libraries. Eventhough
2538  // stressHistogram is explicitly linked against libNet, it is not
2539  // retained and thus is loaded only as needed in the middle part of
2540  // the execution. Concretely this also means that it is loaded
2541  // *after* the construction of the TApplication object and thus
2542  // after the registration (atexit) of the EndOfProcessCleanups
2543  // routine. Consequently, after the end of main, libNet is
2544  // unloaded before EndOfProcessCleanups is called. When
2545  // EndOfProcessCleanups is executed it indirectly needs the TClass
2546  // for TSocket and its search will use resources that have already
2547  // been unloaded (technically the function static in TUnixSystem's
2548  // DynamicPath and the dictionary from libNet).
2549 
2550  // Similarly, the ordering (before this commit) was broken in the
2551  // following case:
2552 
2553  // TApplication creation (EndOfProcessCleanups registration)
2554  // load UserLibrary
2555  // create TFile
2556  // Append UserObject to TFile
2557 
2558  // and after the end of main the order of execution was
2559 
2560  // unload UserLibrary
2561  // call EndOfProcessCleanups
2562  // Write the TFile
2563  // attempt to write the user object.
2564  // ....
2565 
2566  // where what we need is to have the files closen/written before
2567  // the unloading of the library.
2568 
2569  // To solve the problem we now register an atexit function for
2570  // every dictionary thus making sure there is at least one executed
2571  // before the first library tear down after main.
2572 
2573  // If atexit is called directly within a library's code, the
2574  // function will called *either* when the library is 'dlclose'd or
2575  // after then end of main (whichever comes first). We do *not*
2576  // want the files to be closed whenever a library is unloaded via
2577  // dlclose. To avoid this, we add the function (CallCloseFiles)
2578  // from the dictionary indirectly (via ROOT::RegisterModule). In
2579  // this case the function will only only be called either when
2580  // libCore is 'dlclose'd or right after the end of main.
2581 
2582  atexit(CallCloseFiles);
2583 
2584  // Now register with TCling.
2585  if (gCling) {
2586  gCling->RegisterModule(modulename, headers, includePaths, payloadCode, fwdDeclCode, triggerFunc,
2587  fwdDeclsArgToSkip, classesHeaders, false, hasCxxModule);
2588  } else {
2589  GetModuleHeaderInfoBuffer().push_back(ModuleHeaderInfo_t(modulename, headers, includePaths, payloadCode,
2590  fwdDeclCode, triggerFunc, fwdDeclsArgToSkip,
2591  classesHeaders, hasCxxModule));
2592  }
2593 }
2594 
2595 ////////////////////////////////////////////////////////////////////////////////
2596 /// Remove an object from the in-memory list.
2597 /// Since TROOT is global resource, this is lock protected.
2598 
2600 {
2601  R__LOCKGUARD(gROOTMutex);
2602  return TDirectory::Remove(obj);
2603 }
2604 
2605 ////////////////////////////////////////////////////////////////////////////////
2606 /// Remove a class from the list and map of classes.
2607 /// This routine is deprecated, use TClass::RemoveClass directly.
2608 
2610 {
2611  TClass::RemoveClass(oldcl);
2612 }
2613 
2614 ////////////////////////////////////////////////////////////////////////////////
2615 /// Delete all global interpreter objects created since the last call to Reset
2616 ///
2617 /// If option="a" is set reset to startup context (i.e. unload also
2618 /// all loaded files, classes, structs, typedefs, etc.).
2619 ///
2620 /// This function is typically used at the beginning (or end) of an unnamed macro
2621 /// to clean the environment.
2622 ///
2623 /// IMPORTANT WARNING:
2624 /// Do not use this call from within any function (neither compiled nor
2625 /// interpreted. This should only be used from a unnamed macro
2626 /// (which starts with a { (curly braces) ). For example, using TROOT::Reset
2627 /// from within an interpreted function will lead to the unloading of the
2628 /// dictionary and source file, including the one defining the function being
2629 /// executed.
2630 ///
2631 
2632 void TROOT::Reset(Option_t *option)
2633 {
2634  if (IsExecutingMacro()) return; //True when TMacro::Exec runs
2635  if (fInterpreter) {
2636  if (!strncmp(option, "a", 1)) {
2637  fInterpreter->Reset();
2639  } else
2640  gInterpreter->ResetGlobals();
2641 
2642  if (fGlobals) fGlobals->Unload();
2644 
2645  SaveContext();
2646  }
2647 }
2648 
2649 ////////////////////////////////////////////////////////////////////////////////
2650 /// Save the current interpreter context.
2651 
2653 {
2654  if (fInterpreter)
2655  gInterpreter->SaveGlobalsContext();
2656 }
2657 
2658 ////////////////////////////////////////////////////////////////////////////////
2659 /// Set the default graphical cut class name for the graphics editor
2660 /// By default the graphics editor creates an instance of a class TCutG.
2661 /// This function may be called to specify a different class that MUST
2662 /// derive from TCutG
2663 
2664 void TROOT::SetCutClassName(const char *name)
2665 {
2666  if (!name) {
2667  Error("SetCutClassName","Invalid class name");
2668  return;
2669  }
2670  TClass *cl = TClass::GetClass(name);
2671  if (!cl) {
2672  Error("SetCutClassName","Unknown class:%s",name);
2673  return;
2674  }
2675  if (!cl->InheritsFrom("TCutG")) {
2676  Error("SetCutClassName","Class:%s does not derive from TCutG",name);
2677  return;
2678  }
2679  fCutClassName = name;
2680 }
2681 
2682 ////////////////////////////////////////////////////////////////////////////////
2683 /// Set editor mode
2684 
2685 void TROOT::SetEditorMode(const char *mode)
2686 {
2687  fEditorMode = 0;
2688  if (!mode[0]) return;
2689  if (!strcmp(mode,"Arc")) {fEditorMode = kArc; return;}
2690  if (!strcmp(mode,"Line")) {fEditorMode = kLine; return;}
2691  if (!strcmp(mode,"Arrow")) {fEditorMode = kArrow; return;}
2692  if (!strcmp(mode,"Button")) {fEditorMode = kButton; return;}
2693  if (!strcmp(mode,"Diamond")) {fEditorMode = kDiamond; return;}
2694  if (!strcmp(mode,"Ellipse")) {fEditorMode = kEllipse; return;}
2695  if (!strcmp(mode,"Pad")) {fEditorMode = kPad; return;}
2696  if (!strcmp(mode,"Pave")) {fEditorMode = kPave; return;}
2697  if (!strcmp(mode,"PaveLabel")){fEditorMode = kPaveLabel; return;}
2698  if (!strcmp(mode,"PaveText")) {fEditorMode = kPaveText; return;}
2699  if (!strcmp(mode,"PavesText")){fEditorMode = kPavesText; return;}
2700  if (!strcmp(mode,"PolyLine")) {fEditorMode = kPolyLine; return;}
2701  if (!strcmp(mode,"CurlyLine")){fEditorMode = kCurlyLine; return;}
2702  if (!strcmp(mode,"CurlyArc")) {fEditorMode = kCurlyArc; return;}
2703  if (!strcmp(mode,"Text")) {fEditorMode = kText; return;}
2704  if (!strcmp(mode,"Marker")) {fEditorMode = kMarker; return;}
2705  if (!strcmp(mode,"CutG")) {fEditorMode = kCutG; return;}
2706 }
2707 
2708 ////////////////////////////////////////////////////////////////////////////////
2709 /// Change current style to style with name stylename
2710 
2711 void TROOT::SetStyle(const char *stylename)
2712 {
2713  TString style_name = stylename;
2714 
2715  TStyle *style = GetStyle(style_name);
2716  if (style) style->cd();
2717  else Error("SetStyle","Unknown style:%s",style_name.Data());
2718 }
2719 
2720 
2721 //-------- Static Member Functions ---------------------------------------------
2722 
2723 
2724 ////////////////////////////////////////////////////////////////////////////////
2725 /// Decrease the indentation level for ls().
2726 
2728 {
2729  return --fgDirLevel;
2730 }
2731 
2732 ////////////////////////////////////////////////////////////////////////////////
2733 ///return directory level
2734 
2736 {
2737  return fgDirLevel;
2738 }
2739 
2740 ////////////////////////////////////////////////////////////////////////////////
2741 /// Get macro search path. Static utility function.
2742 
2743 const char *TROOT::GetMacroPath()
2744 {
2745  TString &macroPath = ROOT::GetMacroPath();
2746 
2747  if (macroPath.Length() == 0) {
2748  macroPath = gEnv->GetValue("Root.MacroPath", (char*)0);
2749 #if defined(R__WIN32)
2750  macroPath.ReplaceAll("; ", ";");
2751 #else
2752  macroPath.ReplaceAll(": ", ":");
2753 #endif
2754  if (macroPath.Length() == 0)
2755 #if !defined(R__WIN32)
2756  macroPath = ".:" + TROOT::GetMacroDir();
2757 #else
2758  macroPath = ".;" + TROOT::GetMacroDir();
2759 #endif
2760  }
2761 
2762  return macroPath;
2763 }
2764 
2765 ////////////////////////////////////////////////////////////////////////////////
2766 /// Set or extend the macro search path. Static utility function.
2767 /// If newpath=0 or "" reset to value specified in the rootrc file.
2768 
2769 void TROOT::SetMacroPath(const char *newpath)
2770 {
2771  TString &macroPath = ROOT::GetMacroPath();
2772 
2773  if (!newpath || !*newpath)
2774  macroPath = "";
2775  else
2776  macroPath = newpath;
2777 }
2778 
2779 ////////////////////////////////////////////////////////////////////////////////
2780 /// The input parameter `webdisplay` defines where web graphics should be rendered.
2781 ///
2782 /// if `webdisplay` may contains:
2783 ///
2784 /// - "off": turns off the web display and come back to normal graphics in
2785 /// interactive mode.
2786 /// - "batch": turns the web display in batch mode. It can be prepend with an
2787 /// other string which will be considered as the new current web display
2788 /// - "nobatch": turns the web display in interactive mode. It can be prepend with an
2789 /// other string which will be considered as the new current web display
2790 ///
2791 /// If the option "off" is not set, this method turns the normal graphics to
2792 /// "Batch" to avoid the loading of local graphics libraries.
2793 
2794 void TROOT::SetWebDisplay(const char *webdisplay)
2795 {
2796  const char *wd = webdisplay;
2797  if (!wd)
2798  wd = "";
2799 
2800  if (!strcmp(wd, "off")) {
2803  fWebDisplay = "";
2804  gROOT->SetBatch(kFALSE);
2805  } else {
2806  fIsWebDisplay = kTRUE;
2807  if (!strncmp(wd, "batch", 5)) {
2809  wd += 5;
2810  } else if (!strncmp(wd, "nobatch", 7)) {
2812  wd += 7;
2813  } else {
2815  }
2816  fWebDisplay = wd;
2817  gROOT->SetBatch(kTRUE);
2818  }
2819 }
2820 
2821 ////////////////////////////////////////////////////////////////////////////////
2822 /// Increase the indentation level for ls().
2823 
2825 {
2826  return ++fgDirLevel;
2827 }
2828 
2829 ////////////////////////////////////////////////////////////////////////////////
2830 /// Functions used by ls() to indent an object hierarchy.
2831 
2833 {
2834  for (int i = 0; i < fgDirLevel; i++) std::cout.put(' ');
2835 }
2836 
2837 ////////////////////////////////////////////////////////////////////////////////
2838 /// Return kTRUE if the TROOT object has been initialized.
2839 
2841 {
2842  return fgRootInit;
2843 }
2844 
2845 ////////////////////////////////////////////////////////////////////////////////
2846 /// Return kTRUE if the memory leak checker is on.
2847 
2849 {
2850  return fgMemCheck;
2851 }
2852 
2853 ////////////////////////////////////////////////////////////////////////////////
2854 /// Return Indentation level for ls().
2855 
2857 {
2858  fgDirLevel = level;
2859 }
2860 
2861 ////////////////////////////////////////////////////////////////////////////////
2862 /// Convert version code to an integer, i.e. 331527 -> 51507.
2863 
2865 {
2866  return 10000*(code>>16) + 100*((code&65280)>>8) + (code&255);
2867 }
2868 
2869 ////////////////////////////////////////////////////////////////////////////////
2870 /// Convert version as an integer to version code as used in RVersion.h.
2871 
2873 {
2874  int a = v/10000;
2875  int b = (v - a*10000)/100;
2876  int c = v - a*10000 - b*100;
2877  return (a << 16) + (b << 8) + c;
2878 }
2879 
2880 ////////////////////////////////////////////////////////////////////////////////
2881 /// Return ROOT version code as defined in RVersion.h.
2882 
2884 {
2885  return ROOT_VERSION_CODE;
2886 }
2887 
2888 ////////////////////////////////////////////////////////////////////////////////
2889 
2891  static const char** extraInterpArgs = 0;
2892  return extraInterpArgs;
2893 }
2894 
2895 ////////////////////////////////////////////////////////////////////////////////
2896 
2897 #ifdef ROOTPREFIX
2898 static Bool_t IgnorePrefix() {
2899  static Bool_t ignorePrefix = gSystem->Getenv("ROOTIGNOREPREFIX");
2900  return ignorePrefix;
2901 }
2902 #endif
2903 
2904 ////////////////////////////////////////////////////////////////////////////////
2905 /// Get the rootsys directory in the installation. Static utility function.
2906 
2907 const TString& TROOT::GetRootSys() {
2908 #ifdef ROOTPREFIX
2909  if (IgnorePrefix()) {
2910 #endif
2911  static TString rootsys;
2912  if (rootsys.IsNull())
2913  rootsys = gSystem->UnixPathName(gSystem->Getenv("ROOTSYS"));
2914  if (rootsys.IsNull())
2915  rootsys = gRootDir;
2916  return rootsys;
2917 #ifdef ROOTPREFIX
2918  } else {
2919  const static TString rootsys = ROOTPREFIX;
2920  return rootsys;
2921  }
2922 #endif
2923 }
2924 
2925 ////////////////////////////////////////////////////////////////////////////////
2926 /// Get the binary directory in the installation. Static utility function.
2927 
2928 const TString& TROOT::GetBinDir() {
2929 #ifdef ROOTBINDIR
2930  if (IgnorePrefix()) {
2931 #endif
2932  static TString rootbindir;
2933  if (rootbindir.IsNull()) {
2934  rootbindir = "bin";
2935  gSystem->PrependPathName(GetRootSys(), rootbindir);
2936  }
2937  return rootbindir;
2938 #ifdef ROOTBINDIR
2939  } else {
2940  const static TString rootbindir = ROOTBINDIR;
2941  return rootbindir;
2942  }
2943 #endif
2944 }
2945 
2946 ////////////////////////////////////////////////////////////////////////////////
2947 /// Get the library directory in the installation. Static utility function.
2948 
2949 const TString& TROOT::GetLibDir() {
2950 #ifdef ROOTLIBDIR
2951  if (IgnorePrefix()) {
2952 #endif
2953  static TString rootlibdir;
2954  if (rootlibdir.IsNull()) {
2955  rootlibdir = "lib";
2956  gSystem->PrependPathName(GetRootSys(), rootlibdir);
2957  }
2958  return rootlibdir;
2959 #ifdef ROOTLIBDIR
2960  } else {
2961  const static TString rootlibdir = ROOTLIBDIR;
2962  return rootlibdir;
2963  }
2964 #endif
2965 }
2966 
2967 ////////////////////////////////////////////////////////////////////////////////
2968 /// Get the include directory in the installation. Static utility function.
2969 
2970 const TString& TROOT::GetIncludeDir() {
2971 #ifdef ROOTINCDIR
2972  if (IgnorePrefix()) {
2973 #endif
2974  static TString rootincdir;
2975  if (rootincdir.IsNull()) {
2976  rootincdir = "include";
2977  gSystem->PrependPathName(GetRootSys(), rootincdir);
2978  }
2979  return rootincdir;
2980 #ifdef ROOTINCDIR
2981  } else {
2982  const static TString rootincdir = ROOTINCDIR;
2983  return rootincdir;
2984  }
2985 #endif
2986 }
2987 
2988 ////////////////////////////////////////////////////////////////////////////////
2989 /// Get the sysconfig directory in the installation. Static utility function.
2990 
2991 const TString& TROOT::GetEtcDir() {
2992 #ifdef ROOTETCDIR
2993  if (IgnorePrefix()) {
2994 #endif
2995  static TString rootetcdir;
2996  if (rootetcdir.IsNull()) {
2997  rootetcdir = "etc";
2998  gSystem->PrependPathName(GetRootSys(), rootetcdir);
2999  }
3000  return rootetcdir;
3001 #ifdef ROOTETCDIR
3002  } else {
3003  const static TString rootetcdir = ROOTETCDIR;
3004  return rootetcdir;
3005  }
3006 #endif
3007 }
3008 
3009 ////////////////////////////////////////////////////////////////////////////////
3010 /// Get the data directory in the installation. Static utility function.
3011 
3012 const TString& TROOT::GetDataDir() {
3013 #ifdef ROOTDATADIR
3014  if (IgnorePrefix()) {
3015 #endif
3016  return GetRootSys();
3017 #ifdef ROOTDATADIR
3018  } else {
3019  const static TString rootdatadir = ROOTDATADIR;
3020  return rootdatadir;
3021  }
3022 #endif
3023 }
3024 
3025 ////////////////////////////////////////////////////////////////////////////////
3026 /// Get the documentation directory in the installation. Static utility function.
3027 
3028 const TString& TROOT::GetDocDir() {
3029 #ifdef ROOTDOCDIR
3030  if (IgnorePrefix()) {
3031 #endif
3032  return GetRootSys();
3033 #ifdef ROOTDOCDIR
3034  } else {
3035  const static TString rootdocdir = ROOTDOCDIR;
3036  return rootdocdir;
3037  }
3038 #endif
3039 }
3040 
3041 ////////////////////////////////////////////////////////////////////////////////
3042 /// Get the macro directory in the installation. Static utility function.
3043 
3044 const TString& TROOT::GetMacroDir() {
3045 #ifdef ROOTMACRODIR
3046  if (IgnorePrefix()) {
3047 #endif
3048  static TString rootmacrodir;
3049  if (rootmacrodir.IsNull()) {
3050  rootmacrodir = "macros";
3051  gSystem->PrependPathName(GetRootSys(), rootmacrodir);
3052  }
3053  return rootmacrodir;
3054 #ifdef ROOTMACRODIR
3055  } else {
3056  const static TString rootmacrodir = ROOTMACRODIR;
3057  return rootmacrodir;
3058  }
3059 #endif
3060 }
3061 
3062 ////////////////////////////////////////////////////////////////////////////////
3063 /// Get the tutorials directory in the installation. Static utility function.
3064 
3065 const TString& TROOT::GetTutorialDir() {
3066 #ifdef ROOTTUTDIR
3067  if (IgnorePrefix()) {
3068 #endif
3069  static TString roottutdir;
3070  if (roottutdir.IsNull()) {
3071  roottutdir = "tutorials";
3072  gSystem->PrependPathName(GetRootSys(), roottutdir);
3073  }
3074  return roottutdir;
3075 #ifdef ROOTTUTDIR
3076  } else {
3077  const static TString roottutdir = ROOTTUTDIR;
3078  return roottutdir;
3079  }
3080 #endif
3081 }
3082 
3083 ////////////////////////////////////////////////////////////////////////////////
3084 /// Get the source directory in the installation. Static utility function.
3085 
3086 const TString& TROOT::GetSourceDir() {
3087 #ifdef ROOTSRCDIR
3088  if (IgnorePrefix()) {
3089 #endif
3090  static TString rootsrcdir;
3091  if (rootsrcdir.IsNull()) {
3092  rootsrcdir = "src";
3093  gSystem->PrependPathName(GetRootSys(), rootsrcdir);
3094  }
3095  return rootsrcdir;
3096 #ifdef ROOTSRCDIR
3097  } else {
3098  const static TString rootsrcdir = ROOTSRCDIR;
3099  return rootsrcdir;
3100  }
3101 #endif
3102 }
3103 
3104 ////////////////////////////////////////////////////////////////////////////////
3105 /// Get the icon path in the installation. Static utility function.
3106 
3107 const TString& TROOT::GetIconPath() {
3108 #ifdef ROOTICONPATH
3109  if (IgnorePrefix()) {
3110 #endif
3111  static TString rooticonpath;
3112  if (rooticonpath.IsNull()) {
3113  rooticonpath = "icons";
3114  gSystem->PrependPathName(GetRootSys(), rooticonpath);
3115  }
3116  return rooticonpath;
3117 #ifdef ROOTICONPATH
3118  } else {
3119  const static TString rooticonpath = ROOTICONPATH;
3120  return rooticonpath;
3121  }
3122 #endif
3123 }
3124 
3125 ////////////////////////////////////////////////////////////////////////////////
3126 /// Get the fonts directory in the installation. Static utility function.
3127 
3128 const TString& TROOT::GetTTFFontDir() {
3129 #ifdef TTFFONTDIR
3130  if (IgnorePrefix()) {
3131 #endif
3132  static TString ttffontdir;
3133  if (ttffontdir.IsNull()) {
3134  ttffontdir = "fonts";
3135  gSystem->PrependPathName(GetRootSys(), ttffontdir);
3136  }
3137  return ttffontdir;
3138 #ifdef TTFFONTDIR
3139  } else {
3140  const static TString ttffontdir = TTFFONTDIR;
3141  return ttffontdir;
3142  }
3143 #endif
3144 }
3145 
3146 ////////////////////////////////////////////////////////////////////////////////
3147 /// Get the tutorials directory in the installation. Static utility function.
3148 /// Backward compatibility function - do not use for new code
3149 
3150 const char *TROOT::GetTutorialsDir() {
3151  return GetTutorialDir();
3152 }
TSeqCollection * fStreamerInfo
Definition: TROOT.h:167
void Add(TObject *obj, const char *name=0, Int_t check=-1)
Add object with name to browser.
Definition: TBrowser.cxx:261
const char * FindObjectPathName(const TObject *obj) const
Return path name of obj somewhere in the //root/...
Definition: TROOT.cxx:1458
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
Definition: TSystem.cxx:932
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
Definition: TSystem.cxx:1276
Bool_t fExecutingMacro
Definition: TROOT.h:144
void AddClass(TClass *cl)
Add a class to the list and map of classes.
Definition: TROOT.cxx:1040
virtual void Add(TObject *obj)
TListOfFunctionTemplates * fFuncTemplate
Definition: TROOT.h:150
UInt_t GetImplicitMTPoolSize()
Returns the size of the pool used for implicit multi-threading.
Definition: TROOT.cxx:614
static const TString & GetTTFFontDir()
Get the fonts directory in the installation. Static utility function.
Definition: TROOT.cxx:3128
A TFolder object is a collection of objects and folders.
Definition: TFolder.h:30
TCanvas * MakeDefCanvas() const
Return a default canvas.
Definition: TROOT.cxx:1539
R__EXTERN TGuiFactory * gBatchGuiFactory
Definition: TGuiFactory.h:67
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
Semi-Abstract base class defining a generic interface to the underlying, low level, native graphics backend (X11, Win32, MacOS, OpenGL...).
Definition: TVirtualX.h:58
An array of TObjects.
Definition: TObjArray.h:37
virtual void Clear(Option_t *option="")=0
static Int_t DecreaseDirLevel()
Decrease the indentation level for ls().
Definition: TROOT.cxx:2727
static Bool_t BlockAllSignals(Bool_t b)
Block or unblock all signals. Returns the previous block status.
Definition: TQObject.cxx:1055
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
Definition: TList.cxx:467
TFolder * fRootFolder
Definition: TROOT.h:175
TCollection * GetListOfEnums(Bool_t load=kFALSE)
Definition: TROOT.cxx:1728
ROOT top level object description.
Definition: TROOT.h:100
static const TString & GetMacroDir()
Get the macro directory in the installation. Static utility function.
Definition: TROOT.cxx:3044
void * DestroyInterpreter_t(TInterpreter *)
Definition: TInterpreter.h:524
This class is a specialized TProcessID managing the list of UUIDs.
Definition: TProcessUUID.h:32
TSeqCollection * fProofs
Definition: TROOT.h:170
static const TString & GetTutorialDir()
Get the tutorials directory in the installation. Static utility function.
Definition: TROOT.cxx:3065
const char * GetDeclFileName() const
Definition: TClass.h:395
void RemoveClass(TClass *)
Remove a class from the list and map of classes.
Definition: TROOT.cxx:2609
TCollection * GetListOfGlobalFunctions(Bool_t load=kFALSE)
Return list containing the TFunctions currently defined.
Definition: TROOT.cxx:1799
virtual const char * WorkingDirectory()
Return working directory.
Definition: TSystem.cxx:869
Int_t LoadMacro(const char *filename, Int_t *error=0, Bool_t check=kFALSE)
Load a macro in the interpreter&#39;s memory.
Definition: TROOT.cxx:2243
virtual void Build(TFile *motherFile=0, TDirectory *motherDir=0)
Initialise directory to defaults.
Definition: TDirectory.cxx:237
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
static const char **& GetExtraInterpreterArgs()
Definition: TROOT.cxx:2890
TLine * line
TSeqCollection * fGeometries
Definition: TROOT.h:162
R__EXTERN TClassTable * gClassTable
Definition: TClassTable.h:95
Handle messages that might be generated by the system.
TDictionary::DeclId_t DeclId_t
Definition: TInterpreter.h:260
const char Option_t
Definition: RtypesCore.h:62
Dictionary for function template This class describes one single function template.
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form: ~~~ {.cpp} [path/]macro.C[+|++[k|f|g|O|c|s|d|v|-]][(args)]...
Definition: TSystem.cxx:4138
void DisableImplicitMT()
Disables the implicit multi-threading in ROOT (see EnableImplicitMT).
Definition: TROOT.cxx:593
static TVirtualX *& Instance()
Returns gVirtualX global.
Definition: TVirtualX.cxx:57
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
Short_t GetDeclFileLine() const
Definition: TClass.h:396
#define ROOT_RELEASE_TIME
Definition: RVersion.h:19
TList * fList
Definition: TDirectory.h:87
#define g(i)
Definition: RSha256.hxx:105
static const TString & GetIconPath()
Get the icon path in the installation. Static utility function.
Definition: TROOT.cxx:3107
R__EXTERN TVirtualMutex * gInterpreterMutex
Definition: TInterpreter.h:40
const Ssiz_t kNPOS
Definition: RtypesCore.h:111
This class represents a WWW compatible URL.
Definition: TUrl.h:35
Int_t fVersionDate
Definition: TROOT.h:123
Definition: Buttons.h:33
R__EXTERN TStyle * gStyle
Definition: TStyle.h:406
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
Definition: TSystem.cxx:1374
Bool_t fForceStyle
Definition: TROOT.h:141
virtual void HandleMessage(Int_t id, const TObject *obj)
Store message origin, keep statistics and call Notify().
Bool_t ReadingObject() const
Deprecated (will be removed in next release).
Definition: TROOT.cxx:2441
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
static Int_t RootVersionCode()
Return ROOT version code as defined in RVersion.h.
Definition: TROOT.cxx:2883
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
TInterpreter * CreateInterpreter_t(void *shlibHandle, const char *argv[])
Definition: TInterpreter.h:523
static Bool_t MemCheck()
Return kTRUE if the memory leak checker is on.
Definition: TROOT.cxx:2848
TString fVersion
Definition: TROOT.h:120
void R__SetZipMode(int)
virtual const char * HomeDirectory(const char *userName=0)
Return the user&#39;s home directory.
Definition: TSystem.cxx:885
#define ROOT_RELEASE_DATE
Definition: RVersion.h:18
virtual void AddAll(const TCollection *col)
Add all objects from collection col to this collection.
static void SetObjectStat(Bool_t stat)
Turn on/off tracking of objects in the TObjectTable.
Definition: TObject.cxx:961
static void RegisterModule(const char *modulename, const char **headers, const char **includePaths, const char *payLoadCode, const char *fwdDeclCode, void(*triggerFunc)(), const FwdDeclArgsToKeepCollection_t &fwdDeclsArgToSkip, const char **classesHeaders, bool hasCxxModule=false)
Called by static dictionary initialization to register clang modules for headers. ...
Definition: TROOT.cxx:2516
This class implements a mutex interface.
Definition: TVirtualMutex.h:34
void DisableParTreeProcessing()
Globally disables the IMT use case of parallel branch processing, deactivating the corresponding lock...
Definition: TROOT.cxx:482
void InitInterpreter()
Initialize the interpreter.
Definition: TROOT.cxx:2011
#define gROOT
Definition: TROOT.h:410
void LoadHandlersFromEnv(TEnv *env)
Load plugin handlers specified in config file, like: Plugin.TFile: ^rfio: TRFIOFile RFI...
TROOT * GetROOT2()
Definition: TROOT.cxx:384
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition: TSystem.cxx:1829
The TEnv class reads config files, by default named .rootrc.
Definition: TEnv.h:125
void RefreshBrowsers()
Refresh all browsers.
Definition: TROOT.cxx:2493
static Func_t GetSymInLibImt(const char *funcname)
Definition: TROOT.cxx:398
#define f(i)
Definition: RSha256.hxx:104
TString & GetMacroPath()
Definition: TROOT.cxx:524
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
Definition: TInterpreter.h:121
static const TString & GetRootSys()
Get the rootsys directory in the installation. Static utility function.
Definition: TROOT.cxx:2907
#define gInterpreter
Definition: TInterpreter.h:527
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Definition: TSystem.cxx:1522
Int_t fVersionCode
Definition: TROOT.h:122
Option_t * GetOption() const
Definition: TCollection.h:251
void Reset(Option_t *option="")
Delete all global interpreter objects created since the last call to Reset.
Definition: TROOT.cxx:2632
Definition: Buttons.h:30
void Load()
Load all the DataMembers known to the interpreter for the scope &#39;fClass&#39; into this collection...
TFunction * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
This class registers for all classes their name, id and dictionary function in a hash table...
Definition: TClassTable.h:36
STL namespace.
#define ROOT_VERSION_CODE
Definition: RVersion.h:21
static constexpr double mm
static Bool_t & IsImplicitMTEnabledImpl()
Keeps track of the status of ImplicitMT w/o resorting to the load of libImt.
Definition: TROOT.cxx:511
virtual TObject * FindObjectAny(const char *name) const
Return a pointer to the first object with name starting at this folder.
Definition: TFolder.cxx:352
TObject * At(Int_t idx) const
Definition: TObjArray.h:165
virtual void ResetSignals()
Reset signals handlers to previous behaviour.
Definition: TSystem.cxx:592
std::atomic< TApplication * > fApplication
Definition: TROOT.h:131
void SetStyle(const char *stylename="Default")
Change current style to style with name stylename.
Definition: TROOT.cxx:2711
TDataType * GetType(const char *name, Bool_t load=kFALSE) const
Return pointer to type with name.
Definition: TROOT.cxx:1547
TCollection * GetListOfGlobals(Bool_t load=kFALSE)
Return list containing the TGlobals currently defined.
Definition: TROOT.cxx:1762
TString fGitCommit
Definition: TROOT.h:127
TStyle * GetStyle(const char *name) const
Return pointer to style with name.
Definition: TROOT.cxx:1564
void ls(Option_t *option="") const
To list all objects of the application.
Definition: TROOT.cxx:2225
static const TString & GetIncludeDir()
Get the include directory in the installation. Static utility function.
Definition: TROOT.cxx:2970
TROOT * GetROOT1()
Definition: TROOT.cxx:377
TObject * Remove(TObject *)
Remove an object from the in-memory list.
Definition: TROOT.cxx:2599
Bool_t R_ISREG(Int_t mode)
Definition: TSystem.h:119
virtual void AddLast(TObject *obj)
Add object at the end of the list.
Definition: TList.cxx:149
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:694
TString fCutClassName
Definition: TROOT.h:178
Bool_t & GetReadingObject()
Definition: TROOT.cxx:2433
static const char * GetTutorialsDir()
Get the tutorials directory in the installation.
Definition: TROOT.cxx:3150
TListOfFunctions * GetGlobalFunctions()
Internal routine returning, and creating if necessary, the list of global function.
Definition: TROOT.cxx:1637
static Int_t fgDirLevel
Definition: TROOT.h:108
virtual const char * UnixPathName(const char *unixpathname)
Convert from a Unix pathname to a local pathname.
Definition: TSystem.cxx:1044
Definition: Buttons.h:30
static const char * GetMacroPath()
Get macro search path. Static utility function.
Definition: TROOT.cxx:2743
TInterpreter * fInterpreter
Definition: TROOT.h:132
Int_t fMode
Definition: TSystem.h:128
static TList & GetEarlyRegisteredGlobals()
Definition: TGlobal.cxx:171
const char * GetGitDate()
Return date/time make was run.
Definition: TROOT.cxx:2455
virtual void cd()
Change current style.
Definition: TStyle.cxx:438
AListOfEnums_t fEnums
Definition: TROOT.h:173
TObject * GetFunction(const char *name) const
Return pointer to function with name.
Definition: TROOT.cxx:1572
TSeqCollection * fMappedFiles
Definition: TROOT.h:155
virtual void Delete(Option_t *option="")=0
Delete this object.
Sequenceable collection abstract base class.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
static void * gInterpreterLib
Definition: TROOT.cxx:176
TVirtualMutex * gROOTMutex
Definition: TROOT.cxx:179
THashTable implements a hash table to store TObject&#39;s.
Definition: THashTable.h:35
static TVirtualPad *& Pad()
Return the current pad for the current thread.
Definition: TVirtualPad.cxx:32
Int_t fVersionInt
Definition: TROOT.h:121
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition: THashList.h:34
Bool_t IsParTreeProcessingEnabled()
Returns true if parallel tree processing is enabled.
Definition: TROOT.cxx:495
void SetEditorMode(const char *mode="")
Set editor mode.
Definition: TROOT.cxx:2685
static Int_t ReadRules()
Read the class.rules files from the default location:.
Definition: TClass.cxx:1731
TSeqCollection * fCleanups
Definition: TROOT.h:165
Int_t fEditorMode
Definition: TROOT.h:145
Bool_t fMustClean
Definition: TROOT.h:139
static Bool_t Initialized()
Return kTRUE if the TROOT object has been initialized.
Definition: TROOT.cxx:2840
void EndOfProcessCleanups()
Execute the cleanups necessary at the end of the process, in particular those that must be executed b...
Definition: TROOT.cxx:1242
static Bool_t fgRootInit
Definition: TROOT.h:109
virtual TObject * FindObjectAny(const char *name) const
Return a pointer to the first object with name starting at //root.
Definition: TROOT.cxx:1411
Long_t ProcessLineSync(const char *line, Int_t *error=0)
Process interpreter command via TApplication::ProcessLine().
Definition: TROOT.cxx:2365
void Message(Int_t id, const TObject *obj)
Process message id called by obj.
Definition: TROOT.cxx:2325
void EnableParTreeProcessing()
Globally enables the parallel tree processing, which is a case of implicit multi-threading in ROOT...
Definition: TROOT.cxx:466
virtual const char * Getenv(const char *env)
Get environment variable.
Definition: TSystem.cxx:1638
static const TString & GetDocDir()
Get the documentation directory in the installation. Static utility function.
Definition: TROOT.cxx:3028
TCollection * GetListOfFunctionTemplates()
Definition: TROOT.cxx:1745
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Definition: TSystem.cxx:1062
static Int_t ITIMQQ(const char *time)
Return built time as integer (with min precision), i.e.
Definition: TROOT.cxx:220
virtual void EnableAutoLoading()=0
void SaveContext()
Save the current interpreter context.
Definition: TROOT.cxx:2652
virtual void Close(Option_t *option="")
Delete all objects from memory and directory structure itself.
Definition: TDirectory.cxx:584
ClassInfo_t * GetClassInfo() const
Definition: TClass.h:400
virtual void Delete(Option_t *option="")
Delete all TFunction object files.
R__EXTERN TVirtualRWMutex * gCoreMutex
virtual bool UseRWLock()
Set this collection to use a RW lock upon access, making it thread safe.
virtual TList * GetList() const
Definition: TDirectory.h:149
TCollection * GetListOfFunctionOverloads(const char *name) const
Return the collection of functions named "name".
Definition: TROOT.cxx:1646
TString fWebDisplay
Definition: TROOT.h:134
static void at_exit_of_TROOT()
Definition: TROOT.cxx:295
TSeqCollection * fClipboard
Definition: TROOT.h:171
virtual void Initialize()=0
TFolder * AddFolder(const char *name, const char *title, TCollection *collection=0)
Create a new folder and add it to the list of folders of this folder, return a pointer to the created...
Definition: TFolder.cxx:186
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition: TVirtualPad.h:49
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
static void Cleanup()
static function (called by TROOT destructor) to delete all TProcessIDs
Definition: TProcessID.cxx:202
void Error(const char *location, const char *msgfmt,...)
R__EXTERN TPluginManager * gPluginMgr
object has not been deleted
Definition: TObject.h:78
Definition: Buttons.h:38
virtual void RegisterModule(const char *, const char **, const char **, const char *, const char *, void(*)(), const FwdDeclArgsToKeepCollection_t &fwdDeclArgsToKeep, const char **classesHeaders, Bool_t lateRegistration=false, Bool_t hasCxxModule=false)=0
Bool_t fEscape
Definition: TROOT.h:143
TSeqCollection * fFiles
Definition: TROOT.h:154
TSeqCollection * GetListOfGeometries() const
Definition: TROOT.h:252
Describes an Operating System directory for the browser.
virtual TObject * FindObject(const char *name) const
Specialize FindObject to do search for the a function just by name or create it if its not already in...
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT&#39;s implicit multi-threading for all objects and methods that provide an internal paralleli...
Definition: TROOT.cxx:576
TCollection * fClasses
Definition: TROOT.h:148
A doubly linked list.
Definition: TList.h:44
Long_t Macro(const char *filename, Int_t *error=0, Bool_t padUpdate=kTRUE)
Execute a macro in the interpreter.
Definition: TROOT.cxx:2291
R__EXTERN TVirtualMutex * gGlobalMutex
Definition: TVirtualMutex.h:29
TStyle objects may be created to define special styles.
Definition: TStyle.h:27
R__EXTERN TROOT * gROOTLocal
Definition: TROOT.h:383
Bool_t fEditHistograms
Definition: TROOT.h:137
#define R__READ_LOCKGUARD(mutex)
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:37
virtual void AddLast(TObject *obj)=0
Bool_t ClassSaved(TClass *cl)
return class status bit kClassSaved for class cl This function is called by the SavePrimitive functio...
Definition: TROOT.cxx:1090
Int_t fVersionTime
Definition: TROOT.h:124
virtual void RecursiveRemove(TObject *obj)
Remove object from this collection and recursively remove the object from all other objects (and coll...
R__EXTERN TVirtualX * gGXBatch
Definition: TVirtualX.h:353
TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE) const
Return pointer to class with name. Obsolete, use TClass::GetClass directly.
Definition: TROOT.cxx:1503
static Bool_t fgMemCheck
Definition: TROOT.h:110
Bool_t IsParBranchProcessingEnabled()
Returns true if parallel branch processing is enabled.
Definition: TROOT.cxx:446
TSeqCollection * fDataSets
Definition: TROOT.h:172
Definition: Buttons.h:33
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
Definition: TObject.cxx:321
TSeqCollection * fMessageHandlers
Definition: TROOT.h:166
void Browse(TBrowser *b)
Add browsable objects to TBrowser.
Definition: TROOT.cxx:1071
virtual Bool_t Init()
Initialize the OS interface.
Definition: TSystem.cxx:190
void AddClassGenerator(TClassGenerator *gen)
Add a class generator.
Definition: TROOT.cxx:1050
TString fDefCanvasName
Definition: TROOT.h:179
R__EXTERN TSystem * gSystem
Definition: TSystem.h:540
void SetCutClassName(const char *name="TCutG")
Set the default graphical cut class name for the graphics editor By default the graphics editor creat...
Definition: TROOT.cxx:2664
TGlobal * GetGlobal(const char *name, Bool_t load=kFALSE) const
Return pointer to global variable by name.
Definition: TROOT.cxx:1605
Definition: Buttons.h:33
SVector< double, 2 > v
Definition: Dict.h:5
if object ctor succeeded but object should not be used
Definition: TObject.h:68
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.
Definition: TClassEdit.cxx:790
Basic data type descriptor (datatype information is obtained from CINT).
Definition: TDataType.h:44
auto * a
Definition: textangle.C:12
Int_t gDebug
Definition: TROOT.cxx:635
TPluginManager * fPluginManager
Definition: TROOT.h:177
TString fGitBranch
Definition: TROOT.h:128
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:443
TSeqCollection * fSecContexts
Definition: TROOT.h:169
Collection abstract base class.
Definition: TCollection.h:63
void(* VoidFuncPtr_t)()
Definition: Rtypes.h:72
void SetRefreshFlag(Bool_t flag)
Definition: TBrowser.h:97
static Int_t ConvertVersionCode2Int(Int_t code)
Convert version code to an integer, i.e. 331527 -> 51507.
Definition: TROOT.cxx:2864
unsigned int UInt_t
Definition: RtypesCore.h:42
void ReadGitInfo()
Read Git commit information and branch name from the etc/gitinfo.txt file.
Definition: TROOT.cxx:2404
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
void SetWebDisplay(const char *webdisplay)
The input parameter webdisplay defines where web graphics should be rendered.
Definition: TROOT.cxx:2794
virtual TObject * FindObject(const char *name) const
Returns address of a ROOT object if it exists.
Definition: TROOT.cxx:1298
TObject * GetGeometry(const char *name) const
Return pointer to Geometry with name.
Definition: TROOT.cxx:1721
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
Definition: TDirectory.cxx:190
static void EnableStatistics(int size=-1, int ix=-1)
Enable memory usage statistics gathering.
Definition: TStorage.cxx:450
This class implements a plugin library manager.
static const TString & GetSourceDir()
Get the source directory in the installation. Static utility function.
Definition: TROOT.cxx:3086
Int_t LoadClass(const char *classname, const char *libname, Bool_t check=kFALSE)
Check if class "classname" is known to the interpreter (in fact, this check is not needed anymore...
Definition: TROOT.cxx:2157
Objects following this interface can be passed onto the TROOT object to implement a user customized w...
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
Definition: TROOT.cxx:2832
static TProcessID * AddProcessID()
Static function to add a new TProcessID to the list of PIDs.
Definition: TProcessID.cxx:114
The ROOT global object gROOT contains a list of all defined classes.
Definition: TClass.h:75
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
Definition: TROOT.cxx:1062
TFile * GetFile() const
Definition: TROOT.h:268
virtual void SaveContext()=0
Global variables class (global variables are obtained from CINT).
Definition: TGlobal.h:27
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
Definition: TClass.cxx:4688
A collection of TDataType designed to hold the typedef information and numerical type information...
Definition: TListOfTypes.h:30
void SetName(const char *name)
Definition: TCollection.h:204
TROOT * GetROOT()
Definition: TROOT.cxx:520
void Warning(const char *location, const char *msgfmt,...)
Bool_t IsRootFile(const char *filename) const
Return true if the file is local and is (likely) to be a ROOT file.
Definition: TROOT.cxx:2205
static TInterpreter * Instance()
returns gInterpreter global
void InitSystem()
Initialize operating system interface.
Definition: TROOT.cxx:1936
if object destructor must call RecursiveRemove()
Definition: TObject.h:60
#define gVirtualX
Definition: TVirtualX.h:350
TSeqCollection * fSpecials
Definition: TROOT.h:164
virtual TObjLink * FirstLink() const
Definition: TList.h:108
const Bool_t kFALSE
Definition: RtypesCore.h:88
static void CreateApplication()
Static function used to create a default application environment.
static void RemoveClass(TClass *cl)
static: Remove a class from the list and map of classes
Definition: TClass.cxx:470
TString fGitDate
Definition: TROOT.h:129
static void SetDirLevel(Int_t level=0)
Return Indentation level for ls().
Definition: TROOT.cxx:2856
#define SafeDelete(p)
Definition: RConfig.h:529
long Long_t
Definition: RtypesCore.h:50
The Canvas class.
Definition: TCanvas.h:31
Bool_t IsExecutingMacro() const
Definition: TROOT.h:288
TSeqCollection * GetListOfColors() const
Definition: TROOT.h:240
TListOfFunctions * fGlobalFunctions
Definition: TROOT.h:152
#define d(i)
Definition: RSha256.hxx:102
Long_t ProcessLine(const char *line, Int_t *error=0)
Process interpreter command via TApplication::ProcessLine().
Definition: TROOT.cxx:2345
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
TSeqCollection * fCanvases
Definition: TROOT.h:157
static void BuildStyles()
Create some standard styles.
Definition: TStyle.cxx:421
virtual void SetName(const char *newname)
Set the name for directory If the directory name is changed after the directory was written once...
virtual TObject * Remove(TObject *)
Remove an object from the in-memory list.
virtual const char * GetTypeName() const
Get type of global variable, e,g.
Definition: TGlobal.cxx:111
#define ClassImp(name)
Definition: Rtypes.h:359
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
Definition: TROOT.cxx:546
TFunction * GetGlobalFunctionWithPrototype(const char *name, const char *proto=0, Bool_t load=kFALSE)
Return pointer to global function by name.
Definition: TROOT.cxx:1692
static DestroyInterpreter_t * gDestroyInterpreter
Definition: TROOT.cxx:175
void SetReadingObject(Bool_t flag=kTRUE)
Definition: TROOT.cxx:2446
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
Definition: TSystem.cxx:2030
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Definition: TSystem.cxx:2006
TString fConfigOptions
Definition: TROOT.h:118
void InitThreads()
Load and initialize thread library.
Definition: TROOT.cxx:2000
void RecursiveRemove(TObject *obj)
Recursively remove this object from the list of Cleanups.
Definition: TROOT.cxx:2479
void Unload()
Mark &#39;all func&#39; as being unloaded.
Describe directory structure in memory.
Definition: TDirectory.h:34
static TDirectory *& CurrentDirectory()
Return the current directory for the current thread.
Definition: TDirectory.cxx:380
R__EXTERN TEnv * gEnv
Definition: TEnv.h:171
TSeqCollection * GetListOfStyles() const
Definition: TROOT.h:249
static void AddClass(TClass *cl)
static: Add a class to the list and map of classes.
Definition: TClass.cxx:444
TSeqCollection * GetListOfFiles() const
Definition: TROOT.h:245
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
Definition: TROOT.cxx:2991
Definition: Buttons.h:31
Bool_t fFromPopUp
Definition: TROOT.h:138
static RooMathCoreReg dummy
Int_t fTimer
Definition: TROOT.h:130
TCanvas * style()
Definition: style.C:1
static void CallCloseFiles()
Insure that the files, canvases and sockets are closed.
Definition: TROOT.cxx:2503
void EnableParBranchProcessing()
Globally enables the parallel branch processing, which is a case of implicit multi-threading (IMT) in...
Definition: TROOT.cxx:417
Bool_t fBatch
Definition: TROOT.h:133
Long_t ProcessLineFast(const char *line, Int_t *error=0)
Process interpreter command directly via CINT interpreter.
Definition: TROOT.cxx:2382
void CloseFiles()
Close any files and sockets that gROOT knows about.
Definition: TROOT.cxx:1164
static constexpr double s
virtual ~TROOT()
Clean up and free resources used by ROOT (files, network sockets, shared memory segments, etc.).
Definition: TROOT.cxx:906
#define R__LOCKGUARD(mutex)
The color creation and management class.
Definition: TColor.h:19
TSeqCollection * fStyles
Definition: TROOT.h:158
virtual void Add(TObject *obj)=0
virtual void CleanCompiledMacros()
Remove the shared libs produced by the CompileMacro() function.
Definition: TSystem.cxx:4223
Bool_t fReadingObject
Definition: TROOT.h:140
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Definition: TClass.cxx:2887
virtual void Clear(Option_t *option="")
Remove all objects from the list.
Definition: TList.cxx:399
TCollection * fClassGenerators
Definition: TROOT.h:168
Int_t IgnoreInclude(const char *fname, const char *expandedfname)
Return 1 if the name of the given include file corresponds to a class that is known to ROOT...
Definition: TROOT.cxx:1886
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Definition: TClass.cxx:5479
virtual void Reset()=0
virtual void Delete(Option_t *option="")
Delete all TDataMember object files.
static Int_t GetDirLevel()
return directory level
Definition: TROOT.cxx:2735
Int_t fBuiltTime
Definition: TROOT.h:126
Mother of all ROOT objects.
Definition: TObject.h:37
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:28
Bool_t fIsWebDisplay
Definition: TROOT.h:135
This ABC is a factory for GUI components.
Definition: TGuiFactory.h:42
TFunction * GetGlobalFunction(const char *name, const char *params=0, Bool_t load=kFALSE)
Return pointer to global function by name.
Definition: TROOT.cxx:1659
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
Definition: TROOT.h:195
static Int_t ConvertVersionInt2Code(Int_t v)
Convert version as an integer to version code as used in RVersion.h.
Definition: TROOT.cxx:2872
static Int_t IncreaseDirLevel()
Increase the indentation level for ls().
Definition: TROOT.cxx:2824
typedef void((*Func_t)())
TCollection * GetListOfTypes(Bool_t load=kFALSE)
Return a dynamic list giving access to all TDataTypes (typedefs) currently defined.
Definition: TROOT.cxx:1838
static const TString & GetDataDir()
Get the data directory in the installation. Static utility function.
Definition: TROOT.cxx:3012
Int_t fBuiltDate
Definition: TROOT.h:125
void Unload()
Mark &#39;all func&#39; as being unloaded.
TFunctionTemplate * GetFunctionTemplate(const char *name)
Definition: TROOT.cxx:1592
TColor * GetColor(Int_t color) const
Return address of color with index color.
Definition: TROOT.cxx:1521
void Load()
Load all the functions known to the interpreter for the scope &#39;fClass&#39; into this collection.
Bool_t fIsWebDisplayBatch
Definition: TROOT.h:136
TCollection * fFunctions
Definition: TROOT.h:159
const char * FindObjectClassName(const char *name) const
Returns class name of a ROOT object including CINT globals.
Definition: TROOT.cxx:1438
static void SetMacroPath(const char *newpath)
Set or extend the macro search path.
Definition: TROOT.cxx:2769
TROOT *(* GetROOTFun_t)()
Definition: TROOT.cxx:394
static Int_t IDATQQ(const char *date)
Return built date as integer, i.e. "Apr 28 2000" -> 20000428.
Definition: TROOT.cxx:199
virtual void Add(TObject *obj)
Definition: TList.h:87
auto * l
Definition: textangle.C:4
TListOfDataMembers * fGlobals
Definition: TROOT.h:151
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
Definition: TROOT.cxx:2949
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
Definition: TROOT.cxx:607
R__EXTERN const char * gRootDir
Definition: TSystem.h:223
virtual void ls(Option_t *option="") const
List Directory contents.
TSeqCollection * fClosedObjects
Definition: TROOT.h:153
TClass * FindSTLClass(const char *name, Bool_t load, Bool_t silent=kFALSE) const
return a TClass object corresponding to &#39;name&#39; assuming it is an STL container.
Definition: TROOT.cxx:1469
#define ROOT_RELEASE
Definition: RVersion.h:17
TF1 * f1
Definition: legend1.C:11
static Int_t IVERSQ()
Return version id as an integer, i.e. "2.22/04" -> 22204.
Definition: TROOT.cxx:189
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Definition: TRolke.cxx:630
Int_t fLineIsProcessing
Definition: TROOT.h:106
TSeqCollection * fTasks
Definition: TROOT.h:160
static void CleanUpROOTAtExit()
Clean up at program termination before global objects go out of scope.
Definition: TROOT.cxx:230
TSeqCollection * fColors
Definition: TROOT.h:161
Int_t GetNumber() const
Definition: TColor.h:54
TCollection * fTypes
Definition: TROOT.h:149
#define gPad
Definition: TVirtualPad.h:285
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
const char * proto
Definition: civetweb.c:15049
#define c(i)
Definition: RSha256.hxx:101
TSeqCollection * fBrowsers
Definition: TROOT.h:163
static GetROOTFun_t gGetROOT
Definition: TROOT.cxx:396
#define gDirectory
Definition: TDirectory.h:213
static void InitializeColors()
Initialize colors used by the TCanvas based graphics (via TColor objects).
Definition: TColor.cxx:1077
virtual TObject * FindObjectAnyFile(const char *name) const
Scan the memory lists of all files for an object with name.
Definition: TROOT.cxx:1421
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
Definition: TROOT.cxx:2928
TList * fBrowsables
Definition: TROOT.h:176
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TSeqCollection * fSockets
Definition: TROOT.h:156
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
Definition: TObject.cxx:908
TObject * FindSpecialObject(const char *name, void *&where)
Returns address and folder of a ROOT object if it exists.
Definition: TROOT.cxx:1352
R__EXTERN TInterpreter * gCling
Definition: TInterpreter.h:529
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Definition: TCollection.h:182
Bool_t fInterrupt
Definition: TROOT.h:142
Abstract base class defining a generic interface to the underlying Operating System.
Definition: TSystem.h:248
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition: TNamed.cxx:164
void Idle(UInt_t idleTimeInSec, const char *command=0)
Execute command when system has been idle for idleTimeInSec seconds.
Definition: TROOT.cxx:1850
void *(* GlobalFunc_t)()
Definition: TGlobal.h:54
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition: TEnv.cxx:491
TSeqCollection * GetListOfBrowsers() const
Definition: TROOT.h:253
const Bool_t kTRUE
Definition: RtypesCore.h:87
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
Definition: TSystem.cxx:1052
#define sym(otri1, otri2)
Definition: triangle.c:932
static TClass * R__GetClassIfKnown(const char *className)
Check whether className is a known class, and only autoload if we can.
Definition: TROOT.cxx:1865
char name[80]
Definition: TGX11.cxx:109
TString fConfigFeatures
Definition: TROOT.h:119
TProcessUUID * fUUIDs
Definition: TROOT.h:174
void DisableParBranchProcessing()
Globally disables the IMT use case of parallel branch processing, deactivating the corresponding lock...
Definition: TROOT.cxx:433
static void PrintStatistics()
Print memory usage statistics.
Definition: TStorage.cxx:406
const TObject * fPrimitive
Definition: TROOT.h:146
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:866
TVirtualPad * fSelectPad
Definition: TROOT.h:147
virtual TObject * First() const =0
virtual TObject * Last() const =0
TDictionary * Get(DeclId_t id)
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
TROOT()
Default ctor.
Definition: TROOT.cxx:643