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