70 #include "RConfigure.h"
71 #include "RConfigOptions.h"
73 #include "RGitCommit.h"
82 #define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
84 #define dlopen(library_name, flags) ::LoadLibrary(library_name)
85 #define dlclose(library) ::FreeLibrary((HMODULE)library)
87 static char Msg[1000];
88 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
89 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg,
93 FARPROC dlsym(
void *library,
const char *function_name)
97 FARPROC address = NULL;
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);
109 return ::GetProcAddress((HMODULE)library, function_name);
160 namespace std {}
using namespace std;
163 #if defined(R__HAS_COCOA)
169 #elif defined(R__WIN32)
173 extern "C" void R__SetZipMode(
int);
175 static DestroyInterpreter_t *gDestroyInterpreter = 0;
176 static void *gInterpreterLib = 0;
179 TVirtualMutex* gROOTMutex = 0;
180 ROOT::TVirtualRWMutex *ROOT::gCoreMutex =
nullptr;
183 void **(*gThreadTsd)(
void*,Int_t) = 0;
189 static Int_t IVERSQ()
191 Int_t maj, min, cycle;
192 sscanf(ROOT_RELEASE,
"%d.%d/%d", &maj, &min, &cycle);
193 return 10000*maj + 100*min + cycle;
199 static Int_t IDATQQ(
const char *date)
201 static const char *months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
202 "Jun",
"Jul",
"Aug",
"Sep",
"Oct",
207 sscanf(date,
"%s %d %d", sm, &dd, &yy);
208 for (
int i = 0; i < 12; i++)
209 if (!strncmp(sm, months[i], 3)) {
213 return 10000*yy + 100*mm + dd;
220 static Int_t ITIMQQ(
const char *time)
223 sscanf(time,
"%d:%d:%d", &hh, &mm, &ss);
230 static void CleanUpROOTAtExit()
233 R__LOCKGUARD(gROOTMutex);
235 if (gROOT->GetListOfFiles())
236 gROOT->GetListOfFiles()->Delete(
"slow");
237 if (gROOT->GetListOfSockets())
238 gROOT->GetListOfSockets()->Delete();
239 if (gROOT->GetListOfMappedFiles())
240 gROOT->GetListOfMappedFiles()->Delete(
"slow");
241 if (gROOT->GetListOfClosedObjects())
242 gROOT->GetListOfClosedObjects()->Delete(
"slow");
253 struct ModuleHeaderInfo_t {
254 ModuleHeaderInfo_t(
const char* moduleName,
255 const char** headers,
256 const char** includePaths,
257 const char* payloadCode,
258 const char* fwdDeclCode,
259 void (*triggerFunc)(),
260 const TROOT::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
261 const char **classesHeaders,
263 fModuleName(moduleName),
265 fPayloadCode(payloadCode),
266 fFwdDeclCode(fwdDeclCode),
267 fIncludePaths(includePaths),
268 fTriggerFunc(triggerFunc),
269 fClassesHeaders(classesHeaders),
270 fFwdNargsToKeepColl(fwdDeclsArgToSkip),
271 fHasCxxModule(hasCxxModule) {}
273 const char* fModuleName;
274 const char** fHeaders;
275 const char* fPayloadCode;
276 const char* fFwdDeclCode;
277 const char** fIncludePaths;
278 void (*fTriggerFunc)();
279 const char** fClassesHeaders;
280 const TROOT::FwdDeclArgsToKeepCollection_t fFwdNargsToKeepColl;
285 std::vector<ModuleHeaderInfo_t>& GetModuleHeaderInfoBuffer() {
286 static std::vector<ModuleHeaderInfo_t> moduleHeaderInfoBuffer;
287 return moduleHeaderInfoBuffer;
291 Int_t TROOT::fgDirLevel = 0;
292 Bool_t TROOT::fgRootInit = kFALSE;
293 Bool_t TROOT::fgMemCheck = kFALSE;
295 static void at_exit_of_TROOT() {
296 if (ROOT::Internal::gROOTLocal)
297 ROOT::Internal::gROOTLocal->~TROOT();
303 class TROOTAllocator {
335 char fHolder[
sizeof(TROOT)];
338 new(&(fHolder[0])) TROOT(
"root",
"The ROOT of EVERYTHING");
343 gROOTLocal->~TROOT();
375 extern TROOT *gROOTLocal;
380 static TROOTAllocator alloc;
385 static Bool_t initInterpreter = kFALSE;
386 if (!initInterpreter) {
387 initInterpreter = kTRUE;
388 gROOTLocal->InitInterpreter();
390 gROOTLocal->InitThreads();
394 typedef TROOT *(*GetROOTFun_t)();
396 static GetROOTFun_t gGetROOT = &GetROOT1;
398 static Func_t GetSymInLibImt(
const char *funcname)
400 const static bool loadSuccess = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym")?
false : 0 <= gSystem->Load(
"libImt");
402 if (
auto sym = gSystem->DynFindSymbol(
nullptr, funcname)) {
405 Error(
"GetSymInLibImt",
"Cannot get symbol %s.", funcname);
417 void EnableParBranchProcessing()
420 if (!IsImplicitMTEnabled())
422 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableParBranchProcessing");
426 ::Warning(
"EnableParBranchProcessing",
"Cannot enable parallel branch processing, please build ROOT with -Dimt=ON");
433 void DisableParBranchProcessing()
436 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableParBranchProcessing");
440 ::Warning(
"DisableParBranchProcessing",
"Cannot disable parallel branch processing, please build ROOT with -Dimt=ON");
446 Bool_t IsParBranchProcessingEnabled()
449 static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_IsParBranchProcessingEnabled");
466 void EnableParTreeProcessing()
469 if (!IsImplicitMTEnabled())
471 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableParTreeProcessing");
475 ::Warning(
"EnableParTreeProcessing",
"Cannot enable parallel tree processing, please build ROOT with -Dimt=ON");
482 void DisableParTreeProcessing()
485 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableParTreeProcessing");
489 ::Warning(
"DisableParTreeProcessing",
"Cannot disable parallel tree processing, please build ROOT with -Dimt=ON");
495 Bool_t IsParTreeProcessingEnabled()
498 static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_IsParTreeProcessingEnabled");
511 static Bool_t &IsImplicitMTEnabledImpl()
513 static Bool_t isImplicitMTEnabled = kFALSE;
514 return isImplicitMTEnabled;
521 return (*Internal::gGetROOT)();
524 TString &GetMacroPath() {
525 static TString macroPath;
549 void EnableThreadSafety()
551 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TThread_Initialize");
580 void EnableImplicitMT(UInt_t numthreads)
583 if (ROOT::Internal::IsImplicitMTEnabledImpl())
585 EnableThreadSafety();
586 static void (*sym)(UInt_t) = (
void(*)(UInt_t))Internal::GetSymInLibImt(
"ROOT_TImplicitMT_EnableImplicitMT");
589 ROOT::Internal::IsImplicitMTEnabledImpl() =
true;
591 ::Warning(
"EnableImplicitMT",
"Cannot enable implicit multi-threading with %d threads, please build ROOT with -Dimt=ON", numthreads);
597 void DisableImplicitMT()
600 static void (*sym)() = (
void(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_DisableImplicitMT");
603 ROOT::Internal::IsImplicitMTEnabledImpl() = kFALSE;
605 ::Warning(
"DisableImplicitMT",
"Cannot disable implicit multi-threading, please build ROOT with -Dimt=ON");
611 Bool_t IsImplicitMTEnabled()
613 return ROOT::Internal::IsImplicitMTEnabledImpl();
618 UInt_t GetImplicitMTPoolSize()
621 static UInt_t (*sym)() = (UInt_t(*)())Internal::GetSymInLibImt(
"ROOT_TImplicitMT_GetImplicitMTPoolSize");
633 TROOT *ROOT::Internal::gROOTLocal = ROOT::GetROOT();
647 TROOT::TROOT() : TDirectory(),
648 fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
649 fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
650 fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
651 fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
652 fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
653 fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
654 fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
655 fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
656 fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
657 fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
658 fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
681 TROOT::TROOT(
const char *name,
const char *title, VoidFuncPtr_t *initfunc)
682 : TDirectory(), fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
683 fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
684 fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
685 fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
686 fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
687 fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
688 fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
689 fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
690 fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
691 fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
692 fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
695 if (fgRootInit || ROOT::Internal::gROOTLocal) {
700 R__LOCKGUARD(gROOTMutex);
702 ROOT::Internal::gROOTLocal =
this;
713 gPluginMgr = fPluginManager =
new TPluginManager;
732 gRootDir = GetRootSys().Data();
734 TDirectory::BuildDirectory(
nullptr,
nullptr);
741 fConfigOptions = R__CONFIGUREOPTIONS;
742 fConfigFeatures = R__CONFIGUREFEATURES;
743 fVersion = ROOT_RELEASE;
744 fVersionCode = ROOT_VERSION_CODE;
745 fVersionInt = IVERSQ();
746 fVersionDate = IDATQQ(ROOT_RELEASE_DATE);
747 fVersionTime = ITIMQQ(ROOT_RELEASE_TIME);
748 fBuiltDate = IDATQQ(__DATE__);
749 fBuiltTime = ITIMQQ(__TIME__);
753 fClasses =
new THashTable(800,3); fClasses->UseRWLock();
755 fStreamerInfo =
new TObjArray(100); fStreamerInfo->UseRWLock();
756 fClassGenerators =
new TList;
760 if (!dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym")) {
762 fPluginManager->LoadHandlersFromEnv(gEnv);
765 TSystemDirectory *workdir =
new TSystemDirectory(
"workdir", gSystem->WorkingDirectory());
767 auto setNameLocked = [](TSeqCollection *l,
const char *collection_name) {
768 l->SetName(collection_name);
775 fColors = setNameLocked(
new TObjArray(1000),
"ListOfColors");
778 fGlobalFunctions = 0;
781 fList =
new THashList(1000,3); fList->UseRWLock();
782 fClosedObjects = setNameLocked(
new TList,
"ClosedFiles");
783 fFiles = setNameLocked(
new TList,
"Files");
784 fMappedFiles = setNameLocked(
new TList,
"MappedFiles");
785 fSockets = setNameLocked(
new TList,
"Sockets");
786 fCanvases = setNameLocked(
new TList,
"Canvases");
787 fStyles = setNameLocked(
new TList,
"Styles");
788 fFunctions = setNameLocked(
new TList,
"Functions");
789 fTasks = setNameLocked(
new TList,
"Tasks");
790 fGeometries = setNameLocked(
new TList,
"Geometries");
791 fBrowsers = setNameLocked(
new TList,
"Browsers");
792 fSpecials = setNameLocked(
new TList,
"Specials");
793 fBrowsables = (TList*)setNameLocked(
new TList,
"Browsables");
794 fCleanups = setNameLocked(
new THashList,
"Cleanups");
795 fMessageHandlers = setNameLocked(
new TList,
"MessageHandlers");
796 fSecContexts = setNameLocked(
new TList,
"SecContexts");
797 fProofs = setNameLocked(
new TList,
"Proofs");
798 fClipboard = setNameLocked(
new TList,
"Clipboard");
799 fDataSets = setNameLocked(
new TList,
"DataSets");
800 fTypes =
new TListOfTypes; fTypes->UseRWLock();
802 TProcessID::AddProcessID();
803 fUUIDs =
new TProcessUUID();
805 fRootFolder =
new TFolder();
806 fRootFolder->SetName(
"root");
807 fRootFolder->SetTitle(
"root of all folders");
808 fRootFolder->AddFolder(
"Classes",
"List of Active Classes",fClasses);
809 fRootFolder->AddFolder(
"Colors",
"List of Active Colors",fColors);
810 fRootFolder->AddFolder(
"MapFiles",
"List of MapFiles",fMappedFiles);
811 fRootFolder->AddFolder(
"Sockets",
"List of Socket Connections",fSockets);
812 fRootFolder->AddFolder(
"Canvases",
"List of Canvases",fCanvases);
813 fRootFolder->AddFolder(
"Styles",
"List of Styles",fStyles);
814 fRootFolder->AddFolder(
"Functions",
"List of Functions",fFunctions);
815 fRootFolder->AddFolder(
"Tasks",
"List of Tasks",fTasks);
816 fRootFolder->AddFolder(
"Geometries",
"List of Geometries",fGeometries);
817 fRootFolder->AddFolder(
"Browsers",
"List of Browsers",fBrowsers);
818 fRootFolder->AddFolder(
"Specials",
"List of Special Objects",fSpecials);
819 fRootFolder->AddFolder(
"Handlers",
"List of Message Handlers",fMessageHandlers);
820 fRootFolder->AddFolder(
"Cleanups",
"List of RecursiveRemove Collections",fCleanups);
821 fRootFolder->AddFolder(
"StreamerInfo",
"List of Active StreamerInfo Classes",fStreamerInfo);
822 fRootFolder->AddFolder(
"SecContexts",
"List of Security Contexts",fSecContexts);
823 fRootFolder->AddFolder(
"PROOF Sessions",
"List of PROOF sessions",fProofs);
824 fRootFolder->AddFolder(
"ROOT Memory",
"List of Objects in the gROOT Directory",fList);
825 fRootFolder->AddFolder(
"ROOT Files",
"List of Connected ROOT Files",fFiles);
828 fCleanups->Add(fCanvases); fCanvases->SetBit(kMustCleanup);
829 fCleanups->Add(fBrowsers); fBrowsers->SetBit(kMustCleanup);
830 fCleanups->Add(fTasks); fTasks->SetBit(kMustCleanup);
831 fCleanups->Add(fFiles); fFiles->SetBit(kMustCleanup);
832 fCleanups->Add(fClosedObjects); fClosedObjects->SetBit(kMustCleanup);
834 fCleanups->Add(fList);
836 fExecutingMacro= kFALSE;
837 fForceStyle = kFALSE;
839 fReadingObject = kFALSE;
846 fDefCanvasName =
"c1";
847 fEditHistograms= kFALSE;
848 fLineIsProcessing = 1;
855 fCutClassName =
"TCutG";
858 new TMessageHandler((TClass*)0);
862 TStyle::BuildStyles();
863 SetStyle(gEnv->GetValue(
"Canvas.Style",
"Modern"));
866 gBatchGuiFactory =
new TGuiFactory;
867 gGuiFactory = gBatchGuiFactory;
868 gGXBatch =
new TVirtualX(
"Batch",
"ROOT Interface to batch graphics");
869 gVirtualX = gGXBatch;
871 #if defined(R__WIN32)
873 #elif defined(R__HAS_COCOA)
876 if (gSystem->Getenv(
"DISPLAY"))
883 while (initfunc && initfunc[i]) {
890 fBrowsables->Add(fRootFolder,
"root");
891 fBrowsables->Add(fProofs,
"PROOF Sessions");
892 fBrowsables->Add(workdir, gSystem->WorkingDirectory());
893 fBrowsables->Add(fFiles,
"ROOT Files");
895 atexit(CleanUpROOTAtExit);
897 ROOT::Internal::gGetROOT = &ROOT::Internal::GetROOT2;
906 using namespace ROOT::Internal;
908 if (gROOTLocal ==
this) {
911 gGetROOT = &GetROOT1;
915 SetBit(TObject::kInvalidObject);
923 if (!fVersionInt)
return;
927 SafeDelete(fBrowsables);
932 #ifdef R__COMPLETE_MEM_TERMINATION
933 fSpecials->Delete(); SafeDelete(fSpecials);
936 fClosedObjects->Delete(
"slow");
937 fFiles->Delete(
"slow");
939 fSecContexts->Delete(
"slow"); SafeDelete(fSecContexts);
940 fSockets->Delete(); SafeDelete(fSockets);
941 fMappedFiles->Delete(
"slow");
942 TSeqCollection *tl = fMappedFiles; fMappedFiles = 0;
delete tl;
944 SafeDelete(fClosedObjects);
947 TProcessID::Cleanup();
949 fFunctions->Delete(); SafeDelete(fFunctions);
950 fGeometries->Delete(); SafeDelete(fGeometries);
951 fBrowsers->Delete(); SafeDelete(fBrowsers);
952 SafeDelete(fCanvases);
953 fColors->Delete(); SafeDelete(fColors);
954 fStyles->Delete(); SafeDelete(fStyles);
956 #ifdef R__COMPLETE_MEM_TERMINATION
957 if (gGuiFactory != gBatchGuiFactory) SafeDelete(gGuiFactory);
958 SafeDelete(gBatchGuiFactory);
959 if (gGXBatch != gVirtualX) SafeDelete(gGXBatch);
960 SafeDelete(gVirtualX);
964 TQObject::BlockAllSignals(kTRUE);
966 fMessageHandlers->Delete(); SafeDelete(fMessageHandlers);
968 #ifdef R__COMPLETE_MEM_TERMINATION
969 SafeDelete(fCanvases);
972 SafeDelete(fDataSets);
973 SafeDelete(fClipboard);
976 delete fPluginManager; gPluginMgr = fPluginManager = 0;
977 delete gClassTable; gClassTable = 0;
978 delete gEnv; gEnv = 0;
980 if (fTypes) fTypes->Delete();
982 if (fGlobals) fGlobals->Delete();
983 SafeDelete(fGlobals);
984 if (fGlobalFunctions) fGlobalFunctions->Delete();
985 SafeDelete(fGlobalFunctions);
986 fEnums.load()->Delete();
993 gSystem->CleanCompiledMacros();
1000 #ifdef R__COMPLETE_MEM_TERMINATION
1022 SafeDelete(fCleanups);
1027 delete fInterpreter;
1031 TStorage::PrintStatistics();
1034 fgRootInit = kFALSE;
1042 void TROOT::AddClass(TClass *cl)
1044 TClass::AddClass(cl);
1052 void TROOT::AddClassGenerator(TClassGenerator *generator)
1054 if (!generator)
return;
1055 fClassGenerators->Add(generator);
1064 void TROOT::Append(TObject *obj, Bool_t replace )
1066 R__LOCKGUARD(gROOTMutex);
1067 TDirectory::Append(obj,replace);
1073 void TROOT::Browse(TBrowser *b)
1076 TIter next(fBrowsables);
1078 while ((obj = (TObject *) next())) {
1079 const char *opt = next.GetOption();
1080 if (opt && strlen(opt))
1083 b->Add(obj, obj->GetName());
1092 Bool_t TROOT::ClassSaved(TClass *cl)
1094 if (cl == 0)
return kFALSE;
1095 if (cl->TestBit(TClass::kClassSaved))
return kTRUE;
1096 cl->SetBit(TClass::kClassSaved);
1101 static void R__ListSlowClose(TList *files)
1106 static TObject harmless;
1107 TObjLink *cursor = files->FirstLink();
1109 TDirectory *dir =
static_cast<TDirectory*
>( cursor->GetObject() );
1119 cursor->SetObject(&harmless);
1121 dir->Close(
"nodelete");
1123 cursor->SetObject(dir);
1125 cursor = cursor->Next();
1131 files->Clear(
"nodelete");
1134 static void R__ListSlowDeleteContent(TList *files)
1138 static TObject harmless;
1139 TObjLink *cursor = files->FirstLink();
1141 TDirectory *dir =
dynamic_cast<TDirectory*
>( cursor->GetObject() );
1151 cursor->SetObject(&harmless);
1153 dir->GetList()->Delete(
"slow");
1155 cursor->SetObject(dir);
1157 cursor = cursor->Next();
1166 void TROOT::CloseFiles()
1168 if (fFiles && fFiles->First()) {
1169 R__ListSlowClose(static_cast<TList*>(fFiles));
1174 if (fSockets && fSockets->First()) {
1175 if (0==fCleanups->FindObject(fSockets) ) {
1176 fCleanups->Add(fSockets);
1177 fSockets->SetBit(kMustCleanup);
1179 CallFunc_t *socketCloser = gInterpreter->CallFunc_Factory();
1181 TClass *socketClass = TClass::GetClass(
"TSocket");
1182 gInterpreter->CallFunc_SetFuncProto(socketCloser, socketClass->GetClassInfo(),
"Close",
"", &offset);
1183 if (gInterpreter->CallFunc_IsValid(socketCloser)) {
1184 static TObject harmless;
1185 TObjLink *cursor =
static_cast<TList*
>(fSockets)->FirstLink();
1188 TObject *socket = cursor->GetObject();
1197 cursor->SetObject(&harmless);
1199 if (socket->IsA()->InheritsFrom(socketClass)) {
1200 gInterpreter->CallFunc_Exec(socketCloser, ((
char*)socket)+offset);
1202 socket->SetBit(kMustCleanup);
1203 fClosedObjects->AddLast(socket);
1206 Long_t other_offset;
1207 CallFunc_t *otherCloser = gInterpreter->CallFunc_Factory();
1208 gInterpreter->CallFunc_SetFuncProto(otherCloser, socket->IsA()->GetClassInfo(),
"Close",
"", &other_offset);
1209 if (gInterpreter->CallFunc_IsValid(otherCloser)) {
1210 gInterpreter->CallFunc_Exec(otherCloser, ((
char*)socket)+other_offset);
1212 socket->SetBit(kMustCleanup);
1213 fClosedObjects->AddLast(socket);
1215 notclosed.AddLast(socket);
1217 gInterpreter->CallFunc_Delete(otherCloser);
1219 cursor->SetObject(socket);
1221 cursor = cursor->Next();
1226 cursor = notclosed.FirstLink();
1228 static_cast<TList*
>(fSockets)->AddLast(cursor->GetObject());
1229 cursor = cursor->Next();
1232 gInterpreter->CallFunc_Delete(socketCloser);
1234 if (fMappedFiles && fMappedFiles->First()) {
1235 R__ListSlowClose(static_cast<TList*>(fMappedFiles));
1244 void TROOT::EndOfProcessCleanups()
1251 gInterpreter->ResetGlobals();
1256 if (fClosedObjects && fClosedObjects->First()) {
1257 R__ListSlowDeleteContent(static_cast<TList*>(fClosedObjects));
1262 fFunctions->Delete();
1263 fGeometries->Delete();
1264 fBrowsers->Delete();
1265 fCanvases->Delete(
"slow");
1269 TQObject::BlockAllSignals(kTRUE);
1272 gInterpreter->ShutDown();
1280 TObject *TROOT::FindObject(
const TObject *)
const
1282 Error(
"FindObject",
"Not yet implemented");
1306 TObject *TROOT::FindObject(
const char *name)
const
1308 if (name && strstr(name,
"/"))
return FindObjectAny(name);
1312 temp = fFiles->FindObject(name);
if (temp)
return temp;
1313 temp = fMappedFiles->FindObject(name);
if (temp)
return temp;
1315 R__LOCKGUARD(gROOTMutex);
1316 temp = fFunctions->FindObject(name);
if (temp)
return temp;
1318 temp = fGeometries->FindObject(name);
if (temp)
return temp;
1319 temp = fCanvases->FindObject(name);
if (temp)
return temp;
1320 temp = fStyles->FindObject(name);
if (temp)
return temp;
1322 R__LOCKGUARD(gROOTMutex);
1323 temp = fSpecials->FindObject(name);
if (temp)
return temp;
1325 TIter next(fGeometries);
1327 while ((obj=next())) {
1328 temp = obj->FindObject(name);
if (temp)
return temp;
1330 if (gDirectory) temp = gDirectory->Get(name);
1331 if (temp)
return temp;
1333 TVirtualPad *canvas = gPad->GetVirtCanvas();
1334 if (fCanvases->FindObject(canvas)) {
1335 temp = canvas->FindObject(name);
1336 if (!temp && canvas != gPad) temp = gPad->FindObject(name);
1360 TObject *TROOT::FindSpecialObject(
const char *name,
void *&where)
1366 temp = fFiles->FindObject(name);
1370 temp = fMappedFiles->FindObject(name);
1371 where = fMappedFiles;
1374 R__LOCKGUARD(gROOTMutex);
1375 temp = fFunctions->FindObject(name);
1379 temp = fCanvases->FindObject(name);
1383 temp = fStyles->FindObject(name);
1387 temp = fSpecials->FindObject(name);
1391 TObject *glast = fGeometries->Last();
1392 if (glast) {where = glast; temp = glast->FindObject(name);}
1394 if (!temp && gDirectory) {
1395 temp = gDirectory->Get(name);
1398 if (!temp && gPad) {
1399 TVirtualPad *canvas = gPad->GetVirtCanvas();
1400 if (fCanvases->FindObject(canvas)) {
1401 temp = canvas->FindObject(name);
1403 if (!temp && canvas != gPad) {
1404 temp = gPad->FindObject(name);
1409 if (!temp)
return 0;
1410 if (temp->TestBit(kNotDeleted))
return temp;
1419 TObject *TROOT::FindObjectAny(
const char *name)
const
1421 TObject *obj = fRootFolder->FindObjectAny(name);
1422 if (obj)
return obj;
1423 return gDirectory->FindObjectAnyFile(name);
1429 TObject *TROOT::FindObjectAnyFile(
const char *name)
const
1431 R__LOCKGUARD(gROOTMutex);
1433 TIter next(GetListOfFiles());
1434 while ((d = (TDirectory*)next())) {
1437 TObject *obj = d->TDirectory::FindObject(name);
1438 if (obj)
return obj;
1446 const char *TROOT::FindObjectClassName(
const char *name)
const
1449 TObject *obj = FindObject(name);
1450 if (obj)
return obj->ClassName();
1453 TGlobal *g = GetGlobal(name);
1454 if (g)
return g->GetTypeName();
1466 const char *TROOT::FindObjectPathName(
const TObject *)
const
1468 Error(
"FindObjectPathName",
"Not yet implemented");
1477 TClass *TROOT::FindSTLClass(
const char *name, Bool_t load, Bool_t silent)
const
1491 R__LOCKGUARD(gInterpreterMutex);
1494 std::string normalized;
1495 TClassEdit::GetNormalizedName(normalized, name);
1498 if (normalized != name) cl = TClass::GetClass(normalized.c_str(),load,silent);
1500 if (load && cl==0) {
1502 cl = gInterpreter->GenerateTClass(normalized.c_str(), kTRUE, silent);
1511 TClass *TROOT::GetClass(
const char *name, Bool_t load, Bool_t silent)
const
1513 return TClass::GetClass(name,load,silent);
1521 TClass *TROOT::GetClass(
const std::type_info& typeinfo, Bool_t load, Bool_t silent)
const
1523 return TClass::GetClass(typeinfo,load,silent);
1529 TColor *TROOT::GetColor(Int_t color)
const
1531 TColor::InitializeColors();
1532 TObjArray *lcolors = (TObjArray*) GetListOfColors();
1533 if (!lcolors)
return 0;
1534 if (color < 0 || color >= lcolors->GetSize())
return 0;
1535 TColor *col = (TColor*)lcolors->At(color);
1536 if (col && col->GetNumber() == color)
return col;
1537 TIter next(lcolors);
1538 while ((col = (TColor *) next()))
1539 if (col->GetNumber() == color)
return col;
1547 TCanvas *TROOT::MakeDefCanvas()
const
1549 return (TCanvas*)gROOT->ProcessLine(
"TCanvas::MakeDefCanvas();");
1555 TDataType *TROOT::GetType(
const char *name, Bool_t )
const
1557 return (TDataType*)gROOT->GetListOfTypes()->FindObject(name);
1563 TFile *TROOT::GetFile(
const char *name)
const
1565 R__LOCKGUARD(gROOTMutex);
1566 return (TFile*)GetListOfFiles()->FindObject(name);
1572 TStyle *TROOT::GetStyle(
const char *name)
const
1574 return (TStyle*)GetListOfStyles()->FindObject(name);
1580 TObject *TROOT::GetFunction(
const char *name)
const
1582 if (name == 0 || name[0] == 0) {
1587 R__LOCKGUARD(gROOTMutex);
1588 TObject *f1 = fFunctions->FindObject(name);
1592 gROOT->ProcessLine(
"TF1::InitStandardFunctions();");
1594 R__LOCKGUARD(gROOTMutex);
1595 return fFunctions->FindObject(name);
1600 TFunctionTemplate *TROOT::GetFunctionTemplate(
const char *name)
1602 if (!gInterpreter)
return 0;
1604 if (!fFuncTemplate) fFuncTemplate =
new TListOfFunctionTemplates(0);
1606 return (TFunctionTemplate*)fFuncTemplate->FindObject(name);
1613 TGlobal *TROOT::GetGlobal(
const char *name, Bool_t load)
const
1615 return (TGlobal *)gROOT->GetListOfGlobals(load)->FindObject(name);
1621 TGlobal *TROOT::GetGlobal(
const TObject *addr, Bool_t )
const
1623 if (addr == 0 || ((Long_t)addr) == -1)
return 0;
1625 TInterpreter::DeclId_t decl = gInterpreter->GetDataMemberAtAddr(addr);
1627 TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1628 return (TGlobal*)globals->Get(decl);
1633 decl = gInterpreter->GetDataMemberWithValue(addr);
1635 TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1636 return (TGlobal*)globals->Get(decl);
1645 TListOfFunctions *TROOT::GetGlobalFunctions()
1647 if (!fGlobalFunctions) fGlobalFunctions =
new TListOfFunctions(0);
1648 return fGlobalFunctions;
1654 TCollection *TROOT::GetListOfFunctionOverloads(
const char* name)
const
1656 return ((TListOfFunctions*)fGlobalFunctions)->GetListForObject(name);
1667 TFunction *TROOT::GetGlobalFunction(
const char *
function,
const char *params,
1671 R__LOCKGUARD(gROOTMutex);
1672 return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(
function);
1675 Fatal(
"GetGlobalFunction",
"fInterpreter not initialized");
1677 R__LOCKGUARD(gROOTMutex);
1678 TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithValues(0,
1682 if (!decl)
return 0;
1684 TFunction *f = GetGlobalFunctions()->Get(decl);
1687 Error(
"GetGlobalFunction",
1688 "\nDid not find matching TFunction <%s> with \"%s\".",
1700 TFunction *TROOT::GetGlobalFunctionWithPrototype(
const char *
function,
1701 const char *proto, Bool_t load)
1704 R__LOCKGUARD(gROOTMutex);
1705 return (TFunction *)GetListOfGlobalFunctions(load)->FindObject(
function);
1708 Fatal(
"GetGlobalFunctionWithPrototype",
"fInterpreter not initialized");
1710 R__LOCKGUARD(gROOTMutex);
1711 TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithPrototype(0,
1714 if (!decl)
return 0;
1716 TFunction *f = GetGlobalFunctions()->Get(decl);
1719 Error(
"GetGlobalFunctionWithPrototype",
1720 "\nDid not find matching TFunction <%s> with \"%s\".",
1729 TObject *TROOT::GetGeometry(
const char *name)
const
1731 return GetListOfGeometries()->FindObject(name);
1736 TCollection *TROOT::GetListOfEnums(Bool_t load )
1738 if(!fEnums.load()) {
1739 R__LOCKGUARD(gROOTMutex);
1742 if (!fEnums.load()) fEnums =
new TListOfEnumsWithLock(0);
1745 R__LOCKGUARD(gROOTMutex);
1748 return fEnums.load();
1753 TCollection *TROOT::GetListOfFunctionTemplates()
1755 R__LOCKGUARD(gROOTMutex);
1756 if(!fFuncTemplate) {
1757 fFuncTemplate =
new TListOfFunctionTemplates(0);
1759 return fFuncTemplate;
1770 TCollection *TROOT::GetListOfGlobals(Bool_t load)
1773 fGlobals =
new TListOfDataMembers(0);
1777 TGlobalMappedFunction::MakeFunctor(
"gROOT",
"TROOT*", ROOT::GetROOT, [] {
1779 return (
void *)&ROOT::Internal::gROOTLocal;
1782 TGlobalMappedFunction::MakeFunctor(
"gPad",
"TVirtualPad*", TVirtualPad::Pad);
1783 TGlobalMappedFunction::MakeFunctor(
"gVirtualX",
"TVirtualX*", TVirtualX::Instance);
1784 TGlobalMappedFunction::MakeFunctor(
"gDirectory",
"TDirectory*", TDirectory::CurrentDirectory);
1787 fGlobals->AddAll(&TGlobalMappedFunction::GetEarlyRegisteredGlobals());
1788 TGlobalMappedFunction::GetEarlyRegisteredGlobals().SetOwner(kFALSE);
1789 TGlobalMappedFunction::GetEarlyRegisteredGlobals().Clear();
1793 Fatal(
"GetListOfGlobals",
"fInterpreter not initialized");
1795 if (load) fGlobals->Load();
1808 TCollection *TROOT::GetListOfGlobalFunctions(Bool_t load)
1810 R__LOCKGUARD(gROOTMutex);
1812 if (!fGlobalFunctions) {
1813 fGlobalFunctions =
new TListOfFunctions(0);
1817 Fatal(
"GetListOfGlobalFunctions",
"fInterpreter not initialized");
1823 if (load) fGlobalFunctions->Load();
1825 return fGlobalFunctions;
1847 TCollection *TROOT::GetListOfTypes(Bool_t )
1850 Fatal(
"GetListOfTypes",
"fInterpreter not initialized");
1859 void TROOT::Idle(UInt_t idleTimeInSec,
const char *command)
1861 if (!fApplication.load())
1862 TApplication::CreateApplication();
1864 if (idleTimeInSec <= 0)
1865 (*fApplication).RemoveIdleTimer();
1867 (*fApplication).SetIdleTimer(idleTimeInSec, command);
1874 static TClass* R__GetClassIfKnown(
const char* className)
1877 const char* libsToLoad = gInterpreter->GetClassSharedLibs(className);
1881 return TClass::GetClass(className);
1882 }
else if (gROOT->GetListOfClasses()
1883 && (cla = (TClass*)gROOT->GetListOfClasses()->FindObject(className))) {
1885 }
else if (gClassTable->FindObject(className)) {
1886 return TClass::GetClass(className);
1895 Int_t TROOT::IgnoreInclude(
const char *fname,
const char * )
1897 if (fname == 0)
return 0;
1899 TString stem(fname);
1901 Int_t where = stem.Last(
'.');
1902 if (where != kNPOS) {
1903 if (stem.EndsWith(
".so") || stem.EndsWith(
".sl") ||
1904 stem.EndsWith(
".dl") || stem.EndsWith(
".a") ||
1905 stem.EndsWith(
".dll", TString::kIgnoreCase))
1910 TString className = gSystem->BaseName(stem);
1911 TClass* cla = R__GetClassIfKnown(className);
1915 className.ReplaceAll(
"/",
"::");
1916 className.ReplaceAll(
"\\",
"::");
1917 if (className.Contains(
":::")) {
1926 cla = R__GetClassIfKnown(className);
1934 if (cla->GetDeclFileLine() <= 0)
return 0;
1935 TString decfile = gSystem->BaseName(cla->GetDeclFileName());
1936 if (decfile != gSystem->BaseName(fname)) {
1945 void TROOT::InitSystem()
1948 #if defined(R__UNIX)
1949 #if defined(R__HAS_COCOA)
1950 gSystem =
new TMacOSXSystem;
1952 gSystem =
new TUnixSystem;
1954 #elif defined(R__WIN32)
1955 gSystem =
new TWinNTSystem;
1957 gSystem =
new TSystem;
1960 if (gSystem->Init())
1961 fprintf(stderr,
"Fatal in <TROOT::InitSystem>: can't init operating system layer\n");
1963 if (!gSystem->HomeDirectory()) {
1964 fprintf(stderr,
"Fatal in <TROOT::InitSystem>: HOME directory not set\n");
1965 fprintf(stderr,
"Fix this by defining the HOME shell variable\n");
1969 gEnv =
new TEnv(
".rootrc");
1971 gDebug = gEnv->GetValue(
"Root.Debug", 0);
1973 if (!gEnv->GetValue(
"Root.ErrorHandlers", 1))
1974 gSystem->ResetSignals();
1981 Int_t oldzipmode = gEnv->GetValue(
"Root.ZipMode", -1);
1982 if (oldzipmode == 0) {
1983 fprintf(stderr,
"Warning in <TROOT::InitSystem>: ignoring old rootrc entry \"Root.ZipMode = 0\"!\n");
1985 if (oldzipmode == -1 || oldzipmode == 1) {
1993 Int_t zipmode = gEnv->GetValue(
"Root.CompressionAlgorithm", oldzipmode);
1994 if (zipmode != 0) R__SetZipMode(zipmode);
1997 if ((sdeb = gSystem->Getenv(
"ROOTDEBUG")))
1998 gDebug = atoi(sdeb);
2000 if (gDebug > 0 && isatty(2))
2001 fprintf(stderr,
"Info in <TROOT::InitSystem>: running with gDebug = %d\n", gDebug);
2003 if (gEnv->GetValue(
"Root.MemStat", 0))
2004 TStorage::EnableStatistics();
2005 int msize = gEnv->GetValue(
"Root.MemStat.size", -1);
2006 int mcnt = gEnv->GetValue(
"Root.MemStat.cnt", -1);
2007 if (msize != -1 || mcnt != -1)
2008 TStorage::EnableStatistics(msize, mcnt);
2010 fgMemCheck = gEnv->GetValue(
"Root.MemCheck", 0);
2012 #if defined(R__HAS_COCOA)
2017 { TUrl dummy(
"/dummy"); }
2019 TObject::SetObjectStat(gEnv->GetValue(
"Root.ObjectStat", 0));
2026 void TROOT::InitThreads()
2028 if (gEnv->GetValue(
"Root.UseThreads", 0) || gEnv->GetValue(
"Root.EnableThreadSafety", 0)) {
2029 ROOT::EnableThreadSafety();
2037 void TROOT::InitInterpreter()
2041 if (!dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym")
2042 && !dlsym(RTLD_DEFAULT,
"usedToIdentifyStaticRoot")) {
2048 void *LLVMEnablePrettyStackTraceAddr = 0;
2051 LLVMEnablePrettyStackTraceAddr = dlsym(RTLD_DEFAULT,
"LLVMEnablePrettyStackTrace");
2053 if (LLVMEnablePrettyStackTraceAddr) {
2054 Error(
"InitInterpreter()",
"LLVM SYMBOLS ARE EXPOSED TO CLING! "
2055 "This will cause problems; please hide them or dlopen() them "
2056 "after the call to TROOT::InitInterpreter()!");
2059 char *libRIO = gSystem->DynamicPathName(
"libRIO");
2060 void *libRIOHandle = dlopen(libRIO, RTLD_NOW|RTLD_GLOBAL);
2062 if (!libRIOHandle) {
2063 TString err = dlerror();
2064 fprintf(stderr,
"Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2068 char *libcling = gSystem->DynamicPathName(
"libCling");
2069 gInterpreterLib = dlopen(libcling, RTLD_LAZY|RTLD_LOCAL);
2072 if (!gInterpreterLib) {
2073 TString err = dlerror();
2074 fprintf(stderr,
"Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2079 gInterpreterLib = RTLD_DEFAULT;
2081 CreateInterpreter_t *CreateInterpreter = (CreateInterpreter_t*) dlsym(gInterpreterLib,
"CreateInterpreter");
2082 if (!CreateInterpreter) {
2083 TString err = dlerror();
2084 fprintf(stderr,
"Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2088 atexit(at_exit_of_TROOT);
2090 gDestroyInterpreter = (DestroyInterpreter_t*) dlsym(gInterpreterLib,
"DestroyInterpreter");
2091 if (!gDestroyInterpreter) {
2092 TString err = dlerror();
2093 fprintf(stderr,
"Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2097 const char *interpArgs[] = {
2115 fInterpreter = CreateInterpreter(gInterpreterLib, interpArgs);
2117 fCleanups->Add(fInterpreter);
2118 fInterpreter->SetBit(kMustCleanup);
2127 for (std::vector<ModuleHeaderInfo_t>::const_iterator
2128 li = GetModuleHeaderInfoBuffer().begin(),
2129 le = GetModuleHeaderInfoBuffer().end(); li != le; ++li) {
2131 fInterpreter->RegisterModule(li->fModuleName,
2137 li->fFwdNargsToKeepColl,
2138 li->fClassesHeaders,
2142 GetModuleHeaderInfoBuffer().clear();
2144 fInterpreter->Initialize();
2156 TClass *TROOT::LoadClass(
const char *requestedname, Bool_t silent)
const
2158 return TClass::LoadClass(requestedname, silent);
2172 Int_t TROOT::LoadClass(
const char * ,
const char *libname,
2175 TString lib(libname);
2178 if (
char *path = gSystem->DynamicPathName(lib, kTRUE)) {
2187 int err = gSystem->Load(path, 0, kTRUE);
2199 if (!gSystem->GetPathInfo(libname, stat) && (R_ISREG(stat.fMode) &&
2200 !gSystem->AccessPathName(libname, kReadPermission)))
2205 if (!lib.BeginsWith(
"lib")) {
2207 return LoadClass(
"", lib.Data(), check);
2219 Bool_t TROOT::IsRootFile(
const char *filename)
const
2221 Bool_t result = kFALSE;
2222 FILE *mayberootfile = fopen(filename,
"rb");
2223 if (mayberootfile) {
2225 if (fgets(header,5,mayberootfile)) {
2226 result = strncmp(header,
"root",4)==0;
2228 fclose(mayberootfile);
2239 void TROOT::ls(Option_t *option)
const
2243 TDirectory::ls(option);
2257 Int_t TROOT::LoadMacro(
const char *filename,
int *error, Bool_t check)
2270 TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2272 if (arguments.Length()) {
2273 Warning(
"LoadMacro",
"argument(%s) ignored in %s", arguments.Data(), GetMacroPath());
2275 char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2278 Error(
"LoadMacro",
"macro %s not found in path %s", fname.Data(), GetMacroPath());
2279 *terr = TInterpreter::kFatal;
2286 gInterpreter->LoadMacro(fname.Data(), (TInterpreter::EErrorCode*)terr);
2305 Long_t TROOT::Macro(
const char *filename, Int_t *error, Bool_t padUpdate)
2313 TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2315 char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2317 Error(
"Macro",
"macro %s not found in path %s", fname.Data(), GetMacroPath());
2319 *error = TInterpreter::kFatal;
2325 result = gInterpreter->ExecuteMacro(fname, (TInterpreter::EErrorCode*)error);
2329 if (padUpdate && gPad)
2339 void TROOT::Message(Int_t
id,
const TObject *obj)
2341 TIter next(fMessageHandlers);
2342 TMessageHandler *mh;
2343 while ((mh = (TMessageHandler*)next())) {
2344 mh->HandleMessage(
id,obj);
2359 Long_t TROOT::ProcessLine(
const char *line, Int_t *error)
2361 TString sline = line;
2362 sline = sline.Strip(TString::kBoth);
2364 if (!fApplication.load())
2365 TApplication::CreateApplication();
2367 return (*fApplication).ProcessLine(sline, kFALSE, error);
2379 Long_t TROOT::ProcessLineSync(
const char *line, Int_t *error)
2381 TString sline = line;
2382 sline = sline.Strip(TString::kBoth);
2384 if (!fApplication.load())
2385 TApplication::CreateApplication();
2387 return (*fApplication).ProcessLine(sline, kTRUE, error);
2396 Long_t TROOT::ProcessLineFast(
const char *line, Int_t *error)
2398 TString sline = line;
2399 sline = sline.Strip(TString::kBoth);
2401 if (!fApplication.load())
2402 TApplication::CreateApplication();
2407 TInterpreter::EErrorCode *code = (TInterpreter::EErrorCode*)error;
2408 result = gInterpreter->Calc(sline, code);
2418 void TROOT::ReadGitInfo()
2420 #ifdef ROOT_GIT_COMMIT
2421 fGitCommit = ROOT_GIT_COMMIT;
2423 #ifdef ROOT_GIT_BRANCH
2424 fGitBranch = ROOT_GIT_BRANCH;
2427 TString gitinfo =
"gitinfo.txt";
2428 char *filename = gSystem->ConcatFileName(TROOT::GetEtcDir(), gitinfo);
2430 FILE *fp = fopen(filename,
"r");
2447 Bool_t &GetReadingObject() {
2448 TTHREAD_TLS(Bool_t) fgReadingObject = false;
2449 return fgReadingObject;
2455 Bool_t TROOT::ReadingObject()
const
2457 return GetReadingObject();
2460 void TROOT::SetReadingObject(Bool_t flag)
2462 GetReadingObject() = flag;
2469 const char *TROOT::GetGitDate()
2471 if (fGitDate ==
"") {
2472 Int_t iday,imonth,iyear, ihour, imin;
2473 static const char *months[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
2474 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec" };
2475 Int_t idate = gROOT->GetBuiltDate();
2476 Int_t itime = gROOT->GetBuiltTime();
2478 imonth = (idate/100)%100;
2479 iyear = idate/10000;
2482 fGitDate.Form(
"%s %02d %4d, %02d:%02d:00", months[imonth-1], iday, iyear, ihour, imin);
2493 void TROOT::RecursiveRemove(TObject *obj)
2495 R__READ_LOCKGUARD(ROOT::gCoreMutex);
2497 fCleanups->RecursiveRemove(obj);
2507 void TROOT::RefreshBrowsers()
2509 TIter next(GetListOfBrowsers());
2511 while ((b = (TBrowser*) next()))
2512 b->SetRefreshFlag(kTRUE);
2517 static void CallCloseFiles()
2519 if (TROOT::Initialized() && ROOT::Internal::gROOTLocal) {
2520 gROOT->CloseFiles();
2530 void TROOT::RegisterModule(
const char* modulename,
2531 const char** headers,
2532 const char** includePaths,
2533 const char* payloadCode,
2534 const char* fwdDeclCode,
2535 void (*triggerFunc)(),
2536 const TInterpreter::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
2537 const char** classesHeaders,
2596 atexit(CallCloseFiles);
2599 if (TROOT::Initialized()) {
2600 gCling->RegisterModule(modulename, headers, includePaths, payloadCode, fwdDeclCode, triggerFunc,
2601 fwdDeclsArgToSkip, classesHeaders,
false, hasCxxModule);
2603 GetModuleHeaderInfoBuffer().push_back(ModuleHeaderInfo_t(modulename, headers, includePaths, payloadCode,
2604 fwdDeclCode, triggerFunc, fwdDeclsArgToSkip,
2605 classesHeaders, hasCxxModule));
2613 TObject *TROOT::Remove(TObject* obj)
2615 R__LOCKGUARD(gROOTMutex);
2616 return TDirectory::Remove(obj);
2623 void TROOT::RemoveClass(TClass *oldcl)
2625 TClass::RemoveClass(oldcl);
2646 void TROOT::Reset(Option_t *option)
2648 if (IsExecutingMacro())
return;
2650 if (!strncmp(option,
"a", 1)) {
2651 fInterpreter->Reset();
2652 fInterpreter->SaveContext();
2654 gInterpreter->ResetGlobals();
2656 if (fGlobals) fGlobals->Unload();
2657 if (fGlobalFunctions) fGlobalFunctions->Unload();
2666 void TROOT::SaveContext()
2669 gInterpreter->SaveGlobalsContext();
2678 void TROOT::SetCutClassName(
const char *name)
2681 Error(
"SetCutClassName",
"Invalid class name");
2684 TClass *cl = TClass::GetClass(name);
2686 Error(
"SetCutClassName",
"Unknown class:%s",name);
2689 if (!cl->InheritsFrom(
"TCutG")) {
2690 Error(
"SetCutClassName",
"Class:%s does not derive from TCutG",name);
2693 fCutClassName = name;
2699 void TROOT::SetEditorMode(
const char *mode)
2702 if (!mode[0])
return;
2703 if (!strcmp(mode,
"Arc")) {fEditorMode = kArc;
return;}
2704 if (!strcmp(mode,
"Line")) {fEditorMode = kLine;
return;}
2705 if (!strcmp(mode,
"Arrow")) {fEditorMode = kArrow;
return;}
2706 if (!strcmp(mode,
"Button")) {fEditorMode = kButton;
return;}
2707 if (!strcmp(mode,
"Diamond")) {fEditorMode = kDiamond;
return;}
2708 if (!strcmp(mode,
"Ellipse")) {fEditorMode = kEllipse;
return;}
2709 if (!strcmp(mode,
"Pad")) {fEditorMode = kPad;
return;}
2710 if (!strcmp(mode,
"Pave")) {fEditorMode = kPave;
return;}
2711 if (!strcmp(mode,
"PaveLabel")){fEditorMode = kPaveLabel;
return;}
2712 if (!strcmp(mode,
"PaveText")) {fEditorMode = kPaveText;
return;}
2713 if (!strcmp(mode,
"PavesText")){fEditorMode = kPavesText;
return;}
2714 if (!strcmp(mode,
"PolyLine")) {fEditorMode = kPolyLine;
return;}
2715 if (!strcmp(mode,
"CurlyLine")){fEditorMode = kCurlyLine;
return;}
2716 if (!strcmp(mode,
"CurlyArc")) {fEditorMode = kCurlyArc;
return;}
2717 if (!strcmp(mode,
"Text")) {fEditorMode = kText;
return;}
2718 if (!strcmp(mode,
"Marker")) {fEditorMode = kMarker;
return;}
2719 if (!strcmp(mode,
"CutG")) {fEditorMode = kCutG;
return;}
2725 void TROOT::SetStyle(
const char *stylename)
2727 TString style_name = stylename;
2729 TStyle *style = GetStyle(style_name);
2730 if (style) style->cd();
2731 else Error(
"SetStyle",
"Unknown style:%s",style_name.Data());
2741 Int_t TROOT::DecreaseDirLevel()
2743 return --fgDirLevel;
2749 Int_t TROOT::GetDirLevel()
2757 const char *TROOT::GetMacroPath()
2759 TString ¯oPath = ROOT::GetMacroPath();
2761 if (macroPath.Length() == 0) {
2762 macroPath = gEnv->GetValue(
"Root.MacroPath", (
char*)0);
2763 #if defined(R__WIN32)
2764 macroPath.ReplaceAll(
"; ",
";");
2766 macroPath.ReplaceAll(
": ",
":");
2768 if (macroPath.Length() == 0)
2769 #
if !defined(R__WIN32)
2770 macroPath =
".:" + TROOT::GetMacroDir();
2772 macroPath =
".;" + TROOT::GetMacroDir();
2783 void TROOT::SetMacroPath(
const char *newpath)
2785 TString ¯oPath = ROOT::GetMacroPath();
2787 if (!newpath || !*newpath)
2790 macroPath = newpath;
2809 void TROOT::SetWebDisplay(
const char *webdisplay)
2811 const char *wd = webdisplay;
2815 if (!strcmp(wd,
"off")) {
2816 fIsWebDisplay = kFALSE;
2817 fIsWebDisplayBatch = kFALSE;
2820 fIsWebDisplay = kTRUE;
2821 if (!strncmp(wd,
"batch", 5)) {
2822 fIsWebDisplayBatch = kTRUE;
2824 }
else if (!strncmp(wd,
"nobatch", 7)) {
2825 fIsWebDisplayBatch = kFALSE;
2828 fIsWebDisplayBatch = kFALSE;
2837 Int_t TROOT::IncreaseDirLevel()
2839 return ++fgDirLevel;
2845 void TROOT::IndentLevel()
2847 for (
int i = 0; i < fgDirLevel; i++) std::cout.put(
' ');
2853 void TROOT::Initialize() {
2860 Bool_t TROOT::Initialized()
2868 Bool_t TROOT::MemCheck()
2876 void TROOT::SetDirLevel(Int_t level)
2884 Int_t TROOT::ConvertVersionCode2Int(Int_t code)
2886 return 10000*(code>>16) + 100*((code&65280)>>8) + (code&255);
2892 Int_t TROOT::ConvertVersionInt2Code(Int_t v)
2895 int b = (v - a*10000)/100;
2896 int c = v - a*10000 - b*100;
2897 return (a << 16) + (b << 8) + c;
2903 Int_t TROOT::RootVersionCode()
2905 return ROOT_VERSION_CODE;
2914 const std::vector<std::string> &TROOT::AddExtraInterpreterArgs(
const std::vector<std::string> &args) {
2915 static std::vector<std::string> sArgs = {};
2916 sArgs.insert(sArgs.begin(), args.begin(), args.end());
2924 const char**& TROOT::GetExtraInterpreterArgs() {
2925 static const char** extraInterpArgs = 0;
2926 return extraInterpArgs;
2932 static Bool_t IgnorePrefix() {
2933 static Bool_t ignorePrefix = gSystem->Getenv(
"ROOTIGNOREPREFIX");
2934 return ignorePrefix;
2941 const TString& TROOT::GetRootSys() {
2944 const static TString rootsys = ROOT::FoundationUtils::GetRootSys();
2951 const TString& TROOT::GetBinDir() {
2953 if (IgnorePrefix()) {
2955 static TString rootbindir;
2956 if (rootbindir.IsNull()) {
2958 gSystem->PrependPathName(GetRootSys(), rootbindir);
2963 const static TString rootbindir = ROOTBINDIR;
2972 const TString& TROOT::GetLibDir() {
2974 if (IgnorePrefix()) {
2976 static TString rootlibdir;
2977 if (rootlibdir.IsNull()) {
2979 gSystem->PrependPathName(GetRootSys(), rootlibdir);
2984 const static TString rootlibdir = ROOTLIBDIR;
2993 const TString& TROOT::GetIncludeDir() {
2996 const static TString includedir = ROOT::FoundationUtils::GetIncludeDir();
3003 const TString& TROOT::GetEtcDir() {
3006 const static TString etcdir = ROOT::FoundationUtils::GetEtcDir();
3013 const TString& TROOT::GetDataDir() {
3015 if (IgnorePrefix()) {
3017 return GetRootSys();
3020 const static TString rootdatadir = ROOTDATADIR;
3029 const TString& TROOT::GetDocDir() {
3031 if (IgnorePrefix()) {
3033 return GetRootSys();
3036 const static TString rootdocdir = ROOTDOCDIR;
3045 const TString& TROOT::GetMacroDir() {
3047 if (IgnorePrefix()) {
3049 static TString rootmacrodir;
3050 if (rootmacrodir.IsNull()) {
3051 rootmacrodir =
"macros";
3052 gSystem->PrependPathName(GetRootSys(), rootmacrodir);
3054 return rootmacrodir;
3057 const static TString rootmacrodir = ROOTMACRODIR;
3058 return rootmacrodir;
3066 const TString& TROOT::GetTutorialDir() {
3068 if (IgnorePrefix()) {
3070 static TString roottutdir;
3071 if (roottutdir.IsNull()) {
3072 roottutdir =
"tutorials";
3073 gSystem->PrependPathName(GetRootSys(), roottutdir);
3078 const static TString roottutdir = ROOTTUTDIR;
3087 void TROOT::ShutDown()
3090 gROOT->EndOfProcessCleanups();
3091 else if (gInterpreter)
3092 gInterpreter->ShutDown();
3098 const TString& TROOT::GetSourceDir() {
3100 if (IgnorePrefix()) {
3102 static TString rootsrcdir;
3103 if (rootsrcdir.IsNull()) {
3105 gSystem->PrependPathName(GetRootSys(), rootsrcdir);
3110 const static TString rootsrcdir = ROOTSRCDIR;
3119 const TString& TROOT::GetIconPath() {
3121 if (IgnorePrefix()) {
3123 static TString rooticonpath;
3124 if (rooticonpath.IsNull()) {
3125 rooticonpath =
"icons";
3126 gSystem->PrependPathName(GetRootSys(), rooticonpath);
3128 return rooticonpath;
3131 const static TString rooticonpath = ROOTICONPATH;
3132 return rooticonpath;
3140 const TString& TROOT::GetTTFFontDir() {
3142 if (IgnorePrefix()) {
3144 static TString ttffontdir;
3145 if (ttffontdir.IsNull()) {
3146 ttffontdir =
"fonts";
3147 gSystem->PrependPathName(GetRootSys(), ttffontdir);
3152 const static TString ttffontdir = TTFFONTDIR;
3162 const char *TROOT::GetTutorialsDir() {
3163 return GetTutorialDir();