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