30 namespace Experimental {
36 class TFileStorageInterface {
38 virtual void Flush() = 0;
39 virtual void Close() = 0;
40 virtual ~TFileStorageInterface() =
default;
48 TFileSharedPtrCtor(std::unique_ptr<TFileStorageInterface> &&storage):
TFile(std::move(storage)) {}
60 static void AddFilesToClose(std::weak_ptr<ROOT::Experimental::TFile> pFile)
63 std::vector<std::weak_ptr<ROOT::Experimental::TFile>> fFiles;
67 for (
auto &wFile: fFiles) {
68 if (
auto sFile = wFile.lock()) {
74 static CloseFiles_t closer;
76 std::lock_guard<std::mutex> lock(closer.fMutex);
77 closer.fFiles.emplace_back(pFile);
83 class TV6Storage:
public ROOT::Experimental::Internal::TFileStorageInterface {
87 TV6Storage(
const std::string &
name,
const std::string &mode): fOldFile(::
TFile::Open(name.c_str(), mode.c_str())) {}
89 void Flush()
final { fOldFile->
Flush(); }
91 void Close()
final { fOldFile->
Close(); }
93 ~TV6Storage() {
delete fOldFile; }
97 fOldFile->WriteObjectAny(address, cl, std::string(name).c_str());
104 AddFilesToClose(
fFile);
110 std::string ret(mode);
112 ret +=
" CACHEREAD ";
114 ret +=
" TIMEOUT=" + std::to_string(opts.
fAsyncTimeout) +
" ";
118 static std::mutex &GetCacheDirMutex()
120 static std::mutex sMutex;
124 static std::unique_ptr<ROOT::Experimental::Internal::TFileStorageInterface>
129 struct SetCacheDirRAII_t {
130 std::string fOldCacheDir;
131 std::lock_guard<std::mutex> fLock;
133 SetCacheDirRAII_t(
bool need): fLock(GetCacheDirMutex())
141 if (!fOldCacheDir.empty())
146 auto v6storage = std::make_unique<TV6Storage>(std::string(name), GetV6TFileOpts(mode, opts));
149 return std::unique_ptr<TFileStorageInterface>{std::move(v6storage)};
157 using namespace Internal;
158 auto file = std::make_shared<TFileSharedPtrCtor>(OpenV6TFile(name,
"READ", opts));
166 using namespace Internal;
167 auto file = std::make_shared<TFileSharedPtrCtor>(OpenV6TFile(name,
"CREATE", opts));
175 using namespace Internal;
176 auto file = std::make_shared<TFileSharedPtrCtor>(OpenV6TFile(name,
"RECREATE", opts));
184 using namespace Internal;
185 auto file = std::make_shared<TFileSharedPtrCtor>(OpenV6TFile(name,
"UPDATE", opts));
191 std::lock_guard<std::mutex> lock(GetCacheDirMutex());
200 std::lock_guard<std::mutex> lock(GetCacheDirMutex());
201 return ::TFile::GetCacheFileDir();
207 : fStorage(
std::move(storage))
224 fStorage->WriteMemoryWithType(name, address, cl);
int fAsyncTimeout
Timeout for asynchronous opening.
std::unique_ptr< Internal::TFileStorageInterface > fStorage
Storage backend.
basic_string_view< char > string_view
Namespace for new ROOT classes and functions.
~TFile()
Must not call Write() of all attached objects: some might not be needed to be written or writing migh...
Options for TFile construction.
static TFilePtr OpenForUpdate(std::string_view name, const Options_t &opts=Options_t())
Open an existing file with name for reading and writing.
static Bool_t SetCacheFileDir(ROOT::Internal::TStringView cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
static TFilePtr Create(std::string_view name, const Options_t &opts=Options_t())
Open a file with name for reading and writing.
static std::string GetCacheDir()
Get the directory used for cached reads.
void Flush()
Save all objects associated with this directory (including file header) to the storage medium...
static TDirectory & Heap()
Dedicated, process-wide TDirectory.
bool fCachedRead
Whether the file should be cached before reading.
static TFilePtr Open(std::string_view name, const Options_t &opts=Options_t())
Open a file with name for reading.
The ROOT global object gROOT contains a list of all defined classes.
static TFilePtr Recreate(std::string_view name, const Options_t &opts=Options_t())
Open a file with name for reading and writing.
std::shared_ptr< TFile > fFile
void WriteMemoryWithType(std::string_view name, const void *address, TClass *cl)
Serialize the object at address, using the object's TClass.
Points to an object that stores or reads objects in ROOT's binary format.
Key/value store of objects.
static std::string SetCacheDir(std::string_view path)
Set the new directory used for cached reads, returns the old directory.
void Close()
Flush() and make the file non-writable: close it.
TFile(std::unique_ptr< Internal::TFileStorageInterface > &&storage)
TFilePtr(std::shared_ptr< TFile > &&)
Constructed by Open etc.
static const char * GetCacheFileDir()
Get the directory where to locally stage/cache remote files.
bool fAsynchronousOpen
Whether the file should be opened asynchronously, if available.