110#define _XOPEN_SOURCE 600
119#include <sys/xattr.h>
124# include <sys/types.h>
129#include "RConfigure.h"
165#include "compiledata.h"
178#include <sys/extattr.h>
199#define getxattr(path, name, value, size) getxattr(path, name, value, size, 0u, 0)
202#define getxattr(path, name, value, size) extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, value, size)
211static struct AddPseudoGlobals {
228 Info(
"TFile",
"default ctor");
370 ::Fatal(
"TFile::TFile",
"ROOT system not initialized");
372 auto zombify = [
this] {
376 gROOT->GetListOfClosedObjects()->Add(
this);
385 if (strlen(
fUrl.GetProtocol()) != 0 && strcmp(
fUrl.GetProtocol(),
"file") != 0 && !
fOption.BeginsWith(
"NET") &&
388 "please use TFile::Open to access remote files:\n\tauto f = std::unique_ptr<TFile>{TFile::Open(\"%s\")};",
396 if (sfname1.Index(
"?") !=
kNPOS) {
397 TString s = sfname1(0, sfname1.Index(
"?"));
399 fNoAnchorInName = kTRUE;
406 fname1 =
fUrl.GetFile();
409 if (strstr(
fUrl.GetOptions(),
"filetype=raw"))
413 if (strstr(
fUrl.GetOptions(),
"filetype=pcm"))
416 if (
fUrl.HasOption(
"reproducible"))
435 fname1 =
fArchive->GetArchiveName();
438 if (!strlen(
fArchive->GetMemberName()))
443 if (
fOption.Contains(
"_WITHOUT_GLOBALREGISTRATION")) {
447 fList->UseRWLock(
false);
467 if (!create && !recreate && !
update && !read) {
474 if (!fname1 || !fname1[0]) {
475 Error(
"TFile",
"file name is not specified");
481 if (!strcmp(fname1,
"/dev/null") &&
493 if (!
gSystem->ExpandPathName(fname)) {
501 Error(
"TFile",
"error expanding path %s", fname1);
509 if(
auto name=
fUrl.GetValueFromOptions(
"reproducible")) {
517 SysError(
"TFile",
"could not delete %s (errno: %d)",
528 Error(
"TFile",
"file %s already exists", fname.
Data());
538 Error(
"TFile",
"no write permission, could not open file %s", fname.
Data());
545 Error(
"TFile",
"file %s does not exist", fname.
Data());
550 Error(
"TFile",
"no read permission, could not open file %s", fname.
Data());
564 SysError(
"TFile",
"file %s can not be opened", fname.
Data());
576 SysError(
"TFile",
"file %s can not be opened for reading", fname.
Data());
603 fList->Delete(
"slow");
617 gROOT->GetListOfClosedObjects()->Remove(
this);
628 Info(
"~TFile",
"dtor called for %s [%zx]",
GetName(),(
size_t)
this);
654 Error(
"Init",
"archive %s can only be opened in read mode",
GetName());
670 if (
fArchive->SetCurrentMember() != -1)
673 Error(
"Init",
"member %s not found in archive %s",
696 if (
gEnv->GetValue(
"TFile.v630forwardCompatibility", 0) == 1)
716 char *header =
new char[
kBEGIN+200];
721 Error(
"Init",
"%s failed to read the file type data.",
728 if (strncmp(header,
"root", 4)) {
734 char *buffer = header + 4;
737 frombuf(buffer, &headerLength);
740 Int_t send,sfree,sinfo;
763 Error(
"Init",
"file %s has an incorrect header length (%lld) or incorrect end of file length (%lld)",
775 Warning(
"Init",
"file %s probably not closed, cannot read free segments",
GetName());
780 char *buffer_keyloc =
nullptr;
785 Error(
"Init",
"file %s has an incorrect header length (%lld) or incorrect end of file length (%lld)",
792 header =
new char[nbytes];
797 Error(
"Init",
"%s failed to read the file header information at %lld (size=%d)",
803 buffer_keyloc = header;
806 buffer_keyloc = header+
fBEGIN;
809 frombuf(buffer,&version); versiondir = version%1000;
814 if (version > 1000) {
819 Int_t sdir,sparent,skeys;
824 if (versiondir > 1)
fUUID.ReadBuffer(buffer);
827 buffer_keyloc +=
sizeof(
Int_t);
829 frombuf(buffer_keyloc, &keyversion);
831 if (keyversion > 1000) {
840 fTitle.ReadBuffer(buffer_keyloc);
843 Error(
"Init",
"cannot read directory info of file %s",
GetName());
860 if (
gEnv->GetValue(
"TFile.v630forwardCompatibility", 0) == 1)
884 Error(
"Init",
"file %s is truncated at %lld bytes: should be %lld, "
887 Error(
"Init",
"file %s is truncated at %lld bytes: should be %lld",
893 Warning(
"Init",
"file %s probably not closed, "
894 "trying to recover",
GetName());
902 Warning(
"Init",
"successfully recovered %d keys", nrecov);
904 Warning(
"Init",
"no keys recovered, file has been made a Zombie");
912 gROOT->GetListOfFiles()->Add(
this);
918 Int_t lenIndex =
gROOT->GetListOfStreamerInfo()->GetSize()+1;
919 if (lenIndex < 5000) lenIndex = 5000;
926 gROOT->GetListOfFiles()->Remove(
this);
931 if (
fKeys->GetSize()) {
933 const auto separator =
fVersion < 63200 ?
"/" :
".";
934 const auto thisVersion =
gROOT->GetVersionInt();
935 const auto msg =
"no StreamerInfo found in %s therefore preventing schema evolution when reading this file. "
936 "The file was produced with ROOT version %d.%02d%s%02d, "
937 "while the current version is %d.%02d.%02d";
941 thisVersion / 10000, (thisVersion / 100) % (100), thisVersion % 100);
951 while ((key = (
TKey*)next())) {
962 gROOT->GetListOfClosedObjects()->Add(
this);
1010 while ((key = iter()) !=
nullptr) {
1068 gROOT->GetListOfFiles()->Remove(
this);
1069 gROOT->GetListOfBrowsers()->RecursiveRemove(
this);
1070 gROOT->GetListOfClosedObjects()->Add(
this);
1081 return new TKey(obj,
name, bufsize, mother);
1089 return new TKey(obj, cl,
name, bufsize, mother);
1101 static TFile *currentFile =
nullptr;
1114 Info(
"Delete",
"deleting name = %s", namecycle);
1144 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFileDrawMap"))) {
1145 if (
h->LoadPlugin() == -1)
1147 h->ExecPlugin(3,
this, keys, option);
1186 tobuf(buffer, version);
1201 Double_t result = mean + sqrt(rms2);
1202 if (result >= (
double)std::numeric_limits<Int_t>::max()) {
1203 return std::numeric_limits<Int_t>::max() -1;
1205 return (
Int_t)result;
1219 Int_t nbytes, objlen, nwh = 64;
1220 char *header =
new char[
fBEGIN];
1226 while (idcur <
fEND-100) {
1241 if (nbytes == 0)
break;
1247 if (!objlen) objlen = nbytes-keylen;
1249 uncomp += keylen + objlen;
1319 if (first <
fBEGIN)
return 0;
1320 if (first >
fEND)
return 0;
1322 Int_t nread = maxbytes;
1323 if (first+maxbytes >
fEND) nread =
fEND-maxbytes;
1325 Warning(
"GetRecordHeader",
"%s: parameter maxbytes = %d must be >= 4",
1331 Warning(
"GetRecordHeader",
"%s: failed to read header data (maxbytes = %d)",
1342 if (nb < 0)
return nread;
1344 const Int_t headerSize = 16;
1345 if (nread < headerSize)
return nread;
1350 if (!olen) olen = nbytes-klen;
1369 Error(
"GetSize",
"cannot stat the file %s",
GetName());
1395 TList *list =
nullptr;
1398 auto key = std::make_unique<TKey>(
this);
1400 auto buf = buffer.data();
1404 Warning(
"GetRecordHeader",
"%s: failed to read the StreamerInfo data from disk.",
1406 return {
nullptr, 1, hash};
1409 if (lookupSICache) {
1416 Info(
"GetStreamerInfo",
"The streamer info record for file %s has already been treated, skipping it.",
GetName());
1417 for(
auto uid : *si_uids)
1419 return {
nullptr, 0, hash};
1422 key->ReadKeyBuffer(buf);
1423 list =
dynamic_cast<TList*
>(key->ReadObjWithBuffer(buffer.data()));
1426 list = (
TList*)
Get(
"StreamerInfo");
1430 Info(
"GetStreamerInfoList",
"cannot find the StreamerInfo record in file %s",
1432 return {
nullptr, 1, hash};
1435 return {list, 0, hash};
1502 if(!newfree)
return;
1506 if (nbytesl > 2000000000) nbytesl = 2000000000;
1508 char buffer[
sizeof(
Int_t)];
1509 char *pbuffer = buffer;
1510 tobuf(pbuffer, nbytes);
1582 const bool forComp = options.
Contains(
"forcomp");
1583 const bool extended = options.
Contains(
"extended");
1585 const unsigned char nDigits = std::log10(
fEND) + 1;
1587 std::optional<ROOT::Detail::TKeyMapNode> lastNode;
1589 for (
const auto &key : tkeyInfos) {
1591 switch (key.fType) {
1593 Printf(
"Address = %" PRIu64
"\tNbytes = %u\t=====E R R O R=======", key.fAddr, key.fLen);
1597 Printf(
"Address = %" PRIu64
"\tNbytes = %d\t=====G A P===========", key.fAddr, -key.fLen);
1603 extrainfo.
Form(
" name: %-16s title: %s", key.fKeyName.c_str(), key.fKeyTitle.c_str());
1607 if (key.fObjLen !=
static_cast<Int_t>(key.fLen) - key.fKeyLen) {
1608 Float_t cx =
static_cast<float>(key.fObjLen + key.fKeyLen) / key.fLen;
1609 Printf(
"At:%-*" PRIu64
" N=%-8u K=%-3d O=%-8d %-14s CX = %5.2f %s", nDigits + 1, key.fAddr, key.fLen,
1610 key.fKeyLen, key.fObjLen, key.fClassName.c_str(), cx, extrainfo.
Data());
1612 Printf(
"At:%-*" PRIu64
" N=%-8u K=%-3d O=%-8d %-14s CX = 1 %s", nDigits + 1, key.fAddr, key.fLen,
1613 key.fKeyLen, key.fObjLen, key.fClassName.c_str(), extrainfo.
Data());
1618 if (key.fObjLen !=
static_cast<Int_t>(key.fLen) - key.fKeyLen) {
1619 Float_t cx =
static_cast<float>(key.fObjLen + key.fKeyLen) / key.fLen;
1620 Printf(
"%d/%06d At:%-*" PRIu64
" N=%-8u %-14s CX = %5.2f %s", date, time, nDigits + 1, key.fAddr,
1621 key.fLen, key.fClassName.c_str(), cx, extrainfo.
Data());
1623 Printf(
"%d/%06d At:%-*" PRIu64
" N=%-8u %-14s %s", date, time, nDigits + 1, key.fAddr,
1624 key.fLen, key.fClassName.c_str(), extrainfo.
Data());
1631 Int_t datime = lastNode ? lastNode->fDatime : 0;
1634 Printf(
"%d/%06d At:%-*lld N=%-8d %-14s", date, time, nDigits + 1,
fEND, 1,
"END");
1636 Printf(
"At:%-*lld N=%-8d K= O= %-14s", nDigits + 1,
fEND, 1,
"END");
1654 static constexpr int headerSize = 512;
1656 const std::uint64_t idcur =
fCurAddr;
1657 const std::uint64_t
end =
fFile->fEND;
1659 return std::nullopt;
1662 auto nread = headerSize;
1663 if (idcur + nread >=
end)
1664 nread =
end - idcur - 1;
1666 char header[headerSize];
1667 if (
fFile->ReadBuffer(header, nread)) {
1674 char *buffer = header;
1692 frombuf(buffer, &node.fKeyVersion);
1693 frombuf(buffer, &node.fObjLen);
1694 frombuf(buffer, &node.fDatime);
1695 frombuf(buffer, &node.fKeyLen);
1696 frombuf(buffer, &node.fCycle);
1697 if (node.fKeyVersion > 1000) {
1698 frombuf(buffer, &node.fSeekKey);
1699 frombuf(buffer, &node.fSeekPdir);
1704 node.fSeekKey =
static_cast<Long64_t>(skey);
1705 node.fSeekPdir =
static_cast<Long64_t>(sdir);
1708 const auto readString = [&buffer, &header](
bool skipCheck =
false) {
1709 std::uint8_t stringLenShort;
1710 std::uint32_t stringLen;
1711 if (!skipCheck && ((buffer - header) >= headerSize)) {
1714 frombuf(buffer, &stringLenShort);
1715 if (stringLenShort == 0xFF)
1718 stringLen = stringLenShort;
1720 if ((buffer - header) + stringLen > headerSize)
1721 stringLen = headerSize - (buffer - header);
1726 str = std::string(buffer, stringLen);
1727 buffer += stringLen;
1732 node.fClassName = readString(
true);
1734 if (idcur ==
static_cast<std::uint64_t
>(
fFile->fSeekFree))
1735 node.fClassName =
"FreeSegments";
1736 else if (idcur ==
static_cast<std::uint64_t
>(
fFile->fSeekInfo))
1737 node.fClassName =
"StreamerInfo";
1738 else if (idcur ==
static_cast<std::uint64_t
>(
fFile->fSeekKeys))
1739 node.fClassName =
"KeysList";
1741 node.fKeyName = readString();
1742 node.fKeyTitle = readString();
1801 Error(
"ReadBuffer",
"error reading all requested bytes from file %s, got %ld of %d",
1848 Error(
"ReadBuffer",
"error reading all requested bytes from file %s, got %ld of %d",
1878 for (
Int_t j = 0; j < nbuf; j++) {
1892 char *buf2 =
nullptr;
1895 cur =
pos[i]+len[i];
1898 if (bigRead || (i>=nbuf)) {
1917 for (
Int_t j=0;j<
n;j++) {
1918 memcpy(&buf[k],&buf2[
pos[i-
n+j]-curbegin],len[i-
n+j]);
1928 curbegin = i < nbuf ?
pos[i] : 0;
1931 if (buf2)
delete [] buf2;
1959 if (
fCacheWrite->ReadBuffer(buf, off, len) == 0) {
1981 if (fNbytesFree < 0 || fNbytesFree >
fEND) {
2017 snprintf(pidname,32,
"ProcessID%d",pidf);
2020 printf(
"ReadProcessID, name=%s, file=%s, pid=%zx\n",pidname,
GetName(),(
size_t)pid);
2029 TIter next(pidslist);
2105 Int_t nbytes,date,time,objlen,nwheader;
2108 char *buffer, *bufread;
2114 Error(
"Recover",
"cannot stat the file %s",
GetName());
2124 Int_t nread = nwheader;
2126 while (idcur <
fEND) {
2128 if (idcur+nread >=
fEND) nread =
fEND-idcur-1;
2131 Error(
"Recover",
"%s: failed to read the key data from disk at %lld.",
2139 Error(
"Recover",
"Address = %lld\tNbytes = %d\t=====E R R O R=======", idcur, nbytes);
2154 if (versionkey > 1000) {
2163 char *classname =
nullptr;
2164 if (nwhc <= 0 || nwhc > 100)
break;
2165 classname =
new char[nwhc+1];
2166 int i, nwhci = nwhc;
2167 for (i = 0;i < nwhc; i++)
frombuf(buffer, &classname[i]);
2168 classname[nwhci] =
'\0';
2172 && strcmp(classname,
"TBasket")) {
2175 if (!strcmp(key->
GetName(),
"StreamerInfo")) {
2187 delete [] classname;
2192 if (max_file_size <
fEND) max_file_size =
fEND+1000000000;
2199 if (nrecov)
Write();
2222 if (opt !=
"READ" && opt !=
"UPDATE") {
2223 Error(
"ReOpen",
"mode must be either READ or UPDATE, not %s", opt.
Data());
2230 if (opt ==
"READ") {
2266 SysError(
"ReOpen",
"file %s can not be opened in read mode",
GetName());
2288 SysError(
"ReOpen",
"file %s can not be opened in update mode",
GetName());
2297 Warning(
"ReOpen",
"file %s probably not closed, cannot read free segments",
GetName());
2318 Error(
"SetOffset",
"seeking from end in archive is not (yet) supported");
2342 Error(
"Seek",
"seeking from end in archive is not (yet) supported");
2346 if ((retpos =
SysSeek(
fD, offset, whence)) < 0)
2347 SysError(
"Seek",
"cannot seek to position %lld in file %s, retpos=%lld",
2374 if (level < 0) level = 0;
2375 if (level > 99) level = 99;
2430 if (cache) cache->
SetFile(
this, action);
2460 if (
b.IsReading()) {
2521 Error(
"Write const",
"A const TFile object should not be saved. We try to proceed anyway.");
2522 return const_cast<TFile*
>(
this)->
Write(
n, opt, bufsize);
2553 Error(
"WriteBuffer",
"error writing all requested bytes to file %s, wrote %ld of %d",
2578 if ((st =
fCacheWrite->WriteBuffer(buf, off, len)) < 0) {
2580 Error(
"WriteBuffer",
"error writing to cache");
2605 auto createKey = [
this]() {
2609 while ((afree = (
TFree*) next())) {
2610 nbytes += afree->
Sizeof();
2612 if (!nbytes)
return (
TKey*)
nullptr;
2618 return (
TKey*)
nullptr;
2623 TKey *key = createKey();
2640 char *
start = buffer;
2644 while ((afree = (
TFree*) next())) {
2649 auto actualBytes = buffer-
start;
2650 if ( actualBytes != nbytes ) {
2651 if (actualBytes < nbytes) {
2654 memset(buffer,0,nbytes-actualBytes);
2656 Error(
"WriteFree",
"The free block list TKey wrote more data than expected (%d vs %ld). Most likely there has been an out-of-bound write.",nbytes,(
long int)actualBytes);
2673 const char *root =
"root";
2674 char *psave =
new char[
fBEGIN];
2675 char *buffer = psave;
2677 memcpy(buffer, root, 4); buffer += 4;
2680 tobuf(buffer, version);
2682 if (version < 1000000) {
2686 tobuf(buffer, nfree);
2696 tobuf(buffer, nfree);
2706 fUUID.FillBuffer(buffer);
2707 Int_t nbytes = buffer - psave;
2785 void *dir =
gSystem->OpenDirectory(dirname);
2794 }
else if (opt.
Contains(
"recreate")) {
2797 if (
gSystem->mkdir(dirname) < 0) {
2798 Error(
"MakeProject",
"cannot create directory '%s'",dirname);
2804 const char *afile =
gSystem->GetDirEntry(dir);
2806 if (strcmp(afile,
".") == 0)
continue;
2807 if (strcmp(afile,
"..") == 0)
continue;
2808 dirpath.
Form(
"%s/%s",dirname,afile);
2816 Error(
"MakeProject",
"cannot create directory %s, already existing",dirname);
2820 if (
gSystem->mkdir(dirname) < 0) {
2821 Error(
"MakeProject",
"cannot create directory '%s'",dirname);
2834 if (filelist) filelist = (
TList*)filelist->
Clone();
2836 Error(
"MakeProject",
"file %s has no StreamerInfo",
GetName());
2840 TString clean_dirname(dirname);
2841 if (clean_dirname[clean_dirname.
Length()-1]==
'/') {
2843 }
else if (clean_dirname[clean_dirname.
Length()-1]==
'\\') {
2845 if (clean_dirname[clean_dirname.
Length()-1]==
'\\') {
2850 if (subdirname ==
"") {
2851 Error(
"MakeProject",
"Directory name must not be empty.");
2856 TString spath; spath.
Form(
"%s/%sProjectSource.cxx",clean_dirname.
Data(),subdirname.
Data());
2857 FILE *sfp = fopen(spath.
Data(),
"w");
2859 Error(
"MakeProject",
"Unable to create the source file %s.",spath.
Data());
2862 fprintf(sfp,
"namespace std {}\nusing namespace std;\n");
2863 fprintf(sfp,
"#include \"%sProjectHeaders.h\"\n\n",subdirname.
Data() );
2864 if (!
genreflex) fprintf(sfp,
"#include \"%sLinkDef.h\"\n\n",subdirname.
Data() );
2865 fprintf(sfp,
"#include \"%sProjectDict.cxx\"\n\n",subdirname.
Data() );
2866 fprintf(sfp,
"struct DeleteObjectFunctor {\n");
2867 fprintf(sfp,
" template <typename T>\n");
2868 fprintf(sfp,
" void operator()(const T *ptr) const {\n");
2869 fprintf(sfp,
" delete ptr;\n");
2870 fprintf(sfp,
" }\n");
2871 fprintf(sfp,
" template <typename T, typename Q>\n");
2872 fprintf(sfp,
" void operator()(const std::pair<T,Q> &) const {\n");
2873 fprintf(sfp,
" // Do nothing\n");
2874 fprintf(sfp,
" }\n");
2875 fprintf(sfp,
" template <typename T, typename Q>\n");
2876 fprintf(sfp,
" void operator()(const std::pair<T,Q*> &ptr) const {\n");
2877 fprintf(sfp,
" delete ptr.second;\n");
2878 fprintf(sfp,
" }\n");
2879 fprintf(sfp,
" template <typename T, typename Q>\n");
2880 fprintf(sfp,
" void operator()(const std::pair<T*,Q> &ptr) const {\n");
2881 fprintf(sfp,
" delete ptr.first;\n");
2882 fprintf(sfp,
" }\n");
2883 fprintf(sfp,
" template <typename T, typename Q>\n");
2884 fprintf(sfp,
" void operator()(const std::pair<T*,Q*> &ptr) const {\n");
2885 fprintf(sfp,
" delete ptr.first;\n");
2886 fprintf(sfp,
" delete ptr.second;\n");
2887 fprintf(sfp,
" }\n");
2888 fprintf(sfp,
"};\n\n");
2895 TIter flnext(filelist);
2902 if (strstr(info->
GetName(),
"@@")) {
2919 for(
auto rule : rules) {
2920 if( rule->IsRenameRule() || rule->IsAliasRule() )
2923 if ( rule->HasTarget( el->
GetName()) && rule->GetAttributes()[0] != 0 ) {
2924 TString attr( rule->GetAttributes() );
2941 list->AddAfter(alternate, info);
2942 list->Remove(alternate);
2950 TIter nextextra(&extrainfos);
2953 filelist->
Add(info);
2964 TIter subnext(list);
2976 if ( (sublen > len) && subinfo->
GetName()[len+1]==
':'
2979 subClasses.
Add(subinfo);
2984 subClasses.
Clear(
"nodelete");
2986 extrainfos.
Clear(
"nodelete");
2989 path.
Form(
"%s/%sProjectHeaders.h",clean_dirname.
Data(),subdirname.
Data());
2990 FILE *allfp = fopen(path,
"a");
2992 Error(
"MakeProject",
"Cannot open output file:%s\n",path.
Data());
2994 fprintf(allfp,
"#include \"%sProjectInstances.h\"\n", subdirname.
Data());
2998 printf(
"MakeProject has generated %d classes in %s\n",ngener,clean_dirname.
Data());
3009 FILE *fpMAKE =
nullptr;
3013 path.
Form(
"%s/makep.cmd",clean_dirname.
Data());
3015 path.
Form(
"%s/MAKEP",clean_dirname.
Data());
3018 fpMAKE = fopen(path,
"wb");
3020 fpMAKE = fopen(path,
"w");
3023 Error(
"MakeProject",
"cannot open file %s", path.
Data());
3031 FILE *ifp =
nullptr;
3032 path.
Form(
"%s/%sProjectInstances.h",clean_dirname.
Data(),subdirname.
Data());
3034 ifp = fopen(path,
"wb");
3036 ifp = fopen(path,
"w");
3039 Error(
"MakeProject",
"cannot open path file %s", path.
Data());
3048 fprintf(fpMAKE,
"genreflex %sProjectHeaders.h -o %sProjectDict.cxx --comments --iocomments %s ",subdirname.
Data(),subdirname.
Data(),
gSystem->GetIncludePath());
3049 path.
Form(
"%s/%sSelection.xml",clean_dirname.
Data(),subdirname.
Data());
3051 fprintf(fpMAKE,
"rootcling -v1 -f %sProjectDict.cxx %s ", subdirname.
Data(),
gSystem->GetIncludePath());
3052 path.
Form(
"%s/%sLinkDef.h",clean_dirname.
Data(),subdirname.
Data());
3058 FILE *fp = fopen(path,
"wb");
3060 FILE *fp = fopen(path,
"w");
3063 Error(
"MakeProject",
"cannot open path file %s", path.
Data());
3072 fprintf(fp,
"<lcgdict>\n");
3075 fprintf(fp,
"#ifdef __CLING__\n");
3087 if (strncmp(info->
GetName(),
"auto_ptr<", std::char_traits<char>::length(
"auto_ptr<")) == 0) {
3096 for(
auto rule : rules) {
3099 rule->AsString(strrule,
"x");
3102 selections.
Append(strrule);
3105 rule->AsString(strrule);
3106 if (strncmp(strrule.
Data(),
"type=",5)==0) {
3109 fprintf(fp,
"#pragma %s;\n",strrule.
Data());
3116 std::vector<std::string> inside;
3123 switch ( stlkind ) {
3127 what =
"std::pair<";
3137 tmp.
Form(
"<class name=\"%s\" />\n",
what.Data());
3141 tmp.
Form(
"template class %s;\n",
what.Data());
3146 what.ReplaceAll(
"std::",
"");
3149 fprintf(fp,
"#pragma link C++ class %s+;\n",
what.Data());
3157 tmp.
Form(
"<class name=\"%s\" />\n",key->
GetName());
3166 what.ReplaceAll(
"std::",
"");
3167 fprintf(fp,
"#pragma link C++ class %s+;\n",key->
GetName());
3178 tmp.
Form(
"<class name=\"%s\" />\n",
what.Data());
3182 if (
what[
what.Length()-1] ==
'>') {
3183 tmp.
Form(
"template class %s;\n",
what.Data());
3189 what.ReplaceAll(
"std::",
"");
3190 fprintf(fp,
"#pragma link C++ class %s+;\n",
what.Data());
3200 tmp.
Form(
"<class name=\"%s\" />\n",
what.Data());
3204 tmp.
Form(
"template class %s;\n",
what.Data());
3213 fprintf(ifp,
"#ifndef PROJECT_INSTANCES_H\n");
3214 fprintf(ifp,
"#define PROJECT_INSTANCES_H\n");
3215 fprintf(ifp,
"%s",instances.
Data());
3216 fprintf(ifp,
"#endif\n");
3217 fprintf(fp,
"%s",selections.
Data());
3218 fprintf(fp,
"</lcgdict>\n");
3220 fprintf(fp,
"#endif\n");
3232 object.Append(
gSystem->GetObjExt() );
3233 cmd.
ReplaceAll(
"$ObjectFiles",
object.Data());
3241 TString rootbuild = ROOTBUILD;
3243 sOpt =
gSystem->GetFlagsOpt();
3245 sOpt =
gSystem->GetFlagsDebug();
3247#if defined(_MSC_VER) && defined(_DEBUG)
3250 sOpt =
gSystem->GetFlagsDebug();
3255 fprintf(fpMAKE,
"-s %sSelection.xml \n",subdirname.
Data());
3257 fprintf(fpMAKE,
"%sProjectHeaders.h ",subdirname.
Data());
3258 fprintf(fpMAKE,
"%sLinkDef.h \n",subdirname.
Data());
3261 fprintf(fpMAKE,
"%s\n",cmd.
Data());
3263 printf(
"%s/MAKEP file has been generated\n", clean_dirname.
Data());
3268 if (!opt.
Contains(
"nocompilation")) {
3270 path =
gSystem->WorkingDirectory();
3273 gSystem->Exec(
"chmod +x MAKEP");
3274 int res = !
gSystem->Exec(
"./MAKEP");
3277 chmod(
"makep.cmd",00700);
3278 int res = !
gSystem->Exec(
"MAKEP");
3280 gSystem->ChangeDirectory(path);
3282 if (res) printf(
"Shared lib %s has been generated\n",path.
Data());
3287 if (res) printf(
"Shared lib %s has been dynamically linked\n",path.
Data());
3307 TList *list = listRetcode.fList;
3308 auto retcode = listRetcode.fReturnCode;
3321 if (version > 1000000) version -= 1000000;
3322 if (version < 53419 || (59900 < version && version < 59907)) {
3337 if (!base)
continue;
3348 std::vector<Int_t> si_uids;
3350 for (
int mode=0;mode<2; ++mode) {
3363 if (strcmp(obj->
GetName(),
"listOfRules")==0) {
3371 rulelnk = rulelnk->
Next();
3385 Warning(
"ReadStreamerInfo",
"The StreamerInfo for %s does not have a list of elements.",info->
GetName());
3390 Bool_t isstl = element && strcmp(
"This",element->
GetName())==0;
3392 if ( (!isstl && mode ==0) || (isstl && mode ==1) ) {
3398 if (uid >= asize && uid <100000)
fClassIndex->Set(2*asize);
3399 if (uid >= 0 && uid < fClassIndex->
GetSize()) {
3400 si_uids.push_back(uid);
3404 printf(
"ReadStreamerInfo, class:%s, illegal uid=%d\n",info->
GetName(),uid);
3417 fgTsSIHashes.Insert(listRetcode.fHash, std::move(si_uids));
3468 for (
Int_t i=0;i<npids;i++) {
3514 listOfRules.
SetName(
"listOfRules");
3515 std::set<TClass*> classSet;
3521 if (
gDebug > 0) printf(
" -class: %s info number %d saved\n",info->
GetName(),uid);
3527 if ( classSet.find( clinfo ) == classSet.end() ) {
3528 if (
gDebug > 0) printf(
" -class: %s stored the I/O customization rules\n",info->
GetName());
3535 listOfRules.
Add(obj);
3537 classSet.insert(clinfo);
3548 list.Add(&listOfRules);
3555 fKeys->Remove(&key);
3580 "you want to read through a cache, but you have no valid cache "
3581 "directory set - reading remotely");
3582 ::Info(
"TFile::OpenFromCache",
"set cache directory using TFile::SetCacheFileDir()");
3590 "you want to read through a cache, but you are reading "
3591 "local files - CACHEREAD disabled");
3598 cachefilepath += fileurl.
GetFile();
3599 cachefilepathbasedir =
gSystem->GetDirName(cachefilepath);
3600 if ((
gSystem->mkdir(cachefilepathbasedir,
kTRUE) < 0) &&
3602 ::Warning(
"TFile::OpenFromCache",
"you want to read through a cache, but I "
3603 "cannot create the directory %s - CACHEREAD disabled",
3604 cachefilepathbasedir.
Data());
3609 cachefilepath +=
"__";
3613 if (strstr(
name,
"zip=")) {
3618 Int_t optioncount = 0;
3627 if (optioncount!=0) {
3632 newoptions += value;
3642 cachefilepath +=
"__";
3643 cachefilepath += zipname;
3654 if (!
gSystem->GetPathInfo(cachefilepath, &
id, &
size, &flags, &modtime)) {
3657 char cacheblock[256];
3658 char remotblock[256];
3661 cfurl = cachefilepath;
3662 cfurl +=
"?filetype=raw";
3665 ropt +=
"&filetype=raw";
3678 ::Error(
"TFile::OpenFromCache",
3679 "cannot open the cache file to check cache consistency");
3684 ::Error(
"TFile::OpenFromCache",
3685 "cannot open the remote file to check cache consistency");
3692 if ((!cachefile->
ReadBuffer(cacheblock,256)) &&
3694 if (memcmp(cacheblock, remotblock, 256)) {
3695 ::Warning(
"TFile::OpenFromCache",
"the header of the cache file "
3696 "differs from the remote file - forcing an update");
3700 ::Warning(
"TFile::OpenFromCache",
"the header of the cache and/or "
3701 "remote file are not readable - forcing an update");
3716 const auto cachefilepathtmp = cachefilepath + std::to_string(
gSystem->GetPid()) +
".tmp";
3719 "you want to read through a cache, but I "
3720 "cannot make a cache copy of %s - CACHEREAD disabled",
3721 cachefilepathbasedir.
Data());
3725 if (
gSystem->AccessPathName(cachefilepath))
3726 gSystem->Rename(cachefilepathtmp, cachefilepath);
3728 gSystem->Unlink(cachefilepathtmp);
3731 ::Info(
"TFile::OpenFromCache",
"using local cache copy of %s [%s]",
name, cachefilepath.
Data());
3734 fileurl.
SetFile(cachefilepath);
3737 tagfile = cachefilepath;
3738 tagfile +=
".ROOT.cachefile";
3796 if (!url || strlen(url) <= 0) {
3797 ::Error(
"TFile::Open",
"no url specified");
3802 gSystem->ExpandPathName(expandedUrl);
3806 if (
gEnv->GetValue(
"TFile.CrossProtocolRedirects", 1) == 1) {
3809 ssize_t len = getxattr(fileurl.
GetFile(),
"eos.url.xroot",
nullptr, 0);
3811 std::string xurl(len, 0);
3812 std::string fileNameFromUrl{fileurl.
GetFile()};
3813 if (getxattr(fileNameFromUrl.c_str(),
"eos.url.xroot", &xurl[0], len) == len) {
3816 if (
auto baseName = fileNameFromUrl.substr(fileNameFromUrl.find_last_of(
"/") + 1);
3817 std::equal(baseName.crbegin(), baseName.crend(), xurl.crbegin())) {
3818 if ((
f =
TFile::Open(xurl.c_str(), options, ftitle, compress, netopt))) {
3819 if (!
f->IsZombie()) {
3840 TString sto = opts(ito + std::char_traits<char>::length(
"TIMEOUT="), opts.
Length());
3845 if (
gDebug > 0)
::Info(
"TFile::Open",
"timeout of %d millisec requested", toms);
3847 sto.
Insert(0,
"TIMEOUT=");
3865 ::Info(
"TFile::Open",
"waited %d millisec for asynchronous open", toms - xtms);
3867 ::Info(
"TFile::Open",
"timeout option not supported (requires asynchronous"
3872 ::Error(
"TFile::Open",
"timeout expired while opening '%s'", expandedUrl.
Data());
3879 ::Warning(
"TFile::Open",
"incomplete 'TIMEOUT=' option specification - ignored");
3885 const char *option = opts;
3888 TString namelist(expandedUrl);
3895 FILE *fout =
gSystem->TempFileName(outf);
3898 gSystem->RedirectOutput(outf,
"w", &rh);
3905 while (namelist.
Tokenize(
n, from,
"|") && !
f) {
3908 if (!strcasecmp(option,
"CACHEREAD") ||
3909 ((!strcasecmp(option,
"READ") || !strcasecmp(option,
"READ_WITHOUT_GLOBALREGISTRATION") || !option[0]) &&
3936 f = (
TFile*)
gROOT->ProcessLineFast(
TString::Format(
"new TParallelMergingFile(\"%s\",\"%s\",\"%s\",%d)",
n.Data(),option,ftitle,compress));
3940 TString lfname =
gEnv->GetValue(
"Path.Localroot",
"");
3949 lfname = urlname.
GetUrl();
3951 f =
new TFile(lfname.
Data(), option, ftitle, compress);
3956 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFile",
name))) {
3957 if (
h->LoadPlugin() == -1)
3959 f = (
TFile*)
h->ExecPlugin(5,
name.Data(), option, ftitle, compress, netopt);
3965 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFile",
name))) {
3966 if (
h->LoadPlugin() == -1)
3968 f = (
TFile*)
h->ExecPlugin(2,
name.Data(), option);
3974 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFile",
name)) &&
3975 h->LoadPlugin() == 0) {
3976 name.ReplaceAll(
"file:",
"");
3977 f = (
TFile*)
h->ExecPlugin(4,
name.Data(), option, ftitle, compress);
3979 f =
new TFile(
name.Data(), option, ftitle, compress);
3984 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFile",
name.Data()))) {
3985 if (
h->LoadPlugin() == -1)
3987 f = (
TFile *)
h->ExecPlugin(4,
name.Data(), option, ftitle, compress);
3997 if (
f &&
f->IsZombie()) {
4000 if( newUrl.
Length() && (newUrl !=
name) &&
gEnv->GetValue(
"TFile.CrossProtocolRedirects", 1) )
4009 gSystem->RedirectOutput(0,
"", &rh);
4020 f &&
f->IsWritable() && !
f->IsRaw()) {
4055 const char *ftitle,
Int_t compress,
4063 if (!url || strlen(url) <= 0) {
4064 ::Error(
"TFile::AsyncOpen",
"no url specified");
4070 gSystem->ExpandPathName(namelist);
4076 TString outf =
".TFileAsyncOpen_";
4077 FILE *fout =
gSystem->TempFileName(outf);
4080 gSystem->RedirectOutput(outf,
"w", &rh);
4087 while (namelist.
Tokenize(
n, from,
"|") && !
f) {
4102 if ((
h =
gROOT->GetPluginManager()->FindHandler(
"TFile",
name)) &&
4103 !strcmp(
h->GetClass(),
"TNetXNGFile")
4104 &&
h->LoadPlugin() == 0) {
4105 f = (
TFile*)
h->ExecPlugin(6,
name.Data(), option, ftitle, compress, netopt,
kTRUE);
4113 gSystem->RedirectOutput(0,
"", &rh);
4115 if (!notfound && !
f)
4160 if ((
f = fh->
GetFile()) && !(
f->IsZombie())) {
4162 Bool_t cr = (!strcmp(
f->GetOption(),
"CREATE") ||
4163 !strcmp(
f->GetOption(),
"RECREATE") ||
4174 if (
f)
f->fAsyncHandle = fh;
4186#if defined(R__WINGCC)
4189 return ::open(pathname, flags |
O_BINARY, mode);
4190#elif defined(R__SEEK64)
4191 return ::open64(pathname, flags, mode);
4193 return ::open(pathname, flags, mode);
4202 if (fd < 0)
return 0;
4211 return ::read(fd, buf, len);
4219 return ::write(fd, buf, len);
4230#if defined (R__SEEK64)
4231 return ::lseek64(fd, offset, whence);
4233 return ::_lseeki64(fd, offset, whence);
4235 return ::lseek(fd, offset, whence);
4262 return ::_commit(fd);
4340 ::Error(
"TFile::SetCacheFileDir",
"no sufficient permissions on cache directory %s or cannot create it",
TString(cachedir).Data());
4382 cachetagfile +=
".tag.ROOT.cache";
4383 if (!
gSystem->GetPathInfo(cachetagfile, &
id, &
size, &flags, &modtime)) {
4386 if (lastcleanuptime < cleanupinterval) {
4387 ::Info(
"TFile::ShrinkCacheFileDir",
"clean-up is skipped - last cleanup %lu seconds ago - you requested %lu", lastcleanuptime, cleanupinterval);
4393 cachetagfile +=
"?filetype=raw";
4394 TFile *tagfile =
nullptr;
4396 if (!(tagfile =
TFile::Open(cachetagfile,
"RECREATE"))) {
4397 ::Error(
"TFile::ShrinkCacheFileDir",
"cannot create the cache tag file %s", cachetagfile.
Data());
4405#if defined(R__WIN32)
4406 cmd =
"echo <TFile::ShrinkCacheFileDir>: cleanup to be implemented";
4407#elif defined(R__MACOSX)
4408 cmd.
Form(
"perl -e 'my $cachepath = \"%s\"; my $cachesize = %lld;my $findcommand=\"find $cachepath -type f -exec stat -f \\\"\\%%a::\\%%N::\\%%z\\\" \\{\\} \\\\\\;\";my $totalsize=0;open FIND, \"$findcommand | sort -k 1 |\";while (<FIND>) { my ($accesstime, $filename, $filesize) = split \"::\",$_; $totalsize += $filesize;if ($totalsize > $cachesize) {if ( ( -e \"${filename}.ROOT.cachefile\" ) || ( -e \"${filename}\" ) ) {unlink \"$filename.ROOT.cachefile\";unlink \"$filename\";}}}close FIND;' ",
fgCacheFileDir.Data(),shrinksize);
4410 cmd.
Form(
"perl -e 'my $cachepath = \"%s\"; my $cachesize = %lld;my $findcommand=\"find $cachepath -type f -exec stat -c \\\"\\%%x::\\%%n::\\%%s\\\" \\{\\} \\\\\\;\";my $totalsize=0;open FIND, \"$findcommand | sort -k 1 |\";while (<FIND>) { my ($accesstime, $filename, $filesize) = split \"::\",$_; $totalsize += $filesize;if ($totalsize > $cachesize) {if ( ( -e \"${filename}.ROOT.cachefile\" ) || ( -e \"${filename}\" ) ) {unlink \"$filename.ROOT.cachefile\";unlink \"$filename\";}}}close FIND;' ",
fgCacheFileDir.Data(),shrinksize);
4416 if ((
gSystem->Exec(cmd)) != 0) {
4417 ::Error(
"TFile::ShrinkCacheFileDir",
"error executing clean-up script");
4496 return fFile->Matches(url);
4497 }
else if (
fName.Length() > 0){
4543 Bool_t forceRemote =
gEnv->GetValue(
"Path.ForceRemote", 0);
4544 forceRemote = (forceRemote) ?
kTRUE :
gEnv->GetValue(
"TFile.ForceRemote", 0);
4547 forceRemote =
kTRUE;
4548 else if (opts.
Contains(
"remote=0"))
4557 if (fname[0] ==
'/') {
4559 lfname.
Form(
"%s%s", prefix->
Data(), fname);
4562 }
else if (fname[0] ==
'~' || fname[0] ==
'$') {
4565 lfname.
Form(
"%s/%s",
gSystem->HomeDirectory(), fname);
4574 if (!
gSystem->ExpandPathName(fn)) {
4580 if (localFile && prefix)
4587 }
else if (
TPMERegexp(
"^(http[s]?|s3http[s]?|[a]?s3|gs|gshttp[s]?){1}:",
"i").Match(
name)) {
4591 }
else if (!strncmp(
name,
"file:", 5)) {
4617 if (of && (of->
GetSize() > 0)) {
4620 while ((
f = (
TFile *)nxf()))
4621 if (
f->Matches(
name))
4622 return f->GetAsyncOpenStatus();
4634 if (handle && handle->
fFile) {
4664 if (of && (of->
GetSize() > 0)) {
4667 while ((
f = (
TFile *)nxf()))
4668 if (
f->Matches(
name))
4669 return f->GetEndpointUrl();
4673 return (
const TUrl *)
nullptr;
4681 fprintf(stderr,
"[TFile::Cp] Total %.02f MB\t|", (
Double_t)
size/1048576);
4683 for (
int l = 0;
l < 20;
l++) {
4685 if (
l < 20*bytesread/
size)
4686 fprintf(stderr,
"=");
4687 else if (
l == 20*bytesread/
size)
4688 fprintf(stderr,
">");
4689 else if (
l > 20*bytesread/
size)
4690 fprintf(stderr,
".");
4692 fprintf(stderr,
"=");
4698 fprintf(stderr,
"| %.02f %% [%.01f MB/s]\r",
4699 100.0*(
size?(bytesread/((
float)
size)):1), (lCopy_time>0.)?bytesread/lCopy_time/1048576.:0.);
4723 opt +=
"filetype=raw";
4727 char *copybuffer =
nullptr;
4729 TFile *sfile =
this;
4730 TFile *dfile =
nullptr;
4736 if (
gSystem->AccessPathName(ourl)) {
4746 ::Error(
"TFile::Cp",
"cannot open destination file %s", dst);
4752 rmdestiferror =
kTRUE;
4757 copybuffer =
new char[bufsize];
4759 ::Error(
"TFile::Cp",
"cannot allocate the copy buffer");
4764 Long64_t read, written, totalread, filesize, b00;
4774 if (progressbar)
CpProgress(totalread, filesize,watch);
4779 if (filesize - b1 > (
Long64_t)bufsize) {
4782 readsize = filesize - b1;
4785 if (readsize == 0)
break;
4791 if ((read <= 0) || readop) {
4792 ::Error(
"TFile::Cp",
"cannot read from source file %s. readsize=%lld read=%lld readop=%d",
4793 sfile->
GetName(), readsize, read, readop);
4800 if ((written != read) || writeop) {
4801 ::Error(
"TFile::Cp",
"cannot write %lld bytes to destination file %s", read, dst);
4805 }
while (read == (
Long64_t)bufsize);
4809 fprintf(stderr,
"\n");
4815 if (dfile) dfile->
Close();
4817 if (dfile)
delete dfile;
4818 if (copybuffer)
delete[] copybuffer;
4820 if (rmdestiferror && (success !=
kTRUE))
4838 TFile *sfile =
nullptr;
4844 ::Error(
"TFile::Cp",
"cannot open source file %s", src);
4846 success = sfile->
Cp(dst, progressbar, bufsize);
4861#if defined(R__neverLINUX) && !defined(R__WINGCC)
4873 int advice = POSIX_FADV_WILLNEED;
4878 advice = POSIX_FADV_NORMAL;
4882#if defined(R__SEEK64)
4883 Int_t result = posix_fadvise64(fD, offset, len, advice);
4885 Int_t result = posix_fadvise(fD, offset, len, advice);
4890 return (result != 0);
4912 return ((bytes < 0) ? 0 : bytes);
void frombuf(char *&buf, Bool_t *x)
void tobuf(char *&buf, Bool_t x)
T ReadBuffer(TBufferFile *buf)
One of the template functions used to read objects from messages.
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
TClass * IsA() const override
unsigned short UShort_t
Unsigned Short integer 2 bytes (unsigned short).
int Int_t
Signed integer 4 bytes (int).
short Version_t
Class version identifier (short).
int Ssiz_t
String size (currently int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
bool Bool_t
Boolean (0=false, 1=true) (bool).
short Short_t
Signed Short integer 2 bytes (short).
double Double_t
Double 8 bytes.
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
long long Long64_t
Portable signed long integer 8 bytes.
float Float_t
Float 4 bytes (float).
const char Option_t
Option string (const char).
Error("WriteTObject","The current directory (%s) is not associated with a file. The object (%s) has not been written.", GetName(), objname)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void SysError(const char *location, const char *msgfmt,...)
Use this function in case a system (OS or GUI) related error occurred.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
externTPluginManager * gPluginMgr
externTVirtualMutex * gROOTMutex
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
R__EXTERN void **(* gThreadTsd)(void *, Int_t)
externTVirtualMonitoringWriter * gMonitoringWriter
#define R__LOCKGUARD(mutex)
#define R__WRITE_LOCKGUARD(mutex)
#define R__READ_LOCKGUARD(mutex)
std::optional< TKeyMapNode > Next()
TIterator(TFile *file, std::uint64_t addr)
const TMatches FindRules(const TString &source) const
Return all the rules that are about the given 'source' class.
const TObjArray * GetRules() const
This class is a thread-safe associative collection connecting a 256 bits digest/hash to a collection ...
void AsString(TString &out, const char *options="") const
Add to the string 'out' the string representation of the rule.
static TArchiveFile * Open(const char *url, TFile *file)
Return proper archive file handler depending on passed url.
Array of chars or bytes (8 bits per element).
Buffer base class used for serializing objects.
TClass instances represent classes, structs and namespaces in the ROOT type system.
Bool_t IsSyntheticPair() const
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
Bool_t HasInterpreterInfo() const
const ROOT::Detail::TSchemaRuleSet * GetSchemaRules() const
Return the set of the schema rules if any.
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
static Bool_t AddRule(const char *rule)
Add a schema evolution customization rule.
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
Version_t GetClassVersion() const
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.
void SetName(const char *name)
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
TObject * Clone(const char *newname="") const override
Make a clone of an collection using the Streamer facility.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
static void GetDateTime(UInt_t datetime, Int_t &date, Int_t &time)
Static function that returns the date and time.
void Close(Option_t *option="") override
Delete all objects from memory and directory structure itself.
Bool_t cd() override
Change current directory to "this" directory.
Bool_t IsWritable() const override
void Delete(const char *namecycle="") override
Delete Objects or/and keys in a directory.
Int_t AppendKey(TKey *key) override
Int_t ReadKeys(Bool_t forceRead=kTRUE) override
TDatime fDatimeM
Date and time of last modification.
Int_t fNbytesKeys
Number of bytes for the keys.
Int_t GetNkeys() const override
Long64_t fSeekKeys
Location of Keys record on file.
Int_t Sizeof() const override
Return size of the TNamed part of the TObject.
Long64_t fSeekParent
Location of parent directory on file.
void BuildDirectoryFile(TFile *motherFile, TDirectory *motherDir)
Int_t Write(const char *name=nullptr, Int_t opt=0, Int_t bufsize=0) override
Write this object to the current directory.
Long64_t fSeekDir
Location of directory on file.
Int_t fNbytesName
Number of bytes in TNamed at creation time.
TDatime fDatimeC
Date and time when directory is created.
Bool_t fWritable
True if directory is writable.
Int_t WriteTObject(const TObject *obj, const char *name=nullptr, Option_t *option="", Int_t bufsize=0) override
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
void FillBuffer(char *&buffer) override
Encode TNamed into output buffer.
void SetWritable(Bool_t writable=kTRUE) override
TList * fKeys
Pointer to keys list in memory.
void ls(Option_t *option="") const override
List Directory contents.
TDirectory::TContext keeps track and restore the current directory.
virtual TList * GetList() const
TDirectory(const TDirectory &directory)=delete
void SetName(const char *newname) override
Set the name for directory If the directory name is changed after the directory was written once,...
TUUID fUUID
Unique identifier.
TList * fList
List of objects in memory.
A cache when reading files over the network.
virtual void Close(Option_t *option="")
Close out any threads or asynchronous fetches used by the underlying implementation.
virtual Int_t GetBufferSize() const
virtual void SetFile(TFile *file, TFile::ECacheAction action=TFile::kDisconnect)
Set the file using this cache and reset the current blocks (if any).
A cache when writing files over the network.
Class holding info about the file being opened.
TFile * fFile
TFile instance of the file being opened.
const char * GetOpt() const
Bool_t Matches(const char *name)
Return kTRUE if this async request matches the open request specified by 'url'.
Int_t GetCompress() const
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
static std::atomic< Long64_t > fgBytesRead
Number of bytes read by all TFile objects.
Int_t fReadCalls
Number of read calls ( not counting the cache calls ).
static void SetFileBytesWritten(Long64_t bytes=0)
static Bool_t fgCacheFileForce
Indicates, to force all READ to CACHEREAD.
Long64_t fBytesRead
Number of bytes read from this file.
virtual TProcessID * ReadProcessID(UShort_t pidf)
The TProcessID with number pidf is read from this file.
void ls(Option_t *option="") const override
List file contents.
ROOT::Detail::TKeyMapIterable WalkTKeys()
Traverses all TKeys in the TFile and returns information about them.
virtual void Seek(Long64_t offset, ERelativeTo pos=kBeg)
Seek to a specific position in the file. Pos it either kBeg, kCur or kEnd.
static Bool_t GetOnlyStaged()
Returns staged only flag.
static void IncrementFileCounter()
static Bool_t ShrinkCacheFileDir(Long64_t shrinkSize, Long_t cleanupInteval=0)
Try to shrink the cache to the desired size.
Long64_t fSeekFree
Location on disk of free segments structure.
static Int_t fgReadaheadSize
Readahead buffer size.
void FillBuffer(char *&buffer) override
Encode file output buffer.
Double_t fSum2Buffer
Sum of squares of buffer sizes of objects written so far.
static void SetReadaheadSize(Int_t bufsize=256000)
static Bool_t fgCacheFileDisconnected
Indicates, we trust in the files in the cache dir without stat on the cached file.
const TList * GetStreamerInfoCache()
Returns the cached list of StreamerInfos used in this file.
static Bool_t GetReadStreamerInfo()
If the streamerinfos are to be read at file opening.
TArchiveFile * fArchive
!Archive file from which we read this file
virtual Int_t SysSync(Int_t fd)
Interface to system fsync. All arguments like in POSIX fsync().
virtual Int_t ReOpen(Option_t *mode)
Reopen a file with a different access mode.
virtual void ReadStreamerInfo()
Read the list of StreamerInfo from this file.
virtual Bool_t Matches(const char *name)
Return kTRUE if 'url' matches the coordinates of this file.
virtual void SetCacheRead(TFileCacheRead *cache, TObject *tree=nullptr, ECacheAction action=kDisconnect)
Set a pointer to the read cache.
TArrayC * fClassIndex
!Index of TStreamerInfo classes written to this file
static Long64_t GetFileBytesWritten()
Static function returning the total number of bytes written to all files.
virtual InfoListRet GetStreamerInfoListImpl(bool lookupSICache)
See documentation of GetStreamerInfoList for more details.
static void SetReadStreamerInfo(Bool_t readinfo=kTRUE)
Specify if the streamerinfos must be read at file opening.
Bool_t fNoAnchorInName
!True if we don't want to force the anchor to be appended to the file name
static void SetFileBytesRead(Long64_t bytes=0)
Long64_t fSeekInfo
Location on disk of StreamerInfo record.
void Paint(Option_t *option="") override
Paint all objects in the file.
Int_t GetBestBuffer() const
Return the best buffer size of objects on this file.
TList * fOpenPhases
!Time info about open phases
virtual void SetCompressionLevel(Int_t level=ROOT::RCompressionSetting::ELevel::kUseMin)
See comments for function SetCompressionSettings.
TFileCacheWrite * GetCacheWrite() const
Return a pointer to the current write cache.
static void SetFileReadCalls(Int_t readcalls=0)
static TString fgCacheFileDir
Directory where to locally stage files.
virtual Int_t SysRead(Int_t fd, void *buf, Int_t len)
Interface to system read. All arguments like in POSIX read().
Int_t fVersion
File format version.
void Print(Option_t *option="") const override
Print all objects in the file.
static std::atomic< Long64_t > fgFileCounter
Counter for all opened files.
virtual EAsyncOpenStatus GetAsyncOpenStatus()
void Streamer(TBuffer &) override
Stream a TFile object.
static UInt_t GetOpenTimeout()
Returns open timeout (in ms).
static void CpProgress(Long64_t bytesread, Long64_t size, TStopwatch &watch)
Print file copy progress.
static Bool_t fgOnlyStaged
Before the file is opened, it is checked, that the file is staged, if not, the open fails.
virtual Int_t GetNProcessIDs() const
Bool_t fMustFlush
!True if the file buffers must be flushed
Int_t WriteBufferViaCache(const char *buf, Int_t len)
Write buffer via cache.
static Long64_t GetFileBytesRead()
Static function returning the total number of bytes read from all files.
Int_t ReadBufferViaCache(char *buf, Int_t len)
Read buffer via cache.
virtual TKey * CreateKey(TDirectory *mother, const TObject *obj, const char *name, Int_t bufsize)
Creates key for object and converts data to buffer.
virtual void WriteFree()
Write FREE linked list on the file.
static Int_t GetReadaheadSize()
Static function returning the readahead buffer size.
~TFile() override
File destructor.
virtual Bool_t ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf)
Read the nbuf blocks described in arrays pos and len.
static Long64_t GetFileCounter()
TMap * fCacheReadMap
!Pointer to the read cache (if any)
Long64_t fBEGIN
First used byte in file.
virtual UShort_t WriteProcessID(TProcessID *pid)
Check if the ProcessID pidd is already in the file, if not, add it and return the index number in the...
virtual void MakeProject(const char *dirname, const char *classes="*", Option_t *option="new")
Generate source code necessary to access the objects stored in the file.
friend class TDirectoryFile
Long64_t fArchiveOffset
!Offset at which file starts in archive
Int_t fNbytesInfo
Number of bytes for StreamerInfo record.
virtual Long64_t GetSize() const
Returns the current file size.
virtual Bool_t IsOpen() const
Returns kTRUE in case file is open and kFALSE if file is not open.
TFileOpenHandle * fAsyncHandle
!For proper automatic cleanup
static Bool_t SetOnlyStaged(Bool_t onlystaged)
Sets only staged flag.
virtual Bool_t Cp(const char *dst, Bool_t progressbar=kTRUE, UInt_t bufsize=1000000)
Allows to copy this file to the dst URL.
Int_t Write(const char *name=nullptr, Int_t opt=0, Int_t bufsize=0) override
Write memory objects to this file.
virtual Long64_t GetBytesRead() const
virtual Int_t GetErrno() const
Method returning errno.
virtual void SetCompressionSettings(Int_t settings=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault)
Used to specify the compression level and algorithm.
static Bool_t fgReadInfo
if true (default) ReadStreamerInfo is called when opening a file
virtual void Init(Bool_t create)
Initialize a TFile object.
TFile(const TFile &)=delete
Long64_t GetRelOffset() const
static TFileOpenHandle * AsyncOpen(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Submit an asynchronous open request.
virtual void SetCacheWrite(TFileCacheWrite *cache)
Set a pointer to the write cache.
TString fOption
File options.
virtual Bool_t WriteBuffer(const char *buf, Int_t len)
Write a buffer to the file.
void SumBuffer(Int_t bufsize)
Increment statistics for buffer sizes of objects in this file.
static const char * GetCacheFileDir()
Get the directory where to locally stage/cache remote files.
EAsyncOpenStatus
Asynchronous open request status.
virtual void WriteStreamerInfo()
Write the list of TStreamerInfo as a single object in this file The class Streamer description for al...
virtual Long64_t GetBytesWritten() const
Return the total number of bytes written so far to the file.
Int_t fCompress
Compression level and algorithm.
static TFile *& CurrentFile()
Return the current ROOT file if any.
virtual void SetCompressionAlgorithm(Int_t algorithm=ROOT::RCompressionSetting::EAlgorithm::kUseGlobal)
See comments for function SetCompressionSettings.
virtual const TUrl * GetEndpointUrl() const
Int_t fNbytesFree
Number of bytes for free segments structure.
static constexpr Version_t Class_Version()
virtual void ResetErrno() const
Method resetting the errno.
Int_t Sizeof() const override
Return the size in bytes of the file header.
Bool_t FlushWriteCache()
Flush the write cache if active.
virtual void IncrementProcessIDs()
Bool_t fIsPcmFile
!True if the file is a ROOT pcm file.
TFileCacheRead * fCacheRead
!Pointer to the read cache (if any)
virtual Int_t SysClose(Int_t fd)
Interface to system close. All arguments like in POSIX close().
TFile()
File default Constructor.
Char_t fUnits
Number of bytes for file pointers.
TObjArray * fProcessIDs
!Array of pointers to TProcessIDs
static EFileType GetType(const char *name, Option_t *option="", TString *prefix=nullptr)
Resolve the file type as a function of the protocol field in 'name'.
virtual void ShowStreamerInfo()
Show the StreamerInfo of all classes written to this file.
virtual Long64_t SysSeek(Int_t fd, Long64_t offset, Int_t whence)
Interface to system lseek.
virtual Int_t SysStat(Int_t fd, Long_t *id, Long64_t *size, Long_t *flags, Long_t *modtime)
Return file stat information.
virtual Int_t SysOpen(const char *pathname, Int_t flags, UInt_t mode)
Interface to system open. All arguments like in POSIX open().
ECacheAction
TTreeCache flushing semantics.
static UInt_t SetOpenTimeout(UInt_t timeout)
Sets open timeout time (in ms). Returns previous timeout value.
virtual void ReadFree()
Read the FREE linked list.
static ROOT::Internal::RConcurrentHashColl fgTsSIHashes
!TS Set of hashes built from read streamer infos
Long64_t fBytesReadExtra
Number of extra bytes (overhead) read by the readahead buffer.
Long64_t fBytesWrite
Number of bytes written to this file.
Bool_t fIsRootFile
!True is this is a ROOT file, raw file otherwise
virtual void Flush()
Synchronize a file's in-memory and on-disk states.
TList * fFree
Free segments linked list table.
virtual Bool_t ReadBufferAsync(Long64_t offs, Int_t len)
void Delete(const char *namecycle="") override
Delete Objects or/and keys in a directory.
Bool_t fInitDone
!True if the file has been initialized
virtual void DrawMap(const char *keys="*", Option_t *option="")
Draw map of objects in this file.
virtual void MakeFree(Long64_t first, Long64_t last)
Mark unused bytes on the file.
TFileCacheWrite * fCacheWrite
!Pointer to the write cache (if any)
TString fRealName
Effective real file name (not original url).
virtual void SetOffset(Long64_t offset, ERelativeTo pos=kBeg)
Set position from where to start reading.
Long64_t fOffset
!Seek offset cache
static std::atomic< Long64_t > fgBytesWrite
Number of bytes written by all TFile objects.
TList * fInfoCache
!Cached list of the streamer infos in this file
virtual Int_t GetBytesToPrefetch() const
Max number of bytes to prefetch.
static UInt_t fgOpenTimeout
Timeout for open operations in ms - 0 corresponds to blocking i/o.
Long64_t fEND
Last used byte in file.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
static Bool_t SetCacheFileDir(std::string_view cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Sets the directory where to locally stage/cache remote files.
EAsyncOpenStatus fAsyncOpenStatus
!Status of an asynchronous open request
bool fGlobalRegistration
! if true, bypass use of global lists
Double_t fSumBuffer
Sum of buffer sizes of objects written so far.
Bool_t fIsArchive
!True if this is a pure archive file
TObjArray * GetListOfProcessIDs() const
void Draw(Option_t *option="") override
Fill Graphics Structure and Paint.
void Close(Option_t *option="") override
Close a file.
TClass * IsA() const override
static std::atomic< Int_t > fgReadCalls
Number of bytes read from all TFile objects.
virtual Int_t Recover()
Attempt to recover file if not correctly closed.
virtual TList * GetStreamerInfoList() final
Read the list of TStreamerInfo objects written to this file.
virtual void WriteHeader()
Write File Header.
@ k630forwardCompatibility
static TFile * OpenFromCache(const char *name, Option_t *="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Open a file for reading through the file cache.
Int_t fNProcessIDs
Number of TProcessID written to this file.
Int_t fWritten
Number of objects written so far.
Int_t GetRecordHeader(char *buf, Long64_t first, Int_t maxbytes, Int_t &nbytes, Int_t &objlen, Int_t &keylen)
Read the logical record header starting at a certain postion.
virtual Bool_t ReadBuffer(char *buf, Int_t len)
Read a buffer from the file.
Float_t GetCompressionFactor()
Return the file compression factor.
virtual Int_t SysWrite(Int_t fd, const void *buf, Int_t len)
Interface to system write. All arguments like in POSIX write().
static Int_t GetFileReadCalls()
Static function returning the total number of read calls from all files.
TFileCacheRead * GetCacheRead(const TObject *tree=nullptr) const
Return a pointer to the current read cache.
Option_t * GetOption() const override
static TList * fgAsyncOpenRequests
Int_t Sizeof() const
return number of bytes occupied by this TFree on permanent storage
virtual void ReadBuffer(char *&buffer)
Decode one free structure from input buffer.
Long64_t GetFirst() const
virtual void FillBuffer(char *&buffer)
Encode fre structure into output buffer.
TFree * AddFree(TList *lfree, Long64_t first, Long64_t last)
Add a new free segment to the list of free segments.
static void MakeFunctor(const char *name, const char *type, GlobFunc &func)
Book space in a file, create I/O buffers, to fill them, (un)compress them.
void Delete(Option_t *option="") override
Delete an object from the file.
virtual Long64_t GetSeekKey() const
virtual const char * GetClassName() const
virtual Bool_t ReadFile()
Read the key structure from the file.
void ReadKeyBuffer(char *&buffer)
Decode input buffer.
virtual Int_t WriteFile(Int_t cycle=1, TFile *f=nullptr)
Write the encoded object supported by this key.
virtual char * GetBuffer() const
void Clear(Option_t *option="") override
Remove all objects from the list.
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
void Add(TObject *obj) override
virtual TObjLink * FirstLink() const
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
static void GenerateMissingStreamerInfos(TList *extrainfos, TStreamerElement *element)
Generate an empty StreamerInfo for types that are used in templates parameters but are not known in t...
static TString UpdateAssociativeToVector(const char *name)
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
virtual void FillBuffer(char *&buffer)
Encode TNamed into output buffer.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual Int_t Sizeof() const
Return size of the TNamed part of the TObject.
Iterator of object array.
TObject * Next() override
Return next object in array. Returns 0 when no more objects in array.
Int_t IndexOf(const TObject *obj) const override
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * UncheckedAt(Int_t i) const
void Add(TObject *obj) override
Wrapper around a TObject so it can be stored in a TList.
TObject * GetObject() const
Collectable string class.
Mother of all ROOT objects.
Bool_t TestBit(UInt_t f) const
virtual const char * GetName() const
Returns name of object.
virtual UInt_t GetUniqueID() const
Return the unique object id.
virtual void SysError(const char *method, const char *msgfmt,...) const
Issue system error message.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void SetUniqueID(UInt_t uid)
Set the unique object id.
@ kCanDelete
if object in a list can be deleted
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Wrapper for PCRE library (Perl Compatible Regular Expressions).
Int_t Match(const TString &s, UInt_t start=0)
Runs a match on s against the regex 'this' was created with.
A TProcessID identifies a ROOT job in a unique way in time and space.
Int_t IncrementCount()
Increase the reference count to this object.
void Clear(Option_t *option="") override
delete the TObjArray pointing to referenced objects this function is called by TFile::Close("R")
void CheckInit()
Initialize fObjects.
static TObjArray * GetPIDs()
static: returns array of TProcessIDs
static TProcessID * GetSessionProcessID()
static function returning the pointer to the session TProcessID
Int_t DecrementCount()
The reference fCount is used to delete the TProcessID in the TFile destructor when fCount = 0.
static TProcessID * GetPID()
static: returns pointer to current TProcessID
static Int_t IncreaseDirLevel()
Increase the indentation level for ls().
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
static Int_t DecreaseDirLevel()
Decrease the indentation level for ls().
Sequenceable collection abstract base class.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Continue()
Resume a stopped stopwatch.
void Stop()
Stop the stopwatch.
void SetBaseCheckSum(UInt_t cs)
Describe one element (data member) to be Streamed.
TClass * GetClass() const
Describes a persistent version of a class.
Int_t GetClassVersion() const override
Int_t GenerateHeaderFile(const char *dirname, const TList *subClasses=nullptr, const TList *extrainfos=nullptr) override
Generate header file for the class described by this TStreamerInfo the function is called by TFile::M...
Int_t GetNumber() const override
TClass * IsA() const override
TClass * GetClass() const override
TObjArray * GetElements() const override
UInt_t GetCheckSum() const override
void BuildCheck(TFile *file=nullptr, Bool_t load=kTRUE) override
Check if built and consistent with the class dictionary.
void ToLower()
Change string to lower-case.
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
TString & Insert(Ssiz_t pos, const char *s)
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
void Clear()
Clear string without changing its capacity.
const char * Data() const
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
TString & ReplaceAll(const TString &s1, const TString &s2)
void ToUpper()
Change string to upper case.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
virtual Int_t Sizeof() const
Returns size string will occupy on I/O buffer.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual void ReadBuffer(char *&buffer)
Read string from I/O buffer.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
static void ResetErrno()
Static function resetting system error number.
static Int_t GetErrno()
Static function returning system error number.
The TTimeStamp encapsulates seconds and ns since EPOCH.
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
void FillBuffer(char *&buffer)
Stream UUID into output buffer.
This class represents a WWW compatible URL.
const char * GetAnchor() const
const char * GetUrl(Bool_t withDeflt=kFALSE) const
Return full URL.
void SetAnchor(const char *anchor)
const char * GetFileAndOptions() const
Return the file and its options (the string specified behind the ?).
const char * GetFile() const
void SetProtocol(const char *proto, Bool_t setDefaultPort=kFALSE)
Set protocol and, optionally, change the port accordingly.
void SetOptions(const char *opt)
const char * GetHostFQDN() const
Return fully qualified domain name of url host.
const char * GetOptions() const
void SetHost(const char *host)
const char * GetProtocol() const
void SetFile(const char *file)
Abstract Interface class describing Streamer information for one class.
virtual Int_t GetClassVersion() const =0
externTVirtualRWMutex * gCoreMutex
ROOT::ESTLType STLKind(std::string_view type)
Converts STL container name to number.
bool IsStdPair(std::string_view name)
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
@ kUndefined
Undefined compression algorithm (must be kept the last of the list in case a new algorithm is added).
@ kUseMin
Compression level reserved when we are not sure what to use (1 is for the fastest compression).
Simple struct of the return value of GetStreamerInfoListImpl.