41 class TFileOpenHandle;
43 class TFileCacheWrite;
48 class TFile :
public TDirectoryFile {
49 friend class TDirectoryFile;
50 friend class TFilePrefetch;
59 enum EAsyncOpenStatus { kAOSNotAsync = -1, kAOSFailure = 0,
60 kAOSInProgress = 1, kAOSSuccess = 2 };
62 enum EOpenTimeOut { kInstantTimeout = 0, kEternalTimeout = 999999999 };
65 enum ECacheAction { kDisconnect = 0, kDoNotDisconnect = 1 };
68 Double_t fSumBuffer{0};
69 Double_t fSum2Buffer{0};
70 Long64_t fBytesWrite{0};
71 Long64_t fBytesRead{0};
72 Long64_t fBytesReadExtra{0};
75 Long64_t fSeekFree{0};
76 Long64_t fSeekInfo{0};
83 Int_t fNProcessIDs{0};
88 TList *fFree{
nullptr};
89 TArrayC *fClassIndex{
nullptr};
90 TObjArray *fProcessIDs{
nullptr};
92 TArchiveFile *fArchive{
nullptr};
93 TFileCacheRead *fCacheRead{
nullptr};
94 TMap *fCacheReadMap{
nullptr};
95 TFileCacheWrite *fCacheWrite{
nullptr};
96 Long64_t fArchiveOffset{0};
97 Bool_t fIsArchive{kFALSE};
98 Bool_t fNoAnchorInName{kFALSE};
99 Bool_t fIsRootFile{kTRUE};
100 Bool_t fInitDone{kFALSE};
101 Bool_t fMustFlush{kTRUE};
102 Bool_t fIsPcmFile{kFALSE};
103 TFileOpenHandle *fAsyncHandle{
nullptr};
104 EAsyncOpenStatus fAsyncOpenStatus{kAOSNotAsync};
107 TList *fInfoCache{
nullptr};
108 TList *fOpenPhases{
nullptr};
111 static ROOT::TRWSpinLock fgRwLock;
112 std::mutex fWriteMutex;
113 static ROOT::Internal::RConcurrentHashColl fgTsSIHashes;
116 static TList *fgAsyncOpenRequests;
118 static TString fgCacheFileDir;
119 static Bool_t fgCacheFileDisconnected;
120 static Bool_t fgCacheFileForce;
121 static UInt_t fgOpenTimeout;
122 static Bool_t fgOnlyStaged ;
124 static std::atomic<Long64_t> fgBytesWrite;
125 static std::atomic<Long64_t> fgBytesRead;
126 static std::atomic<Long64_t> fgFileCounter;
127 static std::atomic<Int_t> fgReadCalls;
128 static Int_t fgReadaheadSize;
129 static Bool_t fgReadInfo;
131 virtual EAsyncOpenStatus GetAsyncOpenStatus() {
return fAsyncOpenStatus; }
132 virtual void Init(Bool_t create);
133 Bool_t FlushWriteCache();
134 Int_t ReadBufferViaCache(
char *buf, Int_t len);
135 Int_t WriteBufferViaCache(
const char *buf, Int_t len);
142 ROOT::Internal::RConcurrentHashColl::HashValue fHash;
145 virtual InfoListRet GetStreamerInfoListImpl(
bool lookupSICache);
148 Int_t MakeProjectParMake(
const char *packname,
const char *filename);
149 Int_t MakeProjectParProofInf(
const char *packname,
const char *proofinfdir);
152 virtual Int_t SysOpen(
const char *pathname, Int_t flags, UInt_t mode);
153 virtual Int_t SysClose(Int_t fd);
154 virtual Int_t SysRead(Int_t fd,
void *buf, Int_t len);
155 virtual Int_t SysWrite(Int_t fd,
const void *buf, Int_t len);
156 virtual Long64_t SysSeek(Int_t fd, Long64_t offset, Int_t whence);
157 virtual Int_t SysStat(Int_t fd, Long_t *
id, Long64_t *size, Long_t *flags, Long_t *modtime);
158 virtual Int_t SysSync(Int_t fd);
161 virtual Long64_t DirCreateEntry(TDirectory*) {
return 0; }
162 virtual Int_t DirReadKeys(TDirectory*) {
return 0; }
163 virtual void DirWriteKeys(TDirectory*) {}
164 virtual void DirWriteHeader(TDirectory*) {}
167 TFile(
const TFile &) =
delete;
168 void operator=(
const TFile &) =
delete;
170 static void CpProgress(Long64_t bytesread, Long64_t size, TStopwatch &watch);
171 static TFile *OpenFromCache(
const char *name, Option_t * =
"",
172 const char *ftitle =
"", Int_t compress = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault,
178 kRecovered = BIT(10),
179 kHasReferences = BIT(11),
181 kWriteError = BIT(14),
182 kBinaryFile = BIT(15),
183 kRedirected = BIT(16),
184 kReproducible = BIT(17)
186 enum ERelativeTo { kBeg = 0, kCur = 1, kEnd = 2 };
187 enum { kStartBigFile = 2000000000 };
189 enum EFileType { kDefault = 0, kLocal = 1, kNet = 2, kWeb = 3, kFile = 4, kMerge = 5 };
192 TFile(
const char *fname, Option_t *option=
"",
const char *ftitle=
"", Int_t compress = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault);
195 void Close(Option_t *option=
"")
override;
196 void Copy(TObject &)
const override { MayNotUse(
"Copy(TObject &)"); }
197 virtual Bool_t Cp(
const char *dst, Bool_t progressbar = kTRUE,UInt_t buffersize = 1000000);
198 virtual TKey* CreateKey(TDirectory* mother,
const TObject* obj,
const char* name, Int_t bufsize);
199 virtual TKey* CreateKey(TDirectory* mother,
const void* obj,
const TClass* cl,
200 const char* name, Int_t bufsize);
201 static TFile *&CurrentFile();
202 void Delete(
const char *namecycle=
"")
override;
203 void Draw(Option_t *option=
"")
override;
204 virtual void DrawMap(
const char *keys=
"*",Option_t *option=
"");
205 void FillBuffer(
char *&buffer)
override;
206 virtual void Flush();
207 TArchiveFile *GetArchive()
const {
return fArchive; }
208 Long64_t GetArchiveOffset()
const {
return fArchiveOffset; }
209 Int_t GetBestBuffer()
const;
210 virtual Int_t GetBytesToPrefetch()
const;
211 TFileCacheRead *GetCacheRead(
const TObject* tree =
nullptr)
const;
212 TFileCacheWrite *GetCacheWrite()
const;
213 TArrayC *GetClassIndex()
const {
return fClassIndex; }
214 Int_t GetCompressionAlgorithm()
const;
215 Int_t GetCompressionLevel()
const;
216 Int_t GetCompressionSettings()
const;
217 Float_t GetCompressionFactor();
218 virtual Long64_t GetEND()
const {
return fEND; }
219 virtual Int_t GetErrno()
const;
220 virtual void ResetErrno()
const;
221 Int_t GetFd()
const {
return fD; }
222 virtual const TUrl *GetEndpointUrl()
const {
return &fUrl; }
223 TObjArray *GetListOfProcessIDs()
const {
return fProcessIDs;}
224 TList *GetListOfFree()
const {
return fFree; }
225 virtual Int_t GetNfree()
const {
return fFree->GetSize(); }
226 virtual Int_t GetNProcessIDs()
const {
return fNProcessIDs; }
227 Option_t *GetOption()
const override {
return fOption.Data(); }
228 virtual Long64_t GetBytesRead()
const {
return fBytesRead; }
229 virtual Long64_t GetBytesReadExtra()
const {
return fBytesReadExtra; }
230 virtual Long64_t GetBytesWritten()
const;
231 virtual Int_t GetReadCalls()
const {
return fReadCalls; }
232 Int_t GetVersion()
const {
return fVersion; }
233 Int_t GetRecordHeader(
char *buf, Long64_t first, Int_t maxbytes,
234 Int_t &nbytes, Int_t &objlen, Int_t &keylen);
235 virtual Int_t GetNbytesInfo()
const {
return fNbytesInfo;}
236 virtual Int_t GetNbytesFree()
const {
return fNbytesFree;}
237 virtual TString GetNewUrl() {
return ""; }
238 Long64_t GetRelOffset()
const {
return fOffset - fArchiveOffset; }
239 virtual Long64_t GetSeekFree()
const {
return fSeekFree;}
240 virtual Long64_t GetSeekInfo()
const {
return fSeekInfo;}
241 virtual Long64_t GetSize()
const;
242 virtual TList *GetStreamerInfoList() final;
243 const TList *GetStreamerInfoCache();
244 virtual
void IncrementProcessIDs() { fNProcessIDs++; }
245 virtual Bool_t IsArchive()
const {
return fIsArchive; }
246 Bool_t IsBinary()
const {
return TestBit(kBinaryFile); }
247 Bool_t IsRaw()
const {
return !fIsRootFile; }
248 virtual Bool_t IsOpen()
const;
249 void ls(Option_t *option=
"")
const override;
250 virtual void MakeFree(Long64_t first, Long64_t last);
251 virtual void MakeProject(
const char *dirname,
const char *classes=
"*",
252 Option_t *option=
"new");
253 virtual void Map(Option_t *opt);
254 virtual void Map() { Map(
""); };
255 virtual Bool_t Matches(
const char *name);
256 virtual Bool_t MustFlush()
const {
return fMustFlush;}
257 void Paint(Option_t *option=
"")
override;
258 void Print(Option_t *option=
"")
const override;
259 virtual Bool_t ReadBufferAsync(Long64_t offs, Int_t len);
260 virtual Bool_t ReadBuffer(
char *buf, Int_t len);
261 virtual Bool_t ReadBuffer(
char *buf, Long64_t pos, Int_t len);
262 virtual Bool_t ReadBuffers(
char *buf, Long64_t *pos, Int_t *len, Int_t nbuf);
263 virtual void ReadFree();
264 virtual TProcessID *ReadProcessID(UShort_t pidf);
265 virtual void ReadStreamerInfo();
266 virtual Int_t Recover();
267 virtual Int_t ReOpen(Option_t *mode);
268 virtual void Seek(Long64_t offset, ERelativeTo pos = kBeg);
269 virtual void SetCacheRead(TFileCacheRead *cache, TObject* tree = 0, ECacheAction action = kDisconnect);
270 virtual void SetCacheWrite(TFileCacheWrite *cache);
271 virtual void SetCompressionAlgorithm(Int_t algorithm = ROOT::RCompressionSetting::EAlgorithm::kUseGlobal);
272 virtual void SetCompressionLevel(Int_t level = ROOT::RCompressionSetting::ELevel::kUseMin);
273 virtual void SetCompressionSettings(Int_t settings = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault);
274 virtual void SetEND(Long64_t last) { fEND = last; }
275 virtual void SetOffset(Long64_t offset, ERelativeTo pos = kBeg);
276 virtual void SetOption(Option_t *option=
">") { fOption = option; }
277 virtual void SetReadCalls(Int_t readcalls = 0) { fReadCalls = readcalls; }
278 virtual void ShowStreamerInfo();
279 Int_t Sizeof()
const override;
280 void SumBuffer(Int_t bufsize);
281 virtual Bool_t WriteBuffer(
const char *buf, Int_t len);
282 Int_t Write(
const char *name=
nullptr, Int_t opt=0, Int_t bufsiz=0)
override;
283 Int_t Write(
const char *name=
nullptr, Int_t opt=0, Int_t bufsiz=0)
const override;
284 virtual void WriteFree();
285 virtual void WriteHeader();
286 virtual UShort_t WriteProcessID(TProcessID *pid);
287 virtual void WriteStreamerInfo();
289 static TFileOpenHandle
290 *AsyncOpen(
const char *name, Option_t *option =
"",
291 const char *ftitle =
"", Int_t compress = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault,
293 static TFile *Open(
const char *name, Option_t *option =
"",
294 const char *ftitle =
"", Int_t compress = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault,
296 static TFile *Open(TFileOpenHandle *handle);
298 static EFileType GetType(
const char *name, Option_t *option =
"", TString *prefix =
nullptr);
300 static EAsyncOpenStatus GetAsyncOpenStatus(
const char *name);
301 static EAsyncOpenStatus GetAsyncOpenStatus(TFileOpenHandle *handle);
302 static const TUrl *GetEndpointUrl(
const char *name);
304 static Long64_t GetFileBytesRead();
305 static Long64_t GetFileBytesWritten();
306 static Int_t GetFileReadCalls();
307 static Int_t GetReadaheadSize();
309 static void SetFileBytesRead(Long64_t bytes = 0);
310 static void SetFileBytesWritten(Long64_t bytes = 0);
311 static void SetFileReadCalls(Int_t readcalls = 0);
312 static void SetReadaheadSize(Int_t bufsize = 256000);
313 static void SetReadStreamerInfo(Bool_t readinfo=kTRUE);
314 static Bool_t GetReadStreamerInfo();
316 static Long64_t GetFileCounter();
317 static void IncrementFileCounter();
319 static Bool_t SetCacheFileDir(ROOT::Internal::TStringView cacheDir, Bool_t operateDisconnected = kTRUE,
320 Bool_t forceCacheread = kFALSE)
321 {
return SetCacheFileDir(std::string_view(cacheDir), operateDisconnected, forceCacheread); }
322 static Bool_t SetCacheFileDir(std::string_view cacheDir, Bool_t operateDisconnected = kTRUE,
323 Bool_t forceCacheread = kFALSE);
324 static const char *GetCacheFileDir();
325 static Bool_t ShrinkCacheFileDir(Long64_t shrinkSize, Long_t cleanupInteval = 0);
326 static Bool_t Cp(
const char *src,
const char *dst, Bool_t progressbar = kTRUE,
327 UInt_t buffersize = 1000000);
329 static UInt_t SetOpenTimeout(UInt_t timeout);
330 static UInt_t GetOpenTimeout();
331 static Bool_t SetOnlyStaged(Bool_t onlystaged);
332 static Bool_t GetOnlyStaged();
334 ClassDefOverride(TFile,8)
338 #define gFile (TFile::CurrentFile())
340 #elif defined(__MAKECINT__)
342 R__EXTERN TFile *gFile;
350 class TFileOpenHandle :
public TNamed {
353 friend class TAlienFile;
359 TFile *fFile{
nullptr};
361 TFileOpenHandle(TFile *f) : TNamed(
"",
""), fOpt(
""), fCompress(ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault),
362 fNetOpt(0), fFile(f) { }
363 TFileOpenHandle(
const char *n,
const char *o,
const char *t, Int_t cmp,
364 Int_t no) : TNamed(n,t), fOpt(o), fCompress(cmp),
365 fNetOpt(no), fFile(nullptr) { }
366 TFileOpenHandle(
const TFileOpenHandle&) =
delete;
367 TFileOpenHandle& operator=(
const TFileOpenHandle&) =
delete;
369 TFile *GetFile()
const {
return fFile; }
372 ~TFileOpenHandle() { }
374 Bool_t Matches(
const char *name);
376 const char *GetOpt()
const {
return fOpt; }
377 Int_t GetCompress()
const {
return fCompress; }
378 Int_t GetNetOpt()
const {
return fNetOpt; }
382 inline Int_t TFile::GetCompressionAlgorithm()
const
384 return (fCompress < 0) ? -1 : fCompress / 100;
388 inline Int_t TFile::GetCompressionLevel()
const
390 return (fCompress < 0) ? -1 : fCompress % 100;
394 inline Int_t TFile::GetCompressionSettings()
const
396 return (fCompress < 0) ? -1 : fCompress;