23 ROOT::Experimental::RDirectory &ROOT::Experimental::RDirectory::Heap()
25 static RDirectory heapDir;
30 namespace Experimental {
36 class RFileStorageInterface {
38 virtual void Flush() = 0;
39 virtual void Close() = 0;
40 virtual ~RFileStorageInterface() =
default;
41 virtual void WriteMemoryWithType(std::string_view name,
const void *address, TClass *cl) = 0;
46 class RFileSharedPtrCtor:
public ROOT::Experimental::RFile {
48 RFileSharedPtrCtor(std::unique_ptr<RFileStorageInterface> &&storage): RFile(std::move(storage)) {}
60 static void AddFilesToClose(std::weak_ptr<ROOT::Experimental::RFile> pFile)
63 std::vector<std::weak_ptr<ROOT::Experimental::RFile>> 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::RFileStorageInterface {
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; }
95 void WriteMemoryWithType(std::string_view name,
const void *address, TClass *cl)
final
97 fOldFile->WriteObjectAny(address, cl, std::string(name).c_str());
102 ROOT::Experimental::RFilePtr::RFilePtr(std::shared_ptr<ROOT::Experimental::RFile> &&file): fFile(std::move(file))
104 AddFilesToClose(fFile);
108 static std::string GetV6RFileOpts(
const char *mode,
const ROOT::Experimental::RFile::Options_t &opts)
110 std::string ret(mode);
111 if (opts.fCachedRead)
112 ret +=
" CACHEREAD ";
113 if (opts.fAsynchronousOpen && opts.fAsyncTimeout > 0)
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::RFileStorageInterface>
125 OpenV6RFile(std::string_view name,
const char *mode,
const ROOT::Experimental::RFile::Options_t &opts)
129 struct SetCacheDirRAII_t {
130 std::string fOldCacheDir;
131 std::lock_guard<std::mutex> fLock;
133 SetCacheDirRAII_t(
bool need): fLock(GetCacheDirMutex())
136 fOldCacheDir = ::TFile::GetCacheFileDir();
141 if (!fOldCacheDir.empty())
142 ::TFile::SetCacheFileDir(fOldCacheDir.c_str());
144 } setCacheDirRAII(opts.fCachedRead);
146 auto v6storage = std::make_unique<TV6Storage>(std::string(name), GetV6RFileOpts(mode, opts));
148 using namespace ROOT::Experimental::Internal;
149 return std::unique_ptr<RFileStorageInterface>{std::move(v6storage)};
153 ROOT::Experimental::RFilePtr ROOT::Experimental::RFile::Open(std::string_view name,
154 const Options_t &opts )
157 using namespace Internal;
158 auto file = std::make_shared<RFileSharedPtrCtor>(OpenV6RFile(name,
"READ", opts));
159 return ROOT::Experimental::RFilePtr(std::move(file));
162 ROOT::Experimental::RFilePtr ROOT::Experimental::RFile::Create(std::string_view name,
163 const Options_t &opts )
166 using namespace Internal;
167 auto file = std::make_shared<RFileSharedPtrCtor>(OpenV6RFile(name,
"CREATE", opts));
168 return ROOT::Experimental::RFilePtr(std::move(file));
171 ROOT::Experimental::RFilePtr ROOT::Experimental::RFile::Recreate(std::string_view name,
172 const Options_t &opts )
175 using namespace Internal;
176 auto file = std::make_shared<RFileSharedPtrCtor>(OpenV6RFile(name,
"RECREATE", opts));
177 return ROOT::Experimental::RFilePtr(std::move(file));
180 ROOT::Experimental::RFilePtr ROOT::Experimental::RFile::OpenForUpdate(std::string_view name,
181 const Options_t &opts )
184 using namespace Internal;
185 auto file = std::make_shared<RFileSharedPtrCtor>(OpenV6RFile(name,
"UPDATE", opts));
186 return ROOT::Experimental::RFilePtr(std::move(file));
189 std::string ROOT::Experimental::RFile::SetCacheDir(std::string_view path)
191 std::lock_guard<std::mutex> lock(GetCacheDirMutex());
193 std::string ret = ::TFile::GetCacheFileDir();
194 ::TFile::SetCacheFileDir(std::string(path).c_str());
198 std::string ROOT::Experimental::RFile::GetCacheDir()
200 std::lock_guard<std::mutex> lock(GetCacheDirMutex());
201 return ::TFile::GetCacheFileDir();
206 ROOT::Experimental::RFile::RFile(std::unique_ptr<ROOT::Experimental::Internal::RFileStorageInterface> &&storage)
207 : fStorage(std::move(storage))
212 ROOT::Experimental::RFile::~RFile() =
default;
214 void ROOT::Experimental::RFile::Flush()
218 void ROOT::Experimental::RFile::Close()
222 void ROOT::Experimental::RFile::WriteMemoryWithType(std::string_view name,
const void *address, TClass *cl)
224 fStorage->WriteMemoryWithType(name, address, cl);